He estado buscando usando System.Diagnostics.Trace para hacer logging es una aplicación muy básica. En general, hace todo lo que necesito que haga. La desventaja es que si llamo¿Cómo presiona el System.TraceListener el mensaje con el nombre del proceso?
Trace.TraceInformation("Some info");
La salida es "Información someapp.exe: 0: Algo de información". Inicialmente, esto me entretuvo pero ya no. Me gustaría simplemente enviar "Alguna información" a la consola. Así que pensé que escribir un TraceListener cusom, en lugar de usar el ConsoleTraceListener incorporado, resolvería el problema. Puedo ver un formato específico que quiero todo el texto después del segundo punto. Aquí está mi intento de ver si esto funcionaría.
class LogTraceListener : TraceListener
{
public override void Write(string message)
{
int firstColon = message.IndexOf(":");
int secondColon = message.IndexOf(":", firstColon + 1);
Console.Write(message);
}
public override void WriteLine(string message)
{
int firstColon = message.IndexOf(":");
int secondColon = message.IndexOf(":", firstColon + 1);
Console.WriteLine(message);
}
}
Si obtengo el valor de firstColon, siempre es -1. Si pongo un punto de quiebre, el mensaje siempre es solo "Alguna información". ¿De dónde viene toda la otra información?
Así que eché un vistazo a la pila de llamadas en el punto justo antes de llamar a Console.WriteLine. El método que llama mi método WriteLine es: System.dll System.Diagnostics.TraceListener.TraceEvent (System.Diagnostics.TraceEventCache EventCache, cadena fuente, System.Diagnostics.TraceEventType eventType, int id, mensaje de cadena) + 0x33 bytes
Cuando uso Reflector para mirar este mensaje, todo parece bastante sencillo. No puedo ver ningún código que cambie el valor de la cadena después de haberla enviado a Console.WriteLine. El único método que podría cambiar el valor de la cadena subyacente es una llamada a UnsafeNativeMethods.EventWriteString que tiene un parámetro que es un puntero al mensaje.
¿Alguien entiende lo que está pasando aquí y si puedo cambiar el resultado para que sea solo mi mensaje sin la pelusa adicional? Parece una magia maligna que puedo pasar una cadena "Algo de información" a Console.WriteLine (o cualquier otro método para el caso) y la cadena que sale es diferente.
EDIT: encontré la magia. Obviamente no fue magia. El método Write recibe una llamada de una llamada a WriteHeader antes de la llamada a WriteLine, que es donde pensé que estaba sucediendo la magia.
Gracias esto es muy útil. Resuelve el problema de tener diferentes resultados de diferentes oyentes. Sin embargo, todavía no entiendo cómo se transfiere una cadena a mi anulación de WriteLine. Sin embargo, si paso este tring a otra función, de alguna manera se modifica en un momento posterior. – btlog
No estoy seguro de seguir, ¿cuál es el problema real? La implementación predeterminada de TraceEvent formatea los argumentos "fuente" e "id" y llama a su método WriteLine(). Tenga en cuenta que hay otro. –
Puedo ver cómo mi pregunta fue aclarada. Tengo esta respuesta porque me dio una solución inmediata al problema que creía tener y me di cuenta de que me daba la pregunta que realmente estaba buscando, a lo que esta es la respuesta. – btlog