長時間実行されている非同期タスクをトリガする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がそれをサポートしているようにそれは見えません。
を参照してくださいなど、グローバル変数GDC/MDCを同時に、場所ごとに1つのファイルアペンダーが必要になります。他の唯一の方法は、ロガー作成の回りにロックを使用することです。これはパフォーマンスに悪影響を及ぼします。 – stuartd