Windowsフォームアプリケーションで起こっている奇妙なことを、ファイルの場所を指すTextWriterTraceListenerで追跡しようとしています。プログラムの実行中にアプリケーションが初めて何かをトレースする必要があるときに、トレースリスナーを作成して登録するように設定しました。
ただし、トレースファイルがまったく作成されていないようで、C:\ GMS2Trace.logには何も表示されません。プログラムがtraceメソッドを呼び出すコードの一部に達していることを確認しました。
私のトレースコードは次のようになります:
internal static void traceWarning(string message)
{
if (!traceEnabled)
{
traceEnabled = true;
Trace.Listeners.Add(new TextWriterTraceListener(@"C:\GMS2Trace.log"));
}
Trace.TraceWarning(getTimeStamp() + " " + message);
}
トレースファイルの場所などに問題がありますか?
App.configからすべてを構成して、次のように使用できます。
Trace.Writeline("msg");
私のプロジェクトの例:
<system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="log.log" />
<remove name="Default" />
</listeners>
</trace>
</system.diagnostics>
ただし、すべてのConsole.Writelineもファイルに含まれることに注意してください。
追加
Trace.AutoFlush = true;
リスナーを追加した後
また、プロジェクトをビルドするときにTRACE定数が定義されていることを確認する必要もあります。
これはリリース構成ではデフォルトでオフになっています。つまり、Trace.TraceWarning
への呼び出しは完全に最適化されます。
あなたはコードでそれを行うことができます:
string traceFileLocation = "yourFileName";
TraceSource traceSource;
TextWriterTraceListener traceListener;
traceSource = new TraceSource("your source name");
traceListener = new TextWriterTraceListener(traceFileLocation);
traceListener.TraceOutputOptions = TraceOptions.LogicalOperationStack |
TraceOptions.DateTime |
TraceOptions.Timestamp |
TraceOptions.ProcessId |
TraceOptions.ThreadId;
traceSource.Switch = new SourceSwitch("someName","some Name");
traceSource.Switch.Level = SourceLevels.Information;
traceSource.Listeners.Clear();
traceSource.Listeners.Add(traceListener);
Trace.AutoFlush = true;
Trace.CorrelationManager.StartLogicalOperation("logical operation");
traceSource.TraceEvent(TraceEventType.Error, (int)TraceEventType.Error, "messsage");
Trace.CorrelationManager.StopLogicalOperation();
app.configファイルでトレースレベルを構成する必要があります
<system.diagnostics>
<switches>
<!-- This switch controls data messages. In order to receive data
trace messages, change value="0" to value="1" -->
<add name="DataMessagesSwitch" value="0" />
<!-- This switch controls general messages. In order to
receive general trace messages change the value to the
appropriate level. "1" gives error messages, "2" gives errors
and warnings, "3" gives more detailed error information, and
"4" gives verbose trace information -->
<add name="TraceLevelSwitch" value="0" />
</switches>
</system.diagnostics>
トレースを有効にしてコンパイルcsc.exe /d:TRACE
またはファイルの先頭に#define TRACE
を追加
私に起こったのは、ログファイルを構成したディレクトリに書き込むためのアクセス許可がないことでした。
実際、トレースはLocalServiceとして実行されているCOM +アプリケーションから書き込んでおり、そのユーザーにはターゲットフォルダーに対する権限がありませんでした。
例外は透過的に(プログラムに対して)リスナーによって飲み込まれ、最初のトレース行を書き込もうとした後、Visual Studioが出力ウィンドウに例外を表示したときにのみ気づきました。
IDをアクセス許可を持つユーザーに変更するか、LocalServiceへのアクセス許可をターゲットフォルダーに追加すると、うまくいきました。