1

エンタープライズ ライブラリ 5.0 のロギングとフィルタリングに関するドキュメントを探していましたが、エンタープライズ ライブラリ CHM 以外に、私のシナリオに関連するものは見つかりませんでした。

いくつかの種類のカテゴリがログに記録されており、ログをフィルタリングして特定のカテゴリのみを取得したいと考えています。これらのカテゴリ General、Turtle、Rhino.A、Rhino.B、Rhino.C など多くの Rhinos があるとします。

Rhino のようなカテゴリだけをピックアップしたい。__

私が行ったのは、General や Turtle 以外のものをフィルター処理したことだと思いますが、Rhino のようなものは何でもピックアップしようとします。__ これに関するいくつかのドキュメントも役に立ちます。

これが私の現在の構成です。

<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General" logWarningsWhenNoCategoriesMatch="false">
  <listeners>
    <add name="Event Log Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" source="Enterprise Library Logging" formatter="Text Formatter" log="" machineName="." traceOutputOptions="None" />
    <add name="Rolling Flat File Trace Listener"
         type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
         fileName="AppLog.log"
         formatter="Short Text Formatter" header="------------------------------------------------------" footer="------------------------------------------------------"
         rollInterval="Day" rollSizeKB="1024"
         timeStampPattern="yyyy-MM-dd"
         rollFileExistsBehavior="Increment"
         traceOutputOptions="LogicalOperationStack, DateTime" />
  </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: {timestamp(local)}{newline}App Domain: {localAppDomain}{newline}Machine: {localMachine}{newline}Title:{title}{newline}Severity: {severity}{tab}Message: {message}{newline}Category: {category}{newline}ProcessId: {localProcessId}{tab}Process Name: {localProcessName}{newline}Thread Name: {threadName}{tab}ThreadId:{win32ThreadId}&#xA;" name="Text Formatter" />
  </formatters>
  <logFilters>
    <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
      categoryFilterMode="AllowAllExceptDenied" name="Category Filter">
      <categoryFilters>
        <add name="General" />
        <add name="Turtle" />
      </categoryFilters>
    </add>
  </logFilters>
  <categorySources>
    <add switchValue="All" name="General" />
    <add switchValue="All" name="Turtle" />
  </categorySources>
  <specialSources>
    <allEvents switchValue="All" name="All Events" />
    <notProcessed switchValue="All" name="Unprocessed Category">
      <listeners>
        <add name="Rolling Flat File Trace Listener" />
      </listeners>
    </notProcessed>
    <errors switchValue="All" name="Logging Errors &amp; Warnings">
      <listeners>
        <add name="Event Log Listener" />
      </listeners>
    </errors>
  </specialSources>
</loggingConfiguration>

フィルタリングはそのように見え、General と Turtle 以外のすべてをキャプチャしています。これは機能しますが、Rhino のようなものだけをキャプチャするため、少し気になるようです。__ログに他のカテゴリが含まれていないことを完全に確認します。

<logFilters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  categoryFilterMode="AllowAllExceptDenied" name="Category Filter">
  <categoryFilters>
    <add name="General" />
    <add name="Turtle" />
  </categoryFilters>
</add>
</logFilters>
<categorySources>
    <add switchValue="All" name="General" />
    <add switchValue="All" name="Turtle" />
</categorySources>
4

1 に答える 1

3

Enterprise Library はあなたのシナリオを直接サポートしていないようです。カスタム ログ フィルタの実装が必要になる場合があります。

これは次のようになります (これはテストされていないコードです)。

using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging.Filters;
using System;
using System.Linq;

[ConfigurationElementType(typeof (CustomLogFilterData))]
public class RhinoFilter : LogFilter
{
    public RhinoFilter(string name)
        : base(name)
    {
    }

    public RhinoFilter(NameValueCollection settings) 
        : this("RhinoFilter")
    {
    }

    public override bool Filter(LogEntry log)
    {
        return log.Categories.Any(x => x.StartsWith("Rhino."));
    }
}
于 2013-05-20T13:44:37.450 に答える