2009-10-21 7 views
5

Chciałbym, aby moja aplikacja wypisała różne pliki śledzenia o nazwach takich jak MachineName_UserName_yyyymmdd_hhmmss.txt, gdzie nazwa użytkownika jest aktualnie zalogowanym użytkownikiem, a czas jest początkiem aplikacji. Obiekt nasłuchujący .Net TextWriterTraceListener wydaje się obsługiwać tylko zakodowaną nazwę pliku określoną w pliku konfiguracyjnym. Czy istnieje sposób, aby to zrobić bez pisania niestandardowego detektora śledzenia..Net Niestandardowy plik śledzenia Nazwa

Zakładając mam napisać słuchacza zwyczaj ślad, ja wdrożyliśmy TraceListener takiego:

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 

w pliku konfiguracyjnym, mam skonfigurowane źródło śledzenia tak:

<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> 

Tworzę źródło śledzenia tak:

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

Jednak na starcie, wciąż otrzymuję błąd, którego nie można znaleźć typu "MyNameSpace.MycustomTraceListener".

Czy ktoś widzi, na czym polega problem?

Dzięki.

Odpowiedz

1

Nie musisz informować o swoim zespole typu?

<add name="MyTraceListener" 
    type="MyNameSpace.MyCustomTraceListener, MyAssembly" 
    traceOutputOptions="ProcessId, DateTime, Callstack" /> 
+0

To działa. Dziękuję Ci. – DevByDefault

0

Innym rozwiązaniem, które pozwala uniknąć konieczności klasy pochodnej całości:

utworzyć klasy bazowej TextWriterTraceListener w swoim konfiguracyjnym XML, a następnie przy starcie, można wyliczyć kolekcję słuchacze go znaleźć (nie będzie zwykle jest to DefaultTraceListener i TextWriterTraceListener), a następnie ustaw strumień logowania na nowy strumień.

+0

To podejście działa również. Dzięki. – DevByDefault

0

Co ze skonfigurowaniem swojego TraceListenera w kodzie? Jeśli nadal chcesz niektórych parametrów, np. ścieżkę dziennika, aby znaleźć się w pliku app.config, zdefiniuj je w sekcji appSettings i odczytaj je podczas tworzenia swojego detektora.

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

Każdy element w konfiguracji odpowiada interfejsowi API, dzięki czemu można zrobić wszystko, czego potrzebujesz.

traceListener.TraceOutputOptions |= TraceOptions.Callstack | TraceOptions.DateTime | TraceOptions.ProcessId; 
+0

Tak, to by działało, ale wolałbym iść z wszystkimi możliwościami konfiguracji dostarczonymi przez plik konfiguracyjny, a nie w domu, piec ustawienia, aby naśladować te same ustawienia, a następnie ustawić je programowo.Plik konfiguracyjny jest zdecydowanie bardziej "standardowym" sposobem. Ale, zgadzam się, to jest możliwa do zastosowania opcja. Dzięki. – DevByDefault

0

trochę stary post, ale tylko w przypadku, gdy ktoś przychodzi po drugiej stronie - tutaj jest link, który detale jak skonfigurować toczenia płaskiego pliku śledzenia słuchacza z datą i godziną: http://msdn.microsoft.com/en-us/library/ff664768%28v=pandp.50%29.aspx

artykuł nadrzędna o Logging bloku aplikacji jest w http://msdn.microsoft.com/en-us/library/ff664569%28v=pandp.50%29.aspx

Być może trzeba będzie dodać Nuget pakować w Visual Studio nazywa Enterprise Library - logowanie aplikacji Block

Jeśli chcesz zanurkować w głąb modułu aplikacji do logowania w bibliotece Enterprise, tutaj znajduje się cała książka PDF: http://www.microsoft.com/en-us/download/details.aspx?id=41145