現在、アプリケーションを実行するたびに、ファイルが作成されます (Web.Config Logging セクションで指定されたファイル名)。
私が望むのは、実行時にファイルのパスと名前を (クエリ文字列として渡す GUID に基づいて) 変更することです。
私はいくつかの調査を行いましたが、利用可能な例は私にとってはうまくいきません。誰かがコードサンプルを提供できれば幸いです。
現在、アプリケーションを実行するたびに、ファイルが作成されます (Web.Config Logging セクションで指定されたファイル名)。
私が望むのは、実行時にファイルのパスと名前を (クエリ文字列として渡す GUID に基づいて) 変更することです。
私はいくつかの調査を行いましたが、利用可能な例は私にとってはうまくいきません。誰かがコードサンプルを提供できれば幸いです。
実行時にトレース ログ ファイルを変更する必要があるだけの場合は、次のコマンドを使用して現在の tracelistener を簡単に削除できます。
System.Diagnostics.Trace.Listener.Remove("Listener1");
次に、新しいログ ファイル名で新しいリスナーを追加します。
System.Diagnostics.Trace.Listener.Add(新しい System.Diagnostics.TextWriterTraceListener("NewLogFileName.txt","Listener2");
これで、ログが NewLogFileName.txt に記録されます
お気づきのように、要件は Enterprise Library の構成ベースのアプローチに自然に適合しません。それができないと言っているわけではありません。
目的を達成する 1 つの方法は、ロギング ブロックのプログラムによる構成を使用することです。
1 つの方法は、ID から LogWriter へのマッピングを保持する IDictionary を作成することです。ID がチェックされたら、IDictionary に LogWriter が既に存在するかどうかを確認します。存在する場合はそれを使用し、存在しない場合は新しい LogWriter を作成します。
Logging Fluent Interfaceを使用して UnityContainer を構成し、LogWriter を解決して Dictionary に保存するサンプル コードを次に示します。
int id = 123123;
Dictionary<int, LogWriter> loggers = new Dictionary<int, LogWriter>();
ConfigurationSourceBuilder builder = new ConfigurationSourceBuilder();
builder.ConfigureLogging()
.WithOptions
.DoNotRevertImpersonation()
.SpecialSources.LoggingErrorsAndWarningsCategory.SendTo.FlatFile("Flat File Listener").ToFile(@"trace.log")
.LogToCategoryNamed("General")
.WithOptions.SetAsDefaultCategory()
.SendTo.FlatFile("AppSpecificFlatFile" + id)
.ToFile("logging" + id + ".log")
;
DictionaryConfigurationSource configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);
coreExtension = new EnterpriseLibraryCoreExtension(configSource);
IUnityContainer container = new UnityContainer();
container.AddExtension(coreExtension);
var logger = container.Resolve<LogWriter>();
loggers[id] = logger;
これは単なるサンプルであり、スレッドセーフまたは抽象化されていませんが、うまくいけば役立つはずです。