2017-01-29 45 views
1

ログファイルにjsonを作成すると主張するlog4netの拡張がいくつか見られましたが、フォーマットは決して有効ではありません。つまり、コレクションは配列ではなく、昏睡区切りではありません。私はそれを間違って使っているのですか、それともjsonでlog4netを使用する方法がありませんか?log4net出力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> 

出力は次のとおりです。近いですが、JSON本当に有効ではありません

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

答えて

1

解決策は十分に基本的ですが、私は自分自身で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; 
    } 
} 
+0

これは素晴らしい解決策です! log4netはまだ積極的に管理されていますか、そこに持っていればうれしいです。 –

1

1行ログと同じように、各行を別々のJSONレコードとして出力します。 行ごとに解析して解析することもできますし、それぞれの後ろに[]とカンマを追加することもできます。

+0

のサンプル呼び出しです事実の後にファイルを反復して再解析すると、目的を破ることができます。 – Wobbles

+1

あなたは正しい@Wobblesですが、ログはオープン・ライト・クローズ・ストリームなので、そのようなものでも難しいので、ファイルがメモリ内になければjson形式を維持するのは難しいと思います。レコードがあるたびにオーバーライドされます書きました。 – MoustafaS

+0

ILogのコレクションを直接シリアル化する方法があるかどうかは分かりませんでした。 – Wobbles

0

ダウンロードlog4net.Ext.Json nuget package

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

を以下のコンフィグ設定を追加し、私はまだ持っている場合はninject

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