Я рассматривал использование System.Diagnostics.Trace для ведения журналов - очень простое приложение.Как правило, это все, что мне нужно сделать.Недостатком является то, что если я позвоню
Trace.TraceInformation("Some info");
, то получится «SomeApp.Exe Information: 0: Some info».Первоначально это развлекало меня, но больше не.Я хотел бы просто вывести «Некоторую информацию» на консоль.Поэтому я подумал, что написание 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.Если я ставлю точку останова, сообщение всегда просто «Некоторая информация».Откуда берется вся остальная информация?
Итак, я посмотрел на стек вызовов непосредственно перед вызовом Console.WriteLine.Метод, который вызвал мой метод WriteLine: System.dll! System.Diagnostics.TraceListener.TraceEvent (System.Diagnostics.TraceEventCache eventCache, строковый источник, System.Diagnostics.TraceEventType eventType, int id, строковое сообщение) + 0x33 байта
Когда я использую Reflector, чтобы посмотреть на это сообщение, все кажется довольно простым.Я не вижу кода, который изменяет значение строки после того, как я отправил его в Console.WriteLine.Единственный метод, который может явно изменить базовое строковое значение, - это вызов UnsafeNativeMethods.EventWriteString, у которого есть параметр, который является указателем на сообщение.
Кто-нибудь понимает, что здесь происходит, и могу ли я изменитьвывод будет просто мое сообщение без дополнительного пуха.Это похоже на злую магию, что я могу передать строку «Некоторая информация» в Console.WriteLine (или любой другой метод в этом отношении), и строка, которая выводит другое.
РЕДАКТИРОВАТЬ: я нашел магию.Очевидно, это не было волшебством.Метод Write получает вызов от вызова WriteHeader перед вызовом WriteLine, где я думал, что происходит волшебство.