Как System.Tracelistener Prepend сообщение с именем процесса?

StackOverflow https://stackoverflow.com/questions/2826211

  •  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") ?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top