write visual studio paso depurar debugger debug c# .net tracing

c# - visual - .NET El rastreo de un archivo no funciona



trace c# (6)

Añadir

Trace.AutoFlush = true;

después de añadir oyente

Estoy tratando de rastrear cosas extrañas que suceden en mi aplicación Windows Forms con un TextWriterTraceListener apuntado 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 detector de trazas y lo registre.

Sin embargo, parece que el archivo de rastreo no se está creando en absoluto, no apareció nada en C: / GMS2Trace.log. He verificado que el programa ha alcanzado partes del código que llama al método de rastreo.

Mi código de seguimiento se ve como:

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 algo más?


Lo que me pasó fue que no tenía permisos para escribir en el directorio que había configurado mi archivo de registro.
De hecho, el rastreo estaba escribiendo desde una aplicación COM + que se ejecuta como LocalService y ese usuario no tenía permisos en la carpeta de destino.
El oyente tragó la excepción de forma transparente (para el programa), y solo me di cuenta de que cuando Visual Studio mostraba la excepción en la ventana de resultados después de intentar escribir la primera línea de seguimiento.
Cambiar la identidad a un usuario con permisos o agregar permisos a LocalService a la carpeta de destino me ayudó.


Puede configurarlo todo desde app.config y simplemente usar:

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>

Sin embargo, recuerde que todo Console.Writeline también termina en el archivo


Puedes 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();


También debe asegurarse de que la constante TRACE esté definida cuando construya el proyecto:

Por defecto, esto está desactivado para la configuración de la versión, lo que significa que la llamada a Trace.TraceWarning está completamente optimizada.


Debe configurar el nivel de rastreo en el archivo app.config

<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 compile con el rastreo habilitado csc.exe /d:TRACE o agregando #define TRACE en la parte superior de su archivo