2009-07-23 11 views
14

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

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

ответ

15

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

В качестве альтернативы вы могли бы написать свою собственную реализацию TraceListener, которая помещает отметки времени для вас. You может даже быть в состоянии только вывести из 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)); 
} 
1

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

-1

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

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

1

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

+4

Как написано на http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.traceoutputoptions.aspx этот параметр не используется '' Write' и методов WriteLine' из ' TextWriterTraceListener', что делает его бесполезным в моем случае – RaYell

0

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

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

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

12

Я недавно столкнулся с подобной ситуацией, и, похоже, теперь у нас есть инструмент очень много подходит для выполнения этой задачи, а именно 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> 
+0

Самый простой способ установить это через NuGet: Install-Package Essential.Diagnostics.RollingFileTraceListener (Примечание: я являюсь хранителем Essential.Diagnostics) –

+0

Кроме того, я думал, что буду указывать параметр «convertWriteToEvent» преобразует Write и WriteLine для отслеживания событий, поэтому они также получают временную метку. (Хотя, вероятно, лучше использовать TraceSource, а не статические методы в Trace.) –

+0

Essential Diagnostics была перенесена из кода в github. Обновить ссылку: https://github.com/sgryphon/essential-diagnostics – dimaaan