web-dev-qa-db-ja.com

ファイルへの.NETトレースが機能しない

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);
}

トレースファイルの場所などに問題がありますか?

21
Tony Peterson

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もファイルに含まれることに注意してください。

18
DNRN

追加

Trace.AutoFlush = true;

リスナーを追加した後

11
ADIMO

また、プロジェクトをビルドするときにTRACE定数が定義されていることを確認する必要もあります。

Screenshot of the TRACE constant setting

これはリリース構成ではデフォルトでオフになっています。つまり、Trace.TraceWarningへの呼び出しは完全に最適化されます。

9
Justin

あなたはコードでそれを行うことができます:

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();
4
user1253128

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を追加

3
sehe

私に起こったのは、ログファイルを構成したディレクトリに書き込むためのアクセス許可がないことでした。
実際、トレースはLocalServiceとして実行されているCOM +アプリケーションから書き込んでおり、そのユーザーにはターゲットフォルダーに対する権限がありませんでした。
例外は透過的に(プログラムに対して)リスナーによって飲み込まれ、最初のトレース行を書き込もうとした後、Visual Studioが出力ウィンドウに例外を表示したときにのみ気づきました。
IDをアクセス許可を持つユーザーに変更するか、LocalServiceへのアクセス許可をターゲットフォルダーに追加すると、うまくいきました。

0
Eugenio Miró