2016-05-30 5 views
3

開発者がNLogを使用してオブジェクトをJSONとしてログに記録できるようにします。これを行うには、nLogに送信する前に、またはターゲットに送信する前に、いくつかのロジックを実装する必要があります。ログに記録する前にNLogのレベルを確認しますか?

私は自分でTarget(TargetWithLayout)をビルドできますが、この特定のターゲット/ロガーの設定からログレベルを確認する方法はありませんか?もう1つの欠点は、使用する各ターゲット(EventLog、File、WebServiceなど)に対して新しいTargetWithLayoutクラスを作成する必要があることです。

もう1つの解決策は、NLogを使用する私のLogHandlerで行うことです。オブジェクトを翻訳する必要があるかどうかを知る唯一の方法は、設定ファイルからすべてのロガーを読み取ることです。もしそれらのオブジェクトがログオブジェクトに設定されていれば、それを直列化します。私はLogHandlerからこの情報を確認できるかどうかはわかりません(手動では行いません)。あなたはログファイルをあなたにJSONを書くためにNLogのJSONのレイアウトを使用することができます

答えて

1

あなたは、アクティブなログ・ルールを照会するNLog-Loggerオブジェクトを使用することができます。

if (myLogger.IsTraceEnabled) 
    myLogger.Trace("Hello World"); 
1

、シリアライズを自分でチェックしてくださいする必要:

<target name="jsonFile" xsi:type="File" fileName="${logFileNamePrefix}.json"> 
     <layout xsi:type="JsonLayout"> 
       <attribute name="time" layout="${longdate}" /> 
       <attribute name="level" layout="${level:upperCase=true}"/> 
       <attribute name="message" layout="${message}" /> 
     </layout> 
</target> 

ログメッセージの書式ではなく、それを自分で行うのNLogによって処理されません。

release notes nlog

+0

ログに送信する必要があるオブジェクトが1つしかない場合は、いいです。しかし、この場合、どのクラスもJSONとしてログに記録できるはずです。ですから、オブジェクトをJSONにセリライズして文字列として出力することです。ただし、nlogの設定に従ってログに記録されない場合は、オブジェクトをセリライズする必要はありません。 – Banshee

0

は、いくつかの理論を追加するには;)

別の欠点は、私がする必要があるということです使用する各ターゲット(EventLog、File、WebServiceなど)に対して新しいTargetWithLayoutクラスを作成します。

NLogには、Layoutsという理由があります。これらはターゲットで使用できるレイアウトですが、ターゲットとは独立しています。

(レイアウトレンダラ、それら${..}ものと混同されません。)

あり、複数のレイアウトは(プレーンテキスト、CSV、JSON)は(listを参照)であり、あなたが簡単に独自のレイアウトを追加することができ、類似the wiki

関連する問題