2011-10-14 15 views
12

Sto provando a tenere traccia delle cose strane che si verificano nella mia applicazione Windows Form con un TextWriterTraceListener che punta a un percorso file. L'ho configurato in modo che la prima volta che l'applicazione debba tracciare qualcosa durante l'esecuzione del programma, crea l'ascoltatore di traccia e lo registra..NET Traccia su un file non funzionante

Tuttavia, sembra che il file di traccia non venga affatto creato, non viene visualizzato nulla in C: \ GMS2Trace.log. Ho verificato che il programma abbia raggiunto parti del codice che chiamano il metodo di tracciamento.

Il mio codice di traccia assomiglia:

internal static void traceWarning(string message) 
{ 
    if (!traceEnabled) 
    { 
     traceEnabled = true; 
     Trace.Listeners.Add(new TextWriterTraceListener(@"C:\GMS2Trace.log")); 
    } 

    Trace.TraceWarning(getTimeStamp() + " " + message); 
} 

è un problema con il percorso del file di traccia, o qualcos'altro?

risposta

12

È possibile configurare tutto da app.config e basta usare:

Trace.Writeline("msg"); 

Esempio da uno dei miei progetti:

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

Ricorda però che tutto finisce Console.Writeline allso nel file

3

È necessario configure the trace level in the app.config file

<system.diagnostics> 
    <switches> 
     <!-- This switch controls data messages. In order to receive data 
     trace messages, change value="0" to value="1" --> 
     <add name="DataMessagesSwitch" value="0" /> 
     <!-- This switch controls general messages. In order to 
     receive general trace messages change the value to the 
     appropriate level. "1" gives error messages, "2" gives errors 
     and warnings, "3" gives more detailed error information, and 
     "4" gives verbose trace information --> 
     <add name="TraceLevelSwitch" value="0" /> 
    </switches> 
</system.diagnostics> 

e compilare con la traccia abilitata csc.exe /d:TRACE o aggiungendo #define TRACE alla parte superiore del file

+0

corretto lo snippet di esempio - copia/incolla errata :) – sehe

+1

Ho pensato di creare un file con .config. Questo era il mio problema Ho appena spostato le impostazioni in app.config, quindi dovrei essere bravo. –

8

Aggiungi

Trace.AutoFlush = true; 

dopo aggiungere ascoltatore

+0

Questo potrebbe essere il problema, ci proverò. –

+4

o utilizzare 'Trace.Flush(); ' – mihai

+0

Questo era il mio problema. Aveva un listener Console e File, la console stava mostrando bene ma il file era vuoto. – KeithS

3

è inoltre necessario assicurarsi che la costante TRACE viene definita quando si genera il progetto:

Screenshot of the TRACE constant setting

Per impostazione predefinita, questo è disattivato per la configurazione di rilascio, il che significa che la chiamata a Trace.TraceWarning viene completamente ottimizzata.

3

Puoi farlo in codice:

string traceFileLocation = "yourFileName"; 
TraceSource traceSource; 
TextWriterTraceListener traceListener; 
traceSource = new TraceSource("your source name"); 
traceListener = new TextWriterTraceListener(traceFileLocation); 
traceListener.TraceOutputOptions = TraceOptions.LogicalOperationStack | 
            TraceOptions.DateTime | 
            TraceOptions.Timestamp | 
            TraceOptions.ProcessId | 
            TraceOptions.ThreadId; 
traceSource.Switch = new SourceSwitch("someName","some Name"); 
traceSource.Switch.Level = SourceLevels.Information; 
traceSource.Listeners.Clear(); 
traceSource.Listeners.Add(traceListener); 
Trace.AutoFlush = true; 

Trace.CorrelationManager.StartLogicalOperation("logical operation"); 
traceSource.TraceEvent(TraceEventType.Error, (int)TraceEventType.Error, "messsage"); 
Trace.CorrelationManager.StopLogicalOperation(); 
0

Quello che è successo a me è stato non ho avuto i permessi per scrivere nella directory che avevo configurato il mio file di log.
Infatti, la traccia stava scrivendo da un'applicazione COM + in esecuzione come LocalService e quell'utente non disponeva delle autorizzazioni per la cartella di destinazione.
L'eccezione era trasparente (per il programma) ingoiata dall'ascoltatore e mi sono reso conto solo quando Visual Studio mostrava l'eccezione nella finestra di output dopo aver provato a scrivere la prima traccia.
Modificare l'identità per un utente con autorizzazioni o aggiungere autorizzazioni a LocalService nella cartella di destinazione ha fatto il trucco per me.

Problemi correlati