Я смотрел на использование Системы. Диагностика. Трассировка для того, чтобы сделать вход является очень простым приложением. Обычно это делает все, что мне нужен он, чтобы сделать. Оборотная сторона - это, если я звоню
Trace.TraceInformation("Some info");
Вывод является "информацией о SomeApp.Exe: 0: Некоторая информация". Initally это развлекало меня, но больше. Я хотел бы просто произвести "Некоторую информацию" к консоли. Таким образом, я думал, пишущий, что cusom TraceListener, вместо того, чтобы использовать встроенный ConsoleTraceListener, решит проблему. Я вижу определенный формат, что я хочу весь текст после второго двоеточия. Вот моя попытка видеть, работало ли это.
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);
}
}
Если я произвел значение firstColon, это всегда-1. Если я поместил точку останова, сообщение является всегда просто "Некоторой информацией". Куда все другие информация прибывает из?
Таким образом, я взглянул на стек вызовов в точке незадолго до Консоли. WriteLine назвали. Метод, который названный моим методом WriteLine: System.dll! Система. Диагностика. TraceListener. TraceEvent (Система. Диагностика. TraceEventCache eventCache, строковый источник, Система. Диагностика. TraceEventType eventType, международный идентификатор, представляет сообщение в виде строки), + 0x33 байта
Когда я использую Отражатель для рассмотрения этого сообщения, все это кажется довольно прямым. Я не вижу кода, который изменяет значение строки после того, как я отправил его в Консоль. WriteLine. Единственный метод, который мог возможно изменить базовое строковое значение, является вызовом к UnsafeNativeMethods. EventWriteString, который имеет параметр, который является указателем на сообщение.
Делает любой понимает то, что продолжается здесь и могу ли я изменить вывод, чтобы быть просто моим сообщением с дополнительным пухом. Это походит на злое волшебство, что я могу передать строку "Некоторая информация" Консоли. WriteLine (или любой другой метод в этом отношении) и строка, которые производят, отличается.
Править: Я нашел волшебство. Очевидно, это не было волшебно. Метод записи получает вызов от вызова до WriteHeader перед вызовом к WriteLine, который является, где я думал, что волшебство происходило.
Вы можете получить это, переопределив метод TraceEvent () в вашем слушателе. Примерно так:
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) {
Console.WriteLine("{0}: {1}", id, message);
}
Почему бы не использовать Trace.WriteLine ("SomeInfo")
вместо Trace.TraceInformation ("SomeInfo")
?