Подтвердить что ты не робот

Форматирование вывода трассировки

Я использую TextWriterTraceListener для записи диагностических сообщений в текстовый файл. Однако я также не должен регистрировать временную метку каждого сообщения трассировки. Можно ли определить тип форматера для слушателя, который автоматически добавит метки времени?

В настоящее время я добавляю временные метки вручную при каждом вызове Trace.WriteLine(), но это не очень удобно.

4b9b3361

Ответ 1

Я предлагаю вместо этого использовать Log4Net, который имеет гораздо большую настраиваемость.

В качестве альтернативы вы можете написать свою собственную реализацию TraceListener, которая помещает отметки времени для вас. Вы даже можете просто извлечь из TextWriterTraceListener и переопределить Write и WriteLine:

public override void Write(string x)
{
     // Use whatever format you want here...
     base.Write(string.Format("{0:r}: {1}", DateTime.UtcNow, x));
}

public override void WriteLine(string x)
{
     // Use whatever format you want here...
     base.WriteLine(string.Format("{0:r}: {1}", DateTime.UtcNow, x));
}

Ответ 2

Недавно я столкнулся с подобной ситуацией, и теперь похоже, что у нас есть инструмент, очень подходящий для задачи, а именно Essential Diagnostics. Вы установили слушателя в app.config, как в коде ниже, а затем просто поместите Essential.Diagnostics.dll в ту же папку. НЕТ РЕКОМПИПИРОВАНИЯ НЕОБХОДИМО. Вы можете использовать это с любыми приложениями, использующими System.Diagnostics для отслеживания, даже если вы не являетесь владельцем источника. Разве это не чудесно?

<sharedListeners>
  <add name="rollingfile"
    type="Essential.Diagnostics.RollingFileTraceListener, Essential.Diagnostics"
    initializeData="{ApplicationName}-{DateTime:yyyy-MM-dd}.log"
    convertWriteToEvent="true" 
    template="{DateTime:yyyy-MM-dd HH:mm:ss.fff} {Message}{Data}"
  />
</sharedListeners>

Ответ 3

Вы можете написать свой собственный подкласс TextWriterTraceListener, который переопределяет методы WriteLine, украшает строку и затем передает украшенную строку в реализацию базового класса для выполнения фактического вывода.

Ответ 4

Или просто добавьте "DateTime" в качестве traceOutputOption.

Ответ 5

Даже если это старо и ответ принят, я добавлю еще один вариант. Вы можете использовать дополнение Ukadc.Diagnostics от codeplex. Помимо всего прочего, он позволяет вам определять настраиваемое форматирование, аналогичное форматированию, которое вы можете определить с помощью log4net и NLog. Это зависимость от конфигурации. То есть вы настраиваете использование Ukadc.Diagnostics через файл app.config. Нет исходных зависимостей (вы продолжаете регистрироваться через System.Diagnostics не через специальный api). Сказав это, есть некоторые ограничения, о которых вы должны знать:

  • Параметры форматирования, которые в настоящее время реализованы в Ukadc.Diagnostics, действительно работают корректно только при регистрации в TraceSources. При регистрации в Trace.Write и Trace.WriteLine объект TraceEventCache не заполняется, и именно там большинство объектов форматирования получают свою информацию.

  • Для получения пользовательского форматирования на вашем выходе вы должны использовать TraceListener (или пользовательский прослушиватель, полученный из базы данных Ukadc.Diagnostics TraceListener). Если вы нашли новый файл Superceer TraceListener, вам придется сделать некоторую работу, чтобы использовать его в сочетании с форматированием Ukadc.Diagnostics. Это может быть так же сложно, как повторное прослушивание слушателя в терминах базы данных ScadListener. Или это может быть проще, если бы вы могли просто создать новый TraceListener, основанный на стандарте Ukadc.Diagnostics, который содержит супер-пупер, скользящий TraceListener, форматирует сообщения на Ukadc.Diagnostics, а затем делегирует доступным методам Write/WriteLine слушателя.

Ответ 6

Не совсем ответ на ваш вопрос, но вы считали, что используете log4Net?

Вы можете настроить его для добавления времени и т.д. вместе с огромным количеством других полезных функций.