.NET Trace to a file not working

2019-03-14 15:33发布

I am trying to track strange things going on in my Windows Forms application with a TextWriterTraceListener pointed to a file location. I have it set up so that the first time the application needs to trace something during the run of the program, it creates the trace listener and registers it.

However, it looks like the trace file is not getting created at all, nothing showed up at C:\GMS2Trace.log. I have verified that the program has reached parts of the code that call the trace method.

My trace code looks like:

internal static void traceWarning(string message)
{
    if (!traceEnabled)
    {
        traceEnabled = true;
        Trace.Listeners.Add(new TextWriterTraceListener(@"C:\GMS2Trace.log"));
    }

    Trace.TraceWarning(getTimeStamp() + " " + message);
}

Is it a problem with the location of the trace file, or something else?

标签: c# .net tracing
6条回答
唯我独甜
2楼-- · 2019-03-14 15:56

Add

Trace.AutoFlush = true;

after add listener

查看更多
一纸荒年 Trace。
3楼-- · 2019-03-14 15:57

What happened to me was I had no permissions to write in the directory I had configured my log file.
In fact the Trace was writing from a COM+ application running as LocalService and that user didn't have permissions on the target folder.
The exception was transparently (for the program) swallowed by the listener, and I only realized that when Visual Studio showed the exception in the output window after trying to write the first Trace line.
Changing the Identity to a user with permissions or adding permissions to LocalService to the target folder did the trick for me.

查看更多
叛逆
4楼-- · 2019-03-14 16:07

You can do it in code:

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();
查看更多
Fickle 薄情
5楼-- · 2019-03-14 16:10

You can configure it all from app.config and just use:

Trace.Writeline("msg");

Example from one of my projects:

<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>

Remember though that all Console.Writeline allso ends up in the file

查看更多
别忘想泡老子
6楼-- · 2019-03-14 16:12

You need to configure the trace level in the app.config file

<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>

And compile with tracing enabled csc.exe /d:TRACE or by adding #define TRACE to the top of your file

查看更多
Fickle 薄情
7楼-- · 2019-03-14 16:19

You also need to make sure that the TRACE constant is defined when you build the project:

Screenshot of the TRACE constant setting

By default this is off for the Release configuration meaning that the call to Trace.TraceWarning is completely optimised out.

查看更多
登录 后发表回答