web-dev-qa-db-ja.com

log4net:特定のクラスからのメッセージを無視するように設定します

Log4net構成で特定のクラスを無視する方法はありますか?たとえば、通常、すべてのクラスでログを作成します。これに似ています:

private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");

問題は、MyClassが極端な量のデータを記録し、他のクラスに関する情報を見つけるのが難しくなることです。 MyClassを使用するもう1つの開発者は、ログファイルに移動して変更することはできませんが、私の環境ではこれらを無視したいと思います。

特定のクラスからのメッセージを無視するようにconfigurationファイルを設定できますか?

63
Kyle

もちろん、 filter。 を使用してください

ブログに投稿されたスニペットは、今後の参考のためにあります-そのブログ投稿の作者のすべての功績です。

<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- allows this sub-namespace to be logged... -->
  <loggerToMatch value="Noisy.Namespace.But.Important" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- ...but not the rest of it -->
  <loggerToMatch value="Noisy.Namespace" />
  <acceptOnMatch value="false" />
</filter>
72
jvenema

フィルターは確かに機能しますが、次のようにロガー(またはロガー階層)を直接オフにすることをお勧めします。

<logger name="YourNameSpace.WithNoLogging" additivity="false">
    <level value="OFF" />        
</logger>
<logger name="MyClass" additivity="false">
    <level value="OFF" />        
</logger>
<root>
    <level value="ALL" />
    <appender-ref ref="YourAppender" />
</root>

仮定して YourNameSpace.WithNoLoggingは名前空間であり、示された構成は名前空間全体でのロギングを無効にします。 2番目の「例」は、クラスのロギングをオフにします(質問による)。

55
Stefan Egli

Filters も使用することをお勧めします。ただし、フィルターを実装しようとして全体像を見つけるのに苦労したので、フィルターの行き先を示すConfigutation fileのサンプルスニペットを投稿しています。

この場合のフィルターは次のようになります

log4net.Filter.LoggerMatchFilter ----(ロガー名の先頭と一致します。)

HintLog4Netconfigファイルタグを配置する場所とそれらの優先順位は実際に重要です。そのため、この場合、<filter>タグは、<appender>openingタグの後、<file value = ... />タグの前に配置されます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
        <appender name="RollingFile.PassedDevices" type="log4net.Appender.RollingFileAppender">
            <filter type="log4net.Filter.LoggerMatchFilter">
                <loggerToMatch value="Foo.namespace.bar.mySubclass" />
                <acceptOnMatch value="false" />
            </filter>
            <file value="myPassedDevices.log" />
            <appendToFile value="true" />
            <maximumFileSize value="100KB" />
            <maxSizeRollBackups value="2" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%timestamp    %level  - %message  [%thread]       %logger%newline" />
            </layout>
        </appender>
        <root>
            <level value="DEBUG" />
            <appender-ref ref="RollingFile" /> <!-- My other appender which logs all and I cut it out in this snippet. Remember that you should reference all your appenders in this tag to make them work.-->
            <appender-ref ref="RollingFile.PassedDevices" />
        </root>
    </log4net>
</configuration>

この手法では、複数のappendersを使用して、特定のロガーのロギング結果を無視する代わりに、個別のappenderにリダイレクトできます。すべてのログに1つのappenderと、特定のclassにフィルターで除外されたログに1つなど。

14
Mehrad

独自のメッセージにカテゴリを適用してみてください。このスレッドを試してください。 log4netメッセージにカテゴリプレフィックスを追加する方法?

2
Orin