log4net可以输出Json吗?

Wob*_*les 8 c# wpf log4net json

我已经看到了几个声称为日志文件创建json的log4net扩展,但格式永远不会是有效的json,这意味着该集合不在数组中而不是以逗号分隔.我使用它错了还是没有办法使用json的log4net?

<appender name="SessionFileAppender" type="log4net.Appender.FileAppender">
  <file value="Session.log" />
  <appendToFile value="false" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type='log4net.Layout.SerializedLayout, log4net.Ext.Json'>
    <decorator type='log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json' />
    <default />
    <remove value='message' />
    <member value='message:messageobject' />
  </layout>
</appender>
Run Code Online (Sandbox Code Playgroud)

输出是:

{"date":"2017-01-29T13:45:50.7345813-05:00","level":"DEBUG","appname":"MyApp.vshost.exe","logger":"MainWindow","thread":"9","ndc":"(null)","message":"Loading new UI instance"}
{"date":"2017-01-29T13:45:50.7380842-05:00","level":"DEBUG","appname":"MyApp.vshost.exe","logger":"MainWindow","thread":"9","ndc":"(null)","message":"Loading internal localization file"}
{"date":"2017-01-29T13:45:50.7510970-05:00","level":"DEBUG","appname":"MyApp.vshost.exe","logger":"MainWindow","thread":"9","ndc":"(null)","message":"Initializing UI"}
Run Code Online (Sandbox Code Playgroud)

这是接近但不是真正有效的json.

oet*_*tzi 7

下载log4net.Ext.Json nuget包

将以下配置设置添加到app.config/web.config文件

<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
  <file value="logs\log-file-name.json" />
  <rollingStyle value="Date" />
  <datePattern value="yyyy-MM-dd" />
  <PreserveLogFileNameExtension value="true" />
  <staticLogFileName value="false" />
  <appendToFile value="true" />
  <maxSizeRollBackups value="10" />
  <dateTimeStrategy 
  type="log4net.Appender.RollingFileAppender+UniversalDateTime" />

  <!--text formatted log4net logging-->
  <!--<layout type="log4net.Layout.PatternLayout">
    --><!--check conversion patterns from 
   https://logging.apache.org/log4net/--><!--
    --><!--<conversionPattern value="%utcdate{ABSOLUTE} UTC %c{1} - %m%n" 
  />--><!--
    <conversionPattern value="%date [%thread] %-5level %logger - 
  %message%newline" />
  </layout>-->

  <!--json formatted log4net logging-->
  <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
    <decorator type="log4net.Layout.Decorators.StandardTypesDecorator, 
  log4net.Ext.Json" />
    <member value="date:date" />
    <member value="level:level" />
    <member value="logger:logger" />
    <member value="message:messageObject" />
    <member value="exception:exception" />
  </layout>
</appender>
<root>
  <!--Options are "ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" and 
"OFF".-->
  <level value="DEBUG" />
  <appender-ref ref="RollingFile" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)

这是一个使用ninject的示例调用

Kernel = new StandardKernel(); 
Kernel.Bind<ILog>().ToMethod(c => 
LogManager.GetLogger(typeof(YourClassName))).InSingletonScope();
var log = Kernel.Get<ILog>();
log.debug("testing log4net json");
Run Code Online (Sandbox Code Playgroud)


Wob*_*les 4

该解决方案很基本,我自己编写了Appender一个将数据存储在集合中的解决方案,然后根据需要使用 Json.net 序列化该集合。这也使我能够在应用程序中查看日志并绑定到它,因此增加了额外的好处。

public class CollectionAppender : AppenderSkeleton
{
    public static ObservableCollection<LogItem> logData = new ObservableCollection<LogItem>();
    protected override void Append(LoggingEvent loggingEvent)
    {
        logData.Add(new LogItem(loggingEvent));
    }
}

public class LogItem
{
    public string Logger { get; private set; }
    public string Level { get; private set; }
    public string Message { get; private set; }
    public DateTime Timestamp { get; private set; }
    public Exception ExceptionData { get; private set; }

    public bool ShouldSerializeExceptionData() //This keeps things tidy when using Json.net for non exemption entries.
    {
        return ExceptionData != null;
    }

    public LogItem(LoggingEvent data)
    {
        Logger = data.LoggerName;
        Level = data.Level.DisplayName;
        Message = data.RenderedMessage;
        Timestamp = data.TimeStamp;
        ExceptionData = data.ExceptionObject;
    }
}
Run Code Online (Sandbox Code Playgroud)