2014-01-08 1 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> 

Вот мой C# код, который создает LogEventInfo и вызовы Логгер. Вызов StringCompressor.CompressString возвращает «байт []»

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 должен быть образным:

<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}" />