代码之家  ›  专栏  ›  技术社区  ›  DevByDefault

.NET自定义跟踪文件名

  •  5
  • DevByDefault  · 技术社区  · 15 年前

    我希望我的应用程序写出不同的跟踪文件,如machinename_username_yymmdd_hhmmss.txt,其中用户名是当前登录的用户,时间是应用程序的开始时间。.NET侦听器textWriterTraceListener似乎只支持在配置文件中指定的硬编码文件名。有没有一种方法可以在不编写自定义跟踪侦听器的情况下执行此操作?

    假设我必须编写自定义跟踪侦听器,我已经实现了这样的跟踪侦听器:

    Imports System.Diagnostics
    
    Public Class MyCustomTraceListener
        Inherits TextWriterTraceListener
    
        Public Sub New()
            'Need to do it this way as the Base constructor call has to be the first statement
            MyBase.New(String.Format("AppNameTraceFile_{0}_{1}_{2}{3}{4}-{5}{6}{7}.txt", _
                                                           Environment.MachineName, _
                                                           Environment.UserName, _
                                                           DateTime.Now.ToString("yyyy"), _
                                                           DateTime.Now.ToString("MM"), _
                                                           DateTime.Now.ToString("dd"), _
                                                           DateTime.Now.ToString("HH"), _
                                                           DateTime.Now.ToString("mm"), _
                                                           DateTime.Now.ToString("ss")))
            Me.IndentSize = 4
        End Sub
    
    End Class
    

    在配置文件中,我配置了如下跟踪源:

      <system.diagnostics>
        <trace autoflush="true"/>
        <sources>
          <source name="MyTraceSource"
                  switchName="mySwitch"
                  switchType="System.Diagnostics.SourceSwitch" >
            <listeners>
              <clear/>
              <add name="MyTraceListener"
                type="MyNameSpace.MyCustomTraceListener"
                traceOutputOptions="ProcessId, DateTime, Callstack" />
            </listeners>
          </source>
        </sources>
        <switches>
          <add name="mySwitch" value="Warning" />
        </switches>
      </system.diagnostics>
    

    我正在创建跟踪源,如下所示:

    Dim tsTraceSource As TraceSource = New TraceSource("MyTraceSource")
    tsTraceSource.TraceEvent(TraceEventType.Warning, 0, "warning message")
    

    但是,在启动时,我一直收到一个错误,无法找到类型“myNamespace.myCustomTraceListener”。

    有人看到这里有什么问题吗?

    谢谢。

    4 回复  |  直到 8 年前
        1
  •  1
  •   Rubens Farias    15 年前

    你不需要通知你的类型装配吗?

    <add name="MyTraceListener"
         type="MyNameSpace.MyCustomTraceListener, MyAssembly"
         traceOutputOptions="ProcessId, DateTime, Callstack" />
    
        2
  •  0
  •   Jason Williams    15 年前

    另一种完全不需要派生类的方法:

    在配置XML中创建一个基类textWriterTraceListener,然后在启动时,可以枚举Listeners集合以查找它(通常会有一个defaultTraceListener和一个textWriterTraceListener),然后将其日志记录流设置为新的流。

        3
  •  0
  •   AndyM    15 年前

    在代码中设置TraceListener怎么样?如果仍希望某些参数(例如日志路径)位于app.config中,请在appsettings部分定义它们,并在创建侦听器时读取它们。

    ' VB
    Dim traceLog As New FileStream(traceFile, FileMode.OpenOrCreate)
    Dim traceListener As New TextWriterTraceListener(traceLog)
    Trace.Listeners.Add(traceListener)
    
    // C#
    FileStream traceLog = new FileStream(traceFile, FileMode.OpenOrCreate);
    TextWriterTraceListener traceListener = new TextWriterTraceListener(traceLog);
    Trace.Listeners.Add(traceListener);
    

    配置中的每一个元素都对应于API,因此您将能够完成所需的一切工作。

    traceListener.TraceOutputOptions |= TraceOptions.Callstack | TraceOptions.DateTime | TraceOptions.ProcessId;
    
        4
  •  0
  •   joym8    10 年前

    这是一个链接,详细介绍了如何使用日期和时间设置滚动平面文件跟踪侦听器: http://msdn.microsoft.com/en-us/library/ff664768%28v=pandp.50%29.aspx

    有关日志记录应用程序块的父项目位于 http://msdn.microsoft.com/en-us/library/ff664569%28v=pandp.50%29.aspx

    您可能需要添加 NuGET包 在Visual Studio中调用 企业库-日志记录应用程序块

    如果您想深入了解Enterprise Library的日志应用程序块,请阅读下面的整个PDF手册: http://www.microsoft.com/en-us/download/details.aspx?id=41145

    推荐文章