Log4j2 xml構成をセットアップしようとしていますが、希望する結果が得られません。コンソールでレベル情報以上を取得し、ローリングファイルアペンダー(標準)でレベルデバッグ以上を取得する必要があります。次に、コンソールアペンダーの3つのクラスを制限して、警告以上のみを受信するようにします。ただし、これらのロガーエントリを追加すると、標準のアペンダーもこれら3つのクラスの情報とデバッグレベルの受信を停止します。コンソールのみを制限し、標準を制限しないようにするにはどうすればよいですか?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/">
<appender name="console" class="org.Apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<param name="threshold" value="info" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c [%t] %X{ctx} ~ %m%n" />
</layout>
</appender>
<appender name="standard" class="org.Apache.log4j.DailyRollingFileAppender">
<param name="file" value="logs/broadcast.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="threshold" value="debug" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{DATE} %-5p %c{1} [%t] %X{ctx} ~ %m%n" />
</layout>
</appender>
<appender name="stderr" class="org.Apache.log4j.FileAppender">
<param name="file" value="logs/broadcast.err" />
<param name="threshold" value="error" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{DATE} %-5p %c{1} [%t] %X{ctx} ~ %m%n" />
</layout>
</appender>
<appender name="jlv" class="org.Apache.log4j.net.SocketAppender">
<param name="remoteHost" value="localhost"/>
<param name="port" value="4445"/>
<param name="locationInfo" value="true"/>
</appender>
<logger name="com.mydetv.broadcast.BroadcastLoop">
<level value="warn"/>
<appender-ref ref="console" />
</logger>
<logger name="com.mydetv.broadcast.BroadcastUpdate22">
<level value="warn"/>
<appender-ref ref="console" />
</logger>
<logger name="com.mydetv.broadcast.vlc.VlcRequest22">
<level value="warn"/>
<appender-ref ref="console" />
</logger>
<root>
<priority value ="debug" />
<appender-ref ref="standard" />
<appender-ref ref="stderr"/>
<appender-ref ref="console" />
<appender-ref ref="jlv"/>
</root>
</log4j:configuration>
まず、設定はlog4j2ではなくlog4j-1.x用であるように見えます。 log4j2を使用する場合は、これを変換する必要があります。 (マニュアルには、新しい構文の例が多数あります。)
当初はlog4j2ThresholdFilter( http://logging.Apache.org/log4j/2.x/manual/filters.html#ThresholdFilter )を使用する必要があると考えていましたが、これはもっと簡単かもしれません。仕方:
(ところで、以下の構成例のレイアウトパターンは、元の構成と一致させるためにまだいくつかの作業が必要です。)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"
ignoreExceptions="false">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy />
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false">
<PatternLayout pattern="%m%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.mysetv.broadcast.BroadcastLoop" level="trace" additivity="false">
<AppenderRef ref="STDOUT" level="warn" />
<AppenderRef ref="RollingFile"/>
</Logger>
... (add other named loggers here)...
<Root level="trace">
<AppenderRef ref="STDOUT" level="info" />
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
万が一、アペンダーの使用を特定のLogLevelに制限したい場合。おそらく正しい答えは、フィルターを使用することです。親切に見てください レベルの特定のロガー
カスタムGroovyスクリプトでGEventEvaluator
を使用して解決しました: http://logback.qos.ch/manual/filters.html#GEventEvaluator
<configuration>
<property name="LAYOUT" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n" />
<root>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
<expression>e.level.toInt() >= WARN.toInt()</expression>
</evaluator>
<OnMatch>ACCEPT</OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<encoder>
<pattern>${LAYOUT}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
<expression>
e.level.toInt() >= WARN.toInt() ||
(e.level.toInt() >= TRACE.toInt() && e.getLoggerName().startsWith("my.package"))
</expression>
</evaluator>
<OnMatch>ACCEPT</OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<encoder>
<pattern>${LAYOUT}</pattern>
</encoder>
<File>target/log/test-log</File>
<append>false</append>
</appender>
</root>
</configuration>
これは信じられないので、単純なユースケースはデフォルトではサポートされていません。
この依存関係を追加すると、問題が解決しました。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>