Формат вывода трассировки в System.Diagnostics.TraceSource

Следующий код:

static void Main(string[] args)
{
    TraceSource ts = new TraceSource("MyApplication");

    ts.Switch = new SourceSwitch("MySwitch");
    ts.Switch.Level = SourceLevels.All;

    ts.Listeners.Add(new TextWriterTraceListener(Console.Out));

    ts.TraceInformation("Hello World");
    Console.ReadKey();
}

генерирует следующий вывод:

Информация о MyApplication: 0: Hello World

Часть "Информация о MyApplication: 0:" в начале вывода трассировки поступает из самого класса TraceSource.

Однако мне нужно иметь временную метку в начале строки, и я также хотел бы изменить "Информация" на "Информация".

Есть ли способ получить больше свободы в выходе трассировки, чтобы я мог настроить его как:

13:03:00 - MyApplication Информация: Hello World

Я пробовал пару часов, но безуспешно. Независимо от того, что я делаю, в начале выходной строки всегда есть постоянная предопределенная информация "Информация о MyApplication: 0: Hello World".

Документация MSDN также не раскрывает никакой полезной информации.

Ответы

Ответ 1

Установите свойство TraceOutputOptions на прослушиватель трассировки. Формат предопределен, но вы можете выбрать дополнительные части данных, определенные в перечислении TraceOptions.

Ответ 2

TraceSource.TraceInformation завершает вызов TraceListener.TraceEvent на каждом слушателе, который добавляется в заголовок. К счастью, TraceListener имеет метод WriteLine, который можно использовать для создания пользовательского вывода.

static void Main(string[] args)
{
    TraceSource ts = new TraceSource("MyApplication");

    ts.Switch = new SourceSwitch("MySwitch");
    ts.Switch.Level = SourceLevels.All;

    ts.Listeners.Add(new TextWriterTraceListener(Console.Out));

    for (int i = 0; i < ts.Listeners.Count; i++)
    {
        var listener = ts.Listeners[i];

        listener.WriteLine(
            string.Format("{0} - {1} Info: {2}",
            DateTime.Now.ToString("HH:mm:ss"), ts.Name, "Hello World"));
        listener.Flush();
    }
    Console.ReadKey();
}

Вывод:

13:52:05 - MyApplication Информация: Hello World

Ответ 3

Прибытие в конце также, но в случае, если здесь кто-то приземлится...

Мне нравится держать его простым. Я использую один статический метод Trace в моем приложении App.cs, который связан с одним TraceSource, который я создаю при запуске. Это позволяет мне получить доступ к нему во всем приложении и сохранить простой app.config:

public static void Trace(TraceEventType eventType, string message)
{
    if (_TraceSource.Switch.ShouldTrace(eventType))
    {
        string tracemessage = string.Format("{0}\t[{1}]\t{2}", DateTime.Now.ToString("MM/dd/yy HH:mm:ss"), eventType, message);
        foreach (TraceListener listener in _TraceSource.Listeners)
        {
            listener.WriteLine(tracemessage);
            listener.Flush();
        }
    }
}

Мои записи app.config:

  <system.diagnostics>
    <sources>
      <source name="mytracesource" switchValue="All">
        <listeners>
          <add name="mytracelistener"
               type="System.Diagnostics.TextWriterTraceListener"
               initializeData="trace.log">
          </add>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Ответ 4

Возможно, немного поздно, но если вам нужно простое и универсальное решение, вы должны взглянуть на проект Essentials Diagnostics на CodePlex (также доступен через NuGet).

Он определяет широкий диапазон слушателей (с разрешенным пользовательским форматированием), которые выводятся на консоль, скользящий текст и файлы XML, журналы событий, электронная почта и т.д. и также содержат образцы конфигурации.