【问题标题】:Create a new Trace Log file for every application run为每个应用程序运行创建一个新的跟踪日志文件
【发布时间】:2014-02-03 14:15:30
【问题描述】:

我正在使用TraceListener 将执行详细信息写入日志文件。下面是我app.config文件中的配置:

<system.diagnostics>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Runner.log" />
        <remove name="Default" />
      </listeners>
    </trace>
  </system.diagnostics>

但是我可以看到每次执行的日志都被附加到文件Runner.log。相反,我想为每次执行创建不同的日志文件。我需要在app.config 文件中添加任何设置吗?或者这可以通过编程方式完成吗?感谢您的帮助。

【问题讨论】:

    标签: c# .net logging trace


    【解决方案1】:

    我已经在课堂下面实现了,它对我来说工作正常。另外,现在我不需要在app.config 文件中指定任何内容

      class TextLogTraceListener : TextWriterTraceListener
        {
            private string logFileLocation = string.Empty;
    
            private StreamWriter traceWriter;
    
            public TextLogTraceListener(string filePath)
            {
                logFileLocation = filePath;
                traceWriter = new StreamWriter(filePath, true);
                traceWriter.AutoFlush = true;
            }
    
            public override void Write(string message)
            {
                traceWriter.Write(message);
            }
    
            public override void WriteLine(string message)
            {
                traceWriter.WriteLine(message);
            }
    
            public override void Close()
            {
                traceWriter.Close();
            }
        }
    

    并像下面这样使用这个类:

    public static class Logger
        {
            static TextLogTraceListener textLogTraceListener = new TextLogTraceListener("Trace.log");
    
            public static void CloseWriter()
            {
                textLogTraceListener.Close();
            }
    
            public static void Error(string message, string module)
            {
                WriteEntry(message, "ERROR", module);
            }
    
            public static void Error(Exception ex, string module)
            {
                WriteEntry(ex.Message + Environment.NewLine + ex.StackTrace, "ERROR", module);
            }
    
            public static void Warning(string message, string module)
            {
                WriteEntry(message, "WARNING", module);
            }
    
            public static void Info(string message, string module)
            {
                WriteEntry(message, "INFO", module);
            }
    
            private static void WriteEntry(string message, string type, string module)
            {
                textLogTraceListener.WriteLine(string.Format("[{0}] [{1}] [{2}] {3}",
                                      DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                      type,
                                      module,
                                      message));
            }
        }
    

    【讨论】:

    • 按照您的代码,Trace.log 文件存储在哪里?
    • 它将存储在当前工作目录中。无论如何,您始终可以在创建 TextLogTraceListener 对象时提供自己的路径
    • 是的,我明白了。感谢您的快速回复
    • 我意识到这是一个旧答案。为了覆盖现有文件,StreamWriter 需要为 traceWriter = new StreamWriter(filePath, false);,这会将附加值设置为 false,从而导致覆盖
    【解决方案2】:

    最好的方法是编写您自己的 TextWriterTraceListener 类的实现并将其注册到您的 app.config 中。

    这是一个示例实现:

    http://www.geekzilla.co.uk/View2C5161FE-783B-4AB7-90EF-C249CB291746.htm

    【讨论】:

      最近更新 更多