我可以使用 TraceListener 在 initializeData 中放置时间戳吗?

Can I put a timestamp in initializeData using TraceListener?

可以在 TraceListener 的 "initializeData" 中放置时间戳吗?

像这样:

<sharedListeners>
      <add name="AppSourceListener"
        type="System.Diagnostics.DelimitedListTraceListener" 
        initializeData="c:\test%date.csv" 
        traceOutputOptions="ProcessId, DateTime, Callstack">
      </add>      
</sharedListeners>

一旦启动应用程序,我想将 DateTime.Now 放入每个日志中。

这在 .config 文件中是不可能的。为此,从代码创建 TraceListener:

//Remove all existing trace listeners
while (Trace.Listeners.Count > 0)
    Trace.Listeners.RemoveAt(0);
//Add the new one with new file name
Trace.Listeners.Add(new DelimitedListTraceListener(@"mylogwithdatetime.log"));

这在某种程度上是可能的。 无论您作为“initializeData”输入什么,都会转到自定义跟踪侦听器的构造函数。所以如果你有这样的东西

namespace MyLogger
{
    public class DebugListener :TraceListener
    {
        string LogFileName;
        public DebugListener (string filename)
        {
            filename = filename.Replace("@date",DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString());
            LogFileName = filename;
        }
    }
}

和配置

<system.diagnostics>
  <trace autoflush="true" indentsize="4">
    <listeners>
      <add name="dbgListener" type="MyLogger.DebugListener,MyLogger" initializeData="MyLog@date.txt"/>
    </listeners>
  </trace>
</system.diagnostics>

然后你会得到文件名 MyLog20173.txt 尽管请记住构造函数只会被调用一次,并且您必须重新启动应用程序才能创建新日志,但您始终可以在代码中处理该逻辑,例如每月创建一个新日志文件的代码

//get new log file name every month
string newFileName = string.Format("{0}_{1}{2}.txt","name",DateTime.UtcNow.Year.ToString(CultureInfo.InvariantCulture),DateTime.UtcNow.ToString("MM", CultureInfo.InvariantCulture))`;