Как System.Tracelistener Prepend сообщение с именем процесса?
-
26-09-2019 - |
Вопрос
Я смотрел на использование System.diagnostics.trace для выполнения ведения журнала - очень простое приложение. Вообще это делает все, что мне нужно, чтобы сделать это. Недостатком является то, что если я позвоню
Trace.TraceInformation("Some info");
Выходная информация "Someapp.exe информация: 0: некоторая информация". Изначально это развлекало меня, но больше не. Я хотел бы просто вывести «некоторую информацию» на консоль. Поэтому я думал, что писать Tracelistener CUSOM, а не использовать встроенный консолитрацелищенер, решит проблему. Я вижу определенный формат, который я хочу, чтобы весь текст после второй кишки. Вот моя попытка увидеть, будет ли это работать.
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. Метод, который называемый My WriteLine Method: System.dll! System.Diagnostics.tracelistener.traceevent (System.diagnostics.traceeventcache EventCache.traceeventcache EventCache, String Source, System.Diagnostics.traceeventtype EventType, INT ID, String Message) + 0x33 Bytes
Когда я использую отражатель, чтобы посмотреть на это сообщение все, кажется, довольно просто. Я не вижу какой-либо код, который меняет значение строки после того, как я отправил его на Console.Writeline. Единственный метод, который могло бы поэтапно изменить базовое значение строки, является вызовом для UnafafenativeMethods.eventWriteString, который имеет параметр, который имеет указатель на сообщение.
Кто-нибудь понимает, что здесь происходит и может ли я изменить выход, чтобы быть только моим сообщением без дополнительного пуха. Кажется, что злая магия, которую я могу пройти строку «некоторую информацию» на консоль. Какрачем (или любой другой метод в этом отношении) и строку, которую вывод отличается.
Редактировать: Я нашел магию. Очевидно, это не было волшебным. Метод записи получает звонок от вызова на приписанный отчазник до вызова на WhiteLine, где я думал, что магия происходит.
Решение
Вы можете получить это, переопределив метод TraceeVent () в своем слушателе. Как это:
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) {
Console.WriteLine("{0}: {1}", id, message);
}
Другие советы
Вам также необходимо переопределить эту перегрузку Traceevent, если использование форматирования:
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType,
int id, string format, params Object[] data)
{
base.WriteLine(String.Format(format, data));
}
Например:
Trace.TraceInformation("Thread {0} Waiting", Thread.CurrentThread.ManagedThreadId);
Переопределение будет выводить вывод только «нить 9 ожидания N», когда данные [0] == 9
Почему бы не использовать Trace.WriteLine("SomeInfo")
вместо Trace.TraceInformation("SomeInfo")
?