2014-10-28 3 views
1

Я внедрил пользовательский appender, наследуя от AppenderSkeleton. Экземпляр моего регистратора создается правильно, и при регистрации метода «Добавить» вызывается, но сообщение не отформатировано правильно. Я попробовал несколько разных способов, передав экземпляр StreamWriter, но все обращения к нему не могут быть записаны в поток. Другая вещь, которую я пробовал, - это использование свойства RenderedMessage, но возвращаемое значение является точным сообщением без форматирования макета.log4net пользовательский формат сообщения appender игнорируется

protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
{ 
    StreamWriter _writer = new StreamWriter(new MemoryStream()); 
    RenderLoggingEvent(_writer, loggingEvent); 
    //After writing the logging event the base stream position remains 0 
    byte[] messageBuffer = new byte[_writer.BaseStream.Position]; 
    _writer.BaseStream.Read(messageBuffer, 0, messageBuffer.Length); 

    //Also trying to read from a stream reader created from the base stream fails 
    var reader = new StreamReader(_writer.BaseStream); 
    var test = reader.ReadToEnd(); 

    //variable test is not formatted correctly according to the conversion pattern 
    test = loggingEvent.RenderedMessage; 
} 

<appender name="TestAppender" type="log4netTestApp"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="[%date]-[%thread]-[%level]-[%logger] - %message%newline" /> 
    </layout> 
</appender> 

Любые идеи относительно того, что не так?

Изменение из потока памяти в поток файлов имеет правильный формат, поэтому он должен быть чем-то с использованием потока памяти.

+0

Проконсультируйтесь с справочником 'log4net'. Я уверен, что он дает множество примеров того, как настроить appender. – MethodMan

+0

. Ваша проблема в том, что вы пишете в MemoryStream, который затем не доступен. – stuartd

+0

Я обновил его с помощью попытка чтения из базового потока, но позиция никогда не увеличивается. –

ответ

0

Похоже, мне нужно было смыть _writer. Как только это было сделано, я получил правильную позицию потока и все форматирование присутствовало.