2014-01-08 74 views
1

我正試圖通過NLog數據庫目標將壓縮數據寫入日誌表。該記錄器失敗並顯示以下消息:將二進制數據寫入NLog數據庫目標

「不允許將數據類型nvarchar隱式轉換爲varbinary(max),使用CONVERT函數可以運行此查詢。

數據庫列被定義爲varbinary(max),並且添加到LogEventInfo屬性的數據是一個字節數組。我沒有看到NLog佈局渲染器,我可以告訴NLog我發送它的二進制數據。有任何想法嗎?

在此先感謝。

*** 請求的信息 ** * *

這是我的目標NLOG

<target type="Database" name="atom_db" connectionstring="Server=MYSERVER;Database=MYDB;Trusted_Connection=True;"> 
    <dbprovider>mssql</dbprovider> 
    <commandText>insert into TAtomLog ([requestdt], [sessionid], [clientip], [clientuser], [application], [method], [data]) values (@RequestDt, @SessionId, @ClientIP, @ClientUser, @SessionType, @Method, @Data);</commandText> 
    <parameter name="@RequestDt" layout="${event-context:item=RequestDt}"/> 
    <parameter name="@SessionId" layout="${event-context:item=${guid:SessionId}"/> 
    <parameter name="@ClientIP" layout="${event-context:item=ClientIP"/> 
    <parameter name="@ClientUser" layout="${event-context:item=ClientUser"/> 
    <parameter name="@SessionType" layout="${event-context:item=SessionType"/> 
    <parameter name="@Method" layout="${event-context:item=Method"/> 
    <parameter name="@Data" layout="${event-context:item=Data"/> 
    </target> 

這裏是創建LogEventInfo並呼籲我的C#代碼記錄器。到StringCompressor.CompressString回報「的byte []」

var ev = new LogEventInfo(LogLevel.Info, AtomLogger.LoggerName, string.Empty); 
    ev.Properties.Add("RequestDt", DateTime.Now); 
    ev.Properties.Add("ClientIP", clientip); 
    ev.Properties.Add("ClientUser", clientuser); 
    ev.Properties.Add("SessionId", sessionid); 
    ev.Properties.Add("SessionType", sessiontype); 
    ev.Properties.Add("Method", new StackFrame(1).GetMethod().Name); 
    ev.Properties.Add("Data", StringCompressor.CompressString(data)); 
    AtomLogger.GetDBLoggerInstance().Log(ev); 
+0

你能發佈一個基於你當前配置的樣本目標配置嗎?另外你如何設置LogEventInfo上的字節數組? – nemesv

+0

請參閱上面的要求數據。 – user481779

回答

2

你可以通過你的二進制數據作爲十六進制字符串和使用轉換函數的調用將字符串轉換爲二進制:


    var buffer = new byte[]; // your binary buffer 
    var stringToPassInDb = BitConverter.ToString(buffer).Replace("-", string.Empty); 
    var logInfo = new LogEventInfo(LogLevel.Info, null, null); 
    logInfo.Properties["Data"] = stringToPassInDb; 
    _logger.Log(logInfo); 

和SQL命令Nlog.config應該是simular:

<commandText> 
    insert into dbo.Log 
    (
    log_date, log_level, log_message, 
    log_machine_name, log_user_name, 
    entity_id, command, data 
    ) 
    values 
    (
    @time_stamp, @level, @message, 
    @machinename, @user_name, 
    @entity_id, @command, convert(varbinary(max), @data, 2) 
    ); 
    </commandText> 
    <parameter name="@time_stamp" layout="${date:universalTime=true:format=yyyyMMdd HH\:mm\:ss"/> 
    <parameter name="@level" layout="${level}"/> 
    <parameter name="@message" layout="${message}"/> 
    <parameter name="@machinename" layout="${machinename}"/> 
    <parameter name="@user_name" layout="${windows-identity:domain=true}"/> 
    <parameter name="@entity_id" layout="${event-properties:item=EntityId}" /> 
    <parameter name="@command" layout="${event-properties:item=Command}" /> 
    <parameter name="@data" layout="${event-properties:item=Data}" />