Я реализовал пользовательский appender, наследуя от AppenderSkeleton. Экземпляр моего регистратора создается правильно, и при регистрации метода "Добавить" вызывается, но сообщение не отформатировано правильно. Я попробовал несколько разных способов, передав экземпляр StreamWriter, но все обращения к нему не могут быть записаны в поток. Другая вещь, которую я пробовал, - это использование свойства RenderedMessage, но возвращаемое значение является точным сообщением без форматирования макета.
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>
Какие-нибудь идеи относительно того, что не так?
Переход из потока памяти в поток файлов имеет правильный макет, поэтому он должен быть чем-то с использованием потока памяти.
Похоже, мне нужно было сбросить _writer. Как только это было сделано, я получил правильную позицию потока и все форматирование присутствовало.
log4net
Я уверен, что в нем приведено множество примеров по настройке приложения.