web-dev-qa-db-ja.com

Log4j2アペンダーで特定のレベルをフィルタリングする

Apenderでログに記録する特定のレベルを定義するには、どのフィルターを使用する必要がありますか?例えば:

Java:

LOGGER.debug("Debug message");
LOGGER.info("Info message");
LOGGER.warn("Warn message");
LOGGER.error("Error message");
LOGGER.fatal("Fatal message");

log4j2.xml:

<Configuration>
    <Appenders>
        <Console name="info-stdout-message">
            <PatternLayout pattern="[%logger{36}] %message %n" />
            <ThresholdFilter level="info"/>
        </Console>

        <Console name="detailed-stdout-message">
            <PatternLayout pattern="[%logger{36}] [%level] %message %n" />
        </Console>

        <File name="file-appender" fileName="logs/debug.log">
            <PatternLayout pattern="%d{HH:mm:ss dd.mm} [%t] [%-5level] %logger{36} - %msg %n" />
        </File>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="file-appender" level="debug" />
            <AppenderRef ref="info-stdout-message" level="info"/>
            <AppenderRef ref="detailed-stdout-message" level="info"/>
        </Root>
    </Loggers>
</Configuration>

ファイル出力は問題ありませんが、コンソールでは次のような結果になります。

[application.Main] [INFO] Info message
[application.Main] Info message
[application.Main] [WARN] Warn message
[application.Main] Warn message
[application.Main] [ERROR] Error message
[application.Main] Error message
[application.Main] [FATAL] Fatal message
[application.Main] Fatal message

しかし、INFOメッセージのみを出力するにはinfo-stdout-messageアペンダーが必要ですが、すべてのEXEPTINFOを出力するにはdetailed-stdout-messageが必要です。したがって、コンソール出力は次のようになります。

[application.Main] Info message
[application.Main] [WARN] Warn message
[application.Main] [ERROR] Error message
[application.Main] [FATAL] Fatal message

フィルタがレベルの継承を尊重するのを防ぐ方法がわかりません。これを行うことは可能ですか?

9
ovnia

これは機能します:

<Console name="info-stdout-message">
    <PatternLayout pattern="[%logger{36}] %message %n" />
    <Filters>

        <!-- Now deny warn, error and fatal messages -->
        <ThresholdFilter level="warn"  onMatch="DENY"   onMismatch="NEUTRAL"/>

        <!-- This filter accepts info, warn, error, fatal and denies debug/trace -->
        <ThresholdFilter level="info"  onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
</Console>
14
Remko Popma

ここに2つのコンソールアペンダーがあります。 1つはすべてのトレース、デバッグ、および情報レベルをstd_outに記録し、もう1つはすべての警告、エラー、および致命的なレベルをstd_errに記録します。これは非常に便利です。 std_errが赤で表示されるため、Eclipse内。

<Console name="STDOUT" target="SYSTEM_OUT">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" />
    <Filters>
        <ThresholdFilter level="warn" onMatch="DENY" onMismatch="ACCEPT" />
    </Filters>
</Console>

<Console name="STDERR" target="SYSTEM_ERR">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} (%6r) %-5p [%-7t] %F:%L %x - %m%n" />
    <Filters>
        <ThresholdFilter level="WARN" onMatch="ACCEPT" />
    </Filters>
</Console>
17
Heri

Log4j2.xml構成ファイルを介してLogLevelsの範囲をフィルター処理する方法を理解するのに非常に長い時間がかかりました。結局、これは私のために働いた:

<Filters>
    <ThresholdFilter level="trace" />
    <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
</Filters>

この場合、Log4JはLevel.TRACEからLevel.DEBUGへのすべてのメッセージをログに記録し、Level.DEBUGより下のすべてのレベルは無視されます。

2
downdrown

https://logging.Apache.org/log4j/2.0/manual/filters.html ですべてのlog4j2フィルタリングの可能性を確認してください

サンプル構成フラグメント

...    
<Console name="DEFAULT" target="SYSTEM_OUT">
    <PatternLayout>
        <Pattern>[%d][%p][%c:%L:%M] - %m%n</Pattern>
    </PatternLayout>
    <Filters>
        <RegexFilter regex="(?s).*(sql01|sql02|sql03).*" onMatch="DENY" onMismatch="NEUTRAL"/>
    </Filters>
</Console>
...
1
myset

実際、あなたの質問から、2つの異なるアペンダーは必要ないように見えますが、異なる状況で使用されている2つの異なるパターンが必要です。そのためには、PatternSelectorを使用する必要があります。

    <Console name="stdout-message">
      <ScriptPatternSelector defaultPattern="[%logger{36}] [%level] %message %n">
        <Script name="BeanShellSelector" language="bsh"><![CDATA[
          if (logEvent.getLevel() == Level.INFO) {
            return "INFO";
          } else {
            return null;
          }]]>
        </Script>
        <PatternMatch key="INFO" pattern="[%logger{36}] %message %n"/>
       </ScriptPatternSelector>
    </Console>
0
rgoers