Имя файла .Net Custom Trace - PullRequest
       14

Имя файла .Net Custom Trace

5 голосов
/ 22 октября 2009

Я бы хотел, чтобы мое приложение записывало различные файлы трассировки с именами, например MachineName_UserName_yyyymmdd_hhmmss.txt, где имя пользователя - это текущий зарегистрированный пользователь, а время - время запуска приложения. Слушатель .Net TextWriterTraceListener, кажется, поддерживает только жестко закодированное имя файла, указанное в файле конфигурации. Есть ли способ сделать это без написания специального прослушивателя трассировки.

Предполагая, что мне нужно написать собственный прослушиватель трассировки, я реализовал tracelistener следующим образом:

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 ]

1 голос
/ 22 октября 2009

Разве вам не нужно сообщать ваш тип сборки?

<add name="MyTraceListener"
     type="MyNameSpace.MyCustomTraceListener, MyAssembly"
     traceOutputOptions="ProcessId, DateTime, Callstack" />
0 голосов
/ 02 сентября 2014

Небольшое старое сообщение, но на случай, если кто-то сталкивается - вот ссылка, которая подробно описывает, как настроить прослушиватель трассировки плоского файла с датой и временем: 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

0 голосов
/ 23 октября 2009

Как насчет настройки вашего 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;
0 голосов
/ 22 октября 2009

Другой подход, который полностью исключает необходимость в производном классе:

Создайте базовый класс TextWriterTraceListener в своем файле конфигурации xml, а затем при запуске вы можете перечислить коллекцию Listeners, чтобы найти ее (обычно это DefaultTraceListener и TextWriterTraceListener), а затем просто установить поток регистрации в новом потоке.

...