【问题标题】:.NET Trace to a file not working.NET 跟踪文件不起作用
【发布时间】:2011-10-14 14:25:13
【问题描述】:

我正在尝试使用指向文件位置的 TextWriterTraceListener 来跟踪我的 Windows 窗体应用程序中发生的奇怪事情。我进行了设置,以便应用程序在程序运行期间第一次需要跟踪某些内容时,它会创建跟踪侦听器并注册它。

但是,似乎根本没有创建跟踪文件,C:\GMS2Trace.log 中没有显示任何内容。我已验证程序已到达调用跟踪方法的部分代码。

我的跟踪代码如下所示:

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

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

是跟踪文件的位置有问题,还是其他问题?

【问题讨论】:

    标签: c# .net trace


    【解决方案1】:

    您可以从 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 都以文件结尾

    【讨论】:

    • 日志在哪里创建?
    • 为什么Console.WriteLine 会出现在文件中?跟踪侦听器只听 Trace 发生的事情,而不是 Console
    【解决方案2】:

    添加

    Trace.AutoFlush = true;
    

    添加监听器后

    【讨论】:

    • 可能是这个问题,我试试看。
    • 或使用Trace.Flush();
    • 这是我的问题。有一个控制台和文件侦听器,控制台显示正常,但文件为空白。
    【解决方案3】:

    您还需要确保在构建项目时定义了 TRACE 常量:

    默认情况下,Release 配置是关闭的,这意味着对 Trace.TraceWarning 的调用已完全优化。

    【讨论】:

    • 好电话!那是我的问题!
    【解决方案4】:

    你可以在代码中做到这一点:

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

    【讨论】:

      【解决方案5】:

      您需要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>
      

      并在启用跟踪csc.exe /d:TRACE 或通过将#define TRACE 添加到文件顶部进行编译

      【讨论】:

      • 我想我必须用 .config 创建一个文件。那是我的问题。我刚刚将设置移动到 app.config,所以我应该很好。
      【解决方案6】:

      发生在我身上的是我没有权限在我配置日志文件的目录中写入。
      事实上,Trace 是从作为 LocalService 运行的 COM+ 应用程序写入的,并且该用户没有目标文件夹的权限。
      异常被侦听器透明地(对于程序)吞下了,我才意识到,当 Visual Studio 在尝试编写第一条 Trace 行后在输出窗口中显示异常时。
      将身份更改为具有权限的用户或将 LocalService 权限添加到目标文件夹对我来说是诀窍。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-23
        • 2016-07-10
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        相关资源
        最近更新 更多