如何使用企业库日志记录仅写入调试输出的消息?

14

我想使用EntLib Logging实现日志记录,并为类别“Debugging”连接两个TraceListener。其中一个将这些消息写入文件,另一个将它们输出到系统跟踪输出,以与Debug.Write相同的方式进行监视(以便我可以使用Sysinternals DbgView监视它们),但我找不到如何设置所需格式化程序的第二个侦听器。我真正需要的只是消息,但它会输出整个一堆内容,如EventId,Priority等。如何削减所有这些内容?

2个回答

17

我在MSDN上找到了一个不错的指南: 创建自定义跟踪侦听器

它完全满足我的需求。下面是我最终的完整代码:

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;

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

        public override void Write(string message)
        {
            Debug.Write(message);
        }

        public override void WriteLine(string message)
        {
            Debug.WriteLine(message);
        }

    }
}

配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
    <listeners>
      <add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        traceOutputOptions="None" type="Common.Utils.FormattedDebugWriterTraceListener, Common.Utils"
        name="FormattedDebugWriterTraceListener" initializeData="" formatter="SimpleMessageFormatter" />
      <add fileName="log\Debugging.log" rollSizeKB="0" timeStampPattern="yyyy-MM-dd"
        rollFileExistsBehavior="Overwrite" rollInterval="Week" formatter="GeneralTextFormatter"
        header="----------------------------------------" footer="----------------------------------------"
        listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        traceOutputOptions="None" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        name="RollingFlatFileTraceListener" />
    </listeners>
    <formatters>
      <add template="{message}&#xD;&#xA;" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        name="SimpleMessageFormatter" />
      <add template="Timestamp: {timestamp}&#xD;&#xA;Message: {message}&#xD;&#xA;Category: {category}&#xD;&#xA;Priority: {priority}&#xD;&#xA;EventId: {eventid}&#xD;&#xA;Severity: {severity}&#xD;&#xA;Title:{title}&#xD;&#xA;Machine: {machine}&#xD;&#xA;Application Domain: {appDomain}&#xD;&#xA;Process Id: {processId}&#xD;&#xA;Process Name: {processName}&#xD;&#xA;Win32 Thread Id: {win32ThreadId}&#xD;&#xA;Thread Name: {threadName}&#xD;&#xA;Extended Properties: {dictionary({key} - {value}&#xD;&#xA;)}"
        type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        name="GeneralTextFormatter" />
    </formatters>
    <categorySources>
      <add switchValue="All" name="Debugging">
        <listeners>
          <add name="FormattedDebugWriterTraceListener" />
          <add name="RollingFlatFileTraceListener" />
        </listeners>
      </add>
      <add switchValue="All" name="General" />
    </categorySources>
    <specialSources>
      <allEvents switchValue="All" name="All Events" />
      <notProcessed switchValue="All" name="Unprocessed Category" />
      <errors switchValue="All" name="Logging Errors &amp; Warnings" />
    </specialSources>
  </loggingConfiguration>
</configuration>

使用方法如下:

Debug.Write("Debug.Write test");
Logger.Write("EntLib test", "Debugging");

两者最终都会以易于通过DbgView进行追踪的调试输出形式结束。


非常感谢您包含XML - 它极大地帮助了我解决了无法从演示中解决的问题!(我没有看到他们提到设置侦听器数据类型属性的地方,这让我疯狂) - GrahamMc

0
在您的应用程序的 EntLib 配置中,您可以指定要使用哪个格式化器。默认格式化器包括所有这些信息。如果您不想要某些信息,则可以从当前正在使用的 TextFormatter 中删除它们,或者创建一个包含您想要的字段的新文本格式化器,并将“调试”更改为使用您的新格式化器。

2
这正是我所做的,但似乎DefaultTraceListener不支持格式化程序。 - bychkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接