2017-01-29 2 views
1

Ich habe einige Erweiterungen für log4net gesehen, die behaupten, json für die Protokolldatei zu erstellen, aber das Format ist niemals gültig, dh die Sammlung befindet sich nicht in einem Array und ist nicht durch Koma getrennt. Verwende ich es falsch oder gibt es einfach keine Möglichkeit log4net mit json zu benutzen?Kann log4net Ausgabe Json?

<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> 

Ausgang ist:

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

die in der Nähe ist, aber nicht wirklich gültig json.

Antwort

1

Die Lösung ist einfach genug, ich schrieb meine eigenen Appender, die Daten in einer Sammlung gespeichert, dann die Sammlung mit Json.net bei Bedarf serialisiert. Dies gibt mir auch die Möglichkeit, das Log in der App zu sehen und sich daran zu binden sowie einen zusätzlichen Bonus.

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; 
    } 
} 
+0

Das ist eine schöne Lösung! Wird log4net immer noch aktiv gepflegt, wäre es schön, es da drin zu haben - vielleicht ein Beitrag dazu? –

1

Es gibt jede Zeile als separaten JSON-Datensatz aus, wie bei 1 Zeilenprotokollen. Sie können Zeile für Zeile und analysieren, oder Sie können Ihre Umgebung [] und einen Comman nach jedem} hinzufügen und das würde es tun.

+0

Wenn ich noch haben um eine Datei nach der Tat zu iterieren und erneut zu analysieren, dann vereitelt sie den Zweck irgendwie. – Wobbles

+1

Sie sind richtig @Wobbles, aber seine Art von schwer sogar für sie seit Logs Open-Write-Close-Streams, so denke ich, es wird schwierig sein, das JSON-Format zu pflegen, es sei denn, die Datei ist im Speicher und wird überschrieben jedes Mal, wenn ein Datensatz ist geschrieben. – MoustafaS

+0

dachte nicht, krank, wenn es eine Möglichkeit gibt, die ILog Sammlung dann bei Bedarf zu serialisieren – Wobbles

0

herunterladen log4net.Ext.Json nuget package

add folgenden Konfigurationseinstellungen app.config/web.config-Dateien

<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> 

hier ist ein Beispielaufruf mit ninject

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