格式化Logging Application Block的SystemDiagnosticsTraceListenerData侦听器的日志记录

时间:2010-08-09 18:06:07

标签: .net logging enterprise-library

我需要执行日志记录到控制台(或调试/跟踪)。目前我正在使用Ent Lib 4.1 Logging Application Block。要登录到控制台,我使用SystemDiagnosticsTraceListenerData和System.Diagnostics.ConsoleTraceListener。

它可以很好地执行日志记录到控制台,但是我无法为此lister类型使用格式化程序,因此无法将日志条目格式化为所需的格式。我需要的只是日志消息,没有默认提供的所有附加信息(这使得日志对我的情况不太可读)。

我是否缺少任何配置选项来启用SystemDiagnosticsTraceListener的格式化?

2 个答案:

答案 0 :(得分:8)

实现此目的的一种方法是创建自定义TraceListener。然后在app.config中将listnerDataType设置为CustomTraceListenerData。这允许ConsoleTraceListener具有格式化输出。输出格式符合预期。如果没有格式化程序,则返回所有值。自定义TraceListener和app.config都已附加。

代码使用5.0.505.0而不是原始问题提出的4.1。

此代码来自此网站:java2s firstbricks » FirstBricks » EntLib » Logging » Extensions » ConsoleTraceListener.cscache)。 删除了注释以使代码更容易在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>

答案 1 :(得分:0)

我不知道这是否有帮助(因为您正在使用LAB),但Ukadc.Diagnostics是一组System.Diagnostics扩展。一个主要的补充(与System.Diagnostics相比)增加了格式化日志输出的功能,类似于Log4net,NLog和LAB可以实现的功能。您甚至可以通过编写自己的“令牌”来扩展格式化功能。标记是由Ukadc.Diagnostics提供的自定义TraceListeners调用的对象,用于获取要记录的信息(以及日志消息本身)。例如,我写了一个对象来计算自进程开始以来以毫秒为单位的时间增量。如果我在format语句中包含相应的标记,则每条日志消息都将包含该delta。

请参阅以下链接:

Ukadc.Diagnostics on codeplex

The developer's blog