3

ファイル アペンダ FileA、FileB、および FileC があります。FileA をすべてキャッチしたいので、ルート要素に追加します (これについては以下で詳しく説明します)。FileB と FileC は特定のメッセージに使用し、これらのアペンダーごとに名前付きロガーを作成します。コードでは、次のようにほとんどのメッセージに使用しているログをロードします。

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

他のロガーは、このようにロードします

private static readonly log4net.ILog commandLog = log4net.LogManager.GetLogger("LoggerFileB");

何が起きているかというと、LoggerFileB で期待どおりの結果が得られているということです。つまり、特別なメッセージのみです。問題は、これらのメッセージが、ルートに追加したキャッチオールである LoggerFileA にも表示されることです。キャッチオールをルート要素に追加する代わりに、特定の名前付きインスタンスを作成することもできますが、出力のロガー名として呼び出しタイプが必要です。名前付きロガーを作成するということは、%logger がタイプではなくログの名前を出力することを意味します。私が欲しいものを正確に取得する方法はありますか (ロガー名をタイプとして表示するキャッチオールですが、他の名前付きロガーに記録されたメッセージは表示しません)? うまくいけば、私は何かが欠けていて、簡単な解決策があります。

この状況での log.config の例を次に示します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <log4net>
        <appender name="FileA" type="log4net.Appender.RollingFileAppender">
            <file value="FileA.txt" />
            ...snip...
        </appender>
        <appender name="FileB" type="log4net.Appender.RollingFileAppender">
            <file value="FileB.txt" />
            ...snip...
        </appender>
        <appender name="FileC" type="log4net.Appender.RollingFileAppender">
            <file value="FileC.txt" />
            ...snip...
        </appender>
        <root>
            <level value="ALL" />
            <appender-ref ref="LoggerFileA" />
        </root>
        <logger name="LoggerFileB">
            <level value="ALL" />
            <appender-ref ref="FileB" />
        </logger>
        <logger name="LoggerFileC">
            <level value="ALL" />
            <appender-ref ref="FileC" />
        </logger>
    </log4net>
</configuration>
4

1 に答える 1

13

additivityを false に設定して使用できます。

<logger name="LoggerFileB" additivity="false">
于 2010-10-28T07:39:50.743 に答える