Как System.TraceListener добавляет сообщение с именем процесса? - PullRequest
7 голосов
/ 13 мая 2010

Я рассматривал использование 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, где я думал, что происходит волшебство.

Ответы [ 3 ]

4 голосов
/ 13 мая 2010

Вы можете получить это, переопределив метод TraceEvent () в вашем слушателе. Как это:

    public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) {
        Console.WriteLine("{0}: {1}", id, message);
    }
1 голос
/ 10 июля 2012

Вам также необходимо переопределить эту перегрузку 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);

Переопределение будет выводить только вывод "Thread 9 Waiting \ n", когда данные [0] == 9

0 голосов
/ 13 мая 2010

Почему бы не использовать Trace.WriteLine("SomeInfo") вместо Trace.TraceInformation("SomeInfo")?

...