Ведение журнала форматирования для прослушивателя SystemDiagnosticsTraceListenerData блока приложения ведения журнала - PullRequest
4 голосов
/ 09 августа 2010

Мне нужно выполнить запись в консоль (или отладку / трассировку). В настоящее время я использую Ent Lib 4.1 Logging Application Block. Для входа в консоль я использую SystemDiagnosticsTraceListenerData и System.Diagnostics.ConsoleTraceListener.

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

Есть ли какая-либо опция конфигурации, которую мне не хватает, чтобы включить форматирование для SystemDiagnosticsTraceListener?

Ответы [ 2 ]

8 голосов
/ 11 октября 2011

Один из способов сделать это - создать собственный TraceListener.Затем в app.config установите для listnerDataType значение CustomTraceListenerData.Это позволяет ConsoleTraceListener иметь форматированный вывод.Вывод был отформатирован как ожидалось.Без форматера все значения были возвращены.И пользовательский TraceListener, и app.config прилагаются.

Код использует 5.0.505.0 вместо 4.1, как было задано в исходном вопросе.

Этот код был взят с этого сайта: java2s firstbricks »FirstBricks» EntLib »Ведение журнала» Расширения »ConsoleTraceListener.cs ( кеш ).Комментарии были удалены, чтобы облегчить чтение кода в StackOverflow, а цвет по умолчанию был изменен с белого на серый.

namespace Eab.Logging
{
    using System;
    using System.Diagnostics;
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging;
    using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;

    [ConfigurationElementType(typeof(CustomTraceListenerData))]
    public class ConsoleTraceListener : CustomTraceListener
    {
        public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
        {
            if (data is LogEntry && Formatter != null) {
                LogEntry le = (LogEntry)data;
                WriteLine(Formatter.Format(le), le.Severity);
            } else {
                WriteLine(data.ToString());
            }
        }

        public override void Write(string message)
        {
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.Write(message);
        }

        public override void WriteLine(string message)
        {
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine(message);
        }

        public void WriteLine(string message, TraceEventType severity)
        {
            ConsoleColor color;
            switch (severity) {
                case TraceEventType.Critical:
                case TraceEventType.Error:
                    color = ConsoleColor.Red;
                    break;
                case TraceEventType.Warning:
                    color = ConsoleColor.Yellow;
                    break;
                case TraceEventType.Information:
                    color = ConsoleColor.Cyan;
                    break;
                case TraceEventType.Verbose:
                default:
                    color = ConsoleColor.Gray;
                    break;
            }

            Console.ForegroundColor = color;
            Console.WriteLine(message);
        }
    }
}

    <loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
    <listeners>
                <!-- Namespace+class, applicationName -->      
      <add  
          type="Eab.Logging.ConsoleTraceListener, Eab.Logging" 
          listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          formatter="Simple Formatter"
          name="Console Listener" />
    </listeners>
    <formatters>
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          template="{timestamp(local:[MM/dd/yyyy HH:mm:ss.fff])} : ({title}) {message}"
          name="Simple Formatter" />
    </formatters>
    <categorySources>
      <add switchValue="All" name="General">
        <listeners>
          <add name="Console Listener" />
        </listeners>
      </add>
    </categorySources>
    <specialSources>
      <notProcessed switchValue="All" name="Unprocessed Category">
        <listeners>
          <add name="Console Listener" />
        </listeners>
      </notProcessed>
      <errors switchValue="All" name="Logging Errors &amp; Warnings">
        <listeners>
          <add name="Console Listener" />
        </listeners>
      </errors>
    </specialSources>
  </loggingConfiguration>
0 голосов
/ 16 августа 2010

Я не знаю, помогает ли это (поскольку вы используете LAB), но Ukadc.Diagnostics - это набор расширений System.Diagnostics.Одним из основных дополнений (по сравнению с System.Diagnostics) является добавление возможности форматировать выходные данные журналов, аналогично тому, что можно сделать с помощью Log4net, NLog и LAB.Вы даже можете расширить возможности форматирования, написав свои собственные "токены".Токены - это объекты, вызываемые пользовательскими TraceListeners, предоставленными Ukadc.Diagnostics, чтобы получить информацию для регистрации (вместе с самим сообщением журнала).Например, я написал объект для вычисления дельты времени в миллисекундах с начала процесса.Если я включу соответствующий токен в оператор формата, каждое сообщение журнала будет содержать эту дельту.

См. Эти ссылки:

Ukadc.Diagnostics на codeplex

Блог разработчика

...