2011-10-14 6 views
12

Estoy tratando de rastrear cosas extrañas que ocurren en mi aplicación Windows Forms con un TextWriterTraceListener apuntando a una ubicación de archivo. Lo tengo configurado para que la primera vez que la aplicación necesite rastrear algo durante la ejecución del programa, cree el oyente de rastreo y lo registre..NET Rastreo de un archivo que no funciona

Sin embargo, parece que el archivo de seguimiento no se está creando en absoluto, nada apareció en C: \ GMS2Trace.log. He verificado que el programa ha llegado a partes del código que llaman al método de seguimiento.

Mi código rastro parece que:

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

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

¿Es un problema con la ubicación del archivo de rastreo, o alguna otra cosa?

Respuesta

12

Puede configurar todo desde app.config y sólo tiene que utilizar:

Trace.Writeline("msg"); 

Ejemplo de uno de mis proyectos:

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

recordar sin embargo que todos Console.Writeline termina allso en el archivo

3

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

Y compilar con el rastreo habilitado csc.exe /d:TRACE o añadiendo #define TRACE a la parte superior de su archivo

+0

arreglado el fragmento de muestra - copiar/pegar incorrectamente :) – sehe

+1

Pensé que tenía que crear un archivo con .config. Ese fue mi problema Acabo de mover la configuración a app.config, así que debería estar bien. –

8

Añadir

Trace.AutoFlush = true; 

después de añadir oyente

+0

Este puede ser el problema, lo intentaré. –

+4

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

+0

Este fue mi problema. Tenía un oyente de consola y archivo, la consola se mostraba bien pero el archivo estaba en blanco. – KeithS

3

también es necesario asegurarse de que la constante TRACE se define cuando se genera el proyecto:

Screenshot of the TRACE constant setting

De manera predeterminada, esto está desactivado para la configuración Release, lo que significa que la llamada a Trace.TraceWarning está completamente optimizada.

3

Puede hacerlo en código:

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

Lo que me pasó fue que tuve no hay permisos para escribir en el directorio que había configurado mi archivo de registro.
De hecho, el Trace estaba escribiendo desde una aplicación COM + ejecutándose como LocalService y ese usuario no tenía permisos en la carpeta de destino.
La excepción fue transparente (para el programa) tragada por el oyente, y solo me di cuenta de que cuando Visual Studio mostró la excepción en la ventana de salida después de intentar escribir la primera línea de Trace.
Cambiar el identificador a un usuario con permisos o agregar permisos a LocalService a la carpeta de destino me funcionó.

Cuestiones relacionadas