2012-02-25 8 views
0

アスペクトからログエントリを書き込むときに、自分のログファイルのレイアウトを変更する必要があります。時間の経過とともに他の設定も変更する必要があります。別の用途に合わせてレイアウトを変更する必要があります

必要なレイアウトを作成する2つのFileTargetsを作成しました。

LoggingConfiguration config = new LoggingConfiguration(); 
    LoggingConfiguration aspectConfig = new LoggingConfiguration(); 

    FileTarget fileTarget = new FileTarget(); 
    fileTarget.Name = "fileTarget"; 
    fileTarget.Layout = "${longdate} ${machineName} ${callsite} ${message} ${exception:format=tostring}"; 
    fileTarget.FileName = String.Format("{0}Admin.log", Config.DatabasePath); 
    fileTarget.KeepFileOpen = false; 


    FileTarget aspectTarget = new FileTarget(); 
    aspectTarget.Name = "aspectTarget"; 
    aspectTarget.Layout = "${longdate} ${machineName} ${message} ${exception:format=tostring}"; 
    aspectTarget.FileName = String.Format("{0}Admin.log", Config.DatabasePath); 
    aspectTarget.KeepFileOpen = false; 


    LoggingRule rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget); 
    config.LoggingRules.Add(rule2); 

    LoggingRule aspectRule = new LoggingRule("aspects", LogLevel.Trace, aspectTarget); 
    aspectConfig.LoggingRules.Add(aspectRule); 


    LogManager.Configuration = config; 

この段階では、それ以外の変更点や相違点があります。

『を使用して設定すなわち:

var log = LogManager.GetCurrentClassLogger(); 
    log.Fatal("##########################################"); 

を私は何をしたいがされて使用することができる『「デフォルトまたは』*の罰金、次の作品を使用してaspectRule』ではなく、デフォルトを 『*』ロガーを呼び出して 'aspectRule'を指定することで

私はこれが働くだろうと思っていた

var log = LogManager.GetLogger("aspects"); 
    log.Fatal("########################################"); 

すべてが順調と良いですが、私は、私は私も作成しない、特にコードのように「側面」と呼ばれる新しいロガーを定義する方法を見ることができません'*'という名前のロガー:-)

XML設定ファイルを使用していないため、プログラムで使用するには解決策が必要です。

アイデア?

EDIT:

私はこの例のように1つのログエントリを記述する必要があります。

if (someCondition) 
    logger.Fatal("#############"); // use layout in fileTarget 
    else 
    logger.Fatal("##############"); // use layout in aspectTarget 

答えて

2

はEDIT:LoggingRule rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget)がログファイルにあらゆる出力を記録します、編集した質問に答えるために。

特定の出力が必要な場合は、NLog固有のものにする必要があります。例えば 、fileTarget(「*」)でTraceからInfoまでの範囲のものを記録し、ErrorからFatalにログレベルを持つ2つの他の特定目標aspectsrule2を持っています。

あなたは、二つの構成configaspectConfigを作成し、両方を設定し、最終的LogManager.Configuration = configを設定している -

LogManager.GetCurrentClassLogger().Debug("Non-specific message"); 
LogManager.GetLogger("rule2").Fatal("From rule2"); 
LogManager.GetLogger("aspects").Fatal("From Aspects"); 

次に、あなたは、このようにログインできます。

最終的にaspectConfigは使用されていません。解決するには、すべてのaspectConfig関連するコードを削除し、これにacpects行を修正:

config.LoggingRules.Add(aspectRule);

+0

は何あなたが示唆することは、私がもともと持っていたものです。つまり、log.Fatal( "####")を実行すると、エントリがログに2回記録されます。私の質問は - どのように私は1つのエントリを記録するのですか?私はそれをもっと明確にするために私の質問を改善しました... – David

+0

ありがとう - それはよく分かります。 LogManager.GetLogger(????)は、私の代わりに何を置くべきかについて混乱させました。 。 – David

+0

Yup、特定のターゲットの特定のロガー。 NLogは本当に素晴らしいライブラリです。楽しい。 – AVIDeveloper

関連する問題