2016-08-12 12 views
1

長時間実行されている非同期タスクをトリガするWebリクエストを受け付けるWindowsサービスがあります。私はそれぞれのタスクが異なるディレクトリにログを出力するようにしたい(名前は要求IDとジョブを起動したユーザーによって決まります)。各ディレクトリの中には、複数のログファイルがあります。複数のフォルダへのログ

私はCommon.Loggingとlog4netを使用しています。しかし、ディレクトリを変更するためにlog4netの設定をリセットする必要があります(下記参照)。これは、別のタスクがまだ実行されている間にタスクが起動された場合にはうまくいきません。両方のタスクのログが、作成された最新のディレクトリに変更されています。

protected ILog CreateLoggerInstance(string loggerName, string logFolder) 
    { 
     logFolder += "/"; 
     // This is a hack to avoid creation of a folder called (null), because of limitation in log4net. 
     // More details: https://github.com/net-commons/common-logging/issues/81 
     log4net.GlobalContext.Properties["LogsDirectory"] = logFolder; 

     this.LogInstance = LogManager.GetLogger(loggerName); 
     this.LogInstance.GlobalVariablesContext.Set("LogsDirectory", logFolder); 
     LogManager.Reset(); 
     this.LogInstance = LogManager.GetLogger(loggerName); 

     this.LogFolder = logFolder; 
     return this.LogInstance; 
    } 

特定のロガーのログのみを設定する方法はありますか?または、何とかReset()を避けることができますか?また、この特定のコードは、私がlog4netを参照している唯一の場所です。だから、ログセットごとに複数のフォルダを作成することができれば、NLogに移行することができます。

編集:私はNLogでこの機能見つけた - https://github.com/NLog/NLog/wiki/Configure-component-logging

をしかしCommon.Loggingがそれをサポートしているようにそれは見えません。

+0

を参照してくださいなど、グローバル変数GDC/MDCを同時に、場所ごとに1つのファイルアペンダーが必要になります。他の唯一の方法は、ロガー作成の回りにロックを使用することです。これはパフォーマンスに悪影響を及ぼします。 – stuartd

答えて

1

ソリューションはジャストfileName属性でrequestIduserを使用NLog、

に非常に単純です。

<targets> 
    <target name="file" xsi:type="File" 
     layout="${longdate} ${logger} ${message}" 
     fileName="${basedir}/${var:requestid}_${var:user}.log" /> 
</targets> 

<rules> 
    <logger name="*" minlevel="Debug" writeTo="file" /> 
</rules> 

あなたは、さまざまな状況でrequestid &ユーザー名を設定することができます:あなたは、いくつかの場所に書き込みたい場合はhttps://github.com/NLog/NLog/wiki/Gdc-layout-renderer

+0

鮮やかな、これはうまくいった。私はMDCでロガーを作成して、どこにでもCommon.Loggingを使用することができました。ただ1つのファイルで、NLog.MappedDiagnosticsContextを使用しなければなりませんでした。簡単な質問ですが、MDCはTPLの作業で正常に動作するはずですか?これまでのテストでは動作することが示唆されていますが、ThreadPoolには問題がありますか? – Narayana

+1

TPL(タスク)の場合は、MDLCが必要です。https://github.com/NLog/NLog/wiki/MDLC-Layout-Renderer – Julian

関連する問題