私が現在取り組んでいるプロジェクトでは、ロギングに Enterprise Libraries V3.1 フレームワークを使用しています。
生成されたログ ファイルを特定の時点でアーカイブする必要があります。組み込みの Trace Listener は、ロギング イベント間でファイルを開いたままにしているようです。ファイルに追加して閉じるカスタム トレース リスナーをセットアップし、ファイルが常にシフト可能になるようにしました。
次のようになります (わかりやすくするためにエラー処理を省略しています)。
[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class AlwaysClosedTextFileTraceListener : CustomTraceListener
{
private string logFilePath;
public AlwaysClosedTextFileTraceListener ()
{
logFilePath = @"hardcodedpath\log.txt";
}
public override void Write(string message)
{
using (StreamWriter logFile = File.AppendText(logFilePath))
{
logFile.Write(message);
logFile.Flush();
logFile.Close();
}
}
public override void WriteLine(string message)
{
using (StreamWriter logFile = File.AppendText(logFilePath))
{
logFile.WriteLine(message);
logFile.Flush();
}
}
public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
{
if (data is LogEntry && this.Formatter != null)
{
WriteLine(this.Formatter.Format(data as LogEntry));
}
else
{
WriteLine(data.ToString());
}
}
}
これは問題なく動作しますが、パスをハードコーディングするのではなく、何らかの方法でパラメーターとして渡したいと思います。
楽しみのために、コンストラクターに追加して、何が起こるかを確認してみました。
public LogFolderTraceListener(string logFilePath)
{
this.logFilePath = logFilePath;
}
これを行うと、何が間違っているかを示唆するエラーメッセージが返されます。
System.InvalidOperationException : The type 'AlwaysClosedTextFileTraceListener' specified for custom trace listener named 'MyLogFile' does not a default constructor, which is required when no InitData is specified in the configuration.
ここから先、私の調査は行き止まりとは正反対の、無限の確率の問題に行き着きました。
組み込みのソースコードからこの親指を見つけましたRollingTraceListener
RollingFlatFileTraceListenerData : TraceListenerData
コンストラクターに渡されたすべての設定を含むと思われるクラスがあります- ファイルの下部にキャンプアウトされているのは、工場と思われる
RollingFlatFileTraceListenerData
クラスですRollingTraceListenerAssembler : TraceListenerAsssembler
- クラスを構成アプリケーションに提示可能に
SystemDiagnosticsTraceListenerNode : TraceListenerNode
するように見える別のクラスがありますData
CustomTraceListener
私の質問はこれです:の構成可能なパラメーターを使用して を作成するにはどうすればよいpath
ですか?