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