Apache log4jを使用して、開発中のアプリケーションにロギングを追加します。この時点で、レベルINFO以下のすべてのログメッセージ(TRACE、DEBUG)をstdoutにリダイレクトし、その他すべてのログメッセージをWARN以上(ERROR、FATAL)からstderrにリダイレクトします。例えば:
...
logger.info("Processing at some point"); // must be written to stdout
logger.debug("Point x was processed"); // must be written to stdout
logger.warn("Incorrect point config"); // must be written only to stderr
logger.error("Exception occurred at point x"); // must be written only to stderr
それでは、私のlog4j.propertiesファイルはどうあるべきでしょうか?ここでは、この情景をどのように見ていますか:
log4j.rootLogger=DEBUG, stdout, stderr
# configure stdout
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stdout = org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
# configure stderr
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stderr = org.Apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold = WARN
log4j.appender.stderr.Target = System.err
log4j.appender.stderr.layout = org.Apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
上記の構成の問題は、logger.error()...が標準出力にも出力されることです。
Post のJon Skeetの以前の投稿ごと
残念ながら、maximumのしきい値はないため、デバッグメッセージが表示される場合は常に、警告メッセージも表示されます。 IMO、それは少し苦痛です。
以下もプロパティファイル形式で解決しました。トリックは、フィルター定義を正しくすることでした。 ここにLog4jのプロパティ情報
WARNおよびERRORをフィルタリングするために変更された元の試み:
log4j.rootLogger=TRACE, stdout, stderr
# configure stdout
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stdout = org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = TRACE
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
log4j.appender.stdout.filter.filter1=org.Apache.log4j.varia.LevelRangeFilter
log4j.appender.stdout.filter.filter1.levelMin=TRACE
log4j.appender.stdout.filter.filter1.levelMax=INFO
# configure stderr
# set the conversion pattern of stdout
# Print the date in ISO 8601 format
log4j.appender.stderr = org.Apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold = WARN
log4j.appender.stderr.Target = System.err
log4j.appender.stderr.layout = org.Apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n
LevelMax
およびLevelMin
を設定します。たとえば、次の.xml構成では、stdout、stderrの2つのアペンダーを定義しています。 stdoutは、INFO以下のレベルを持つすべてのログをstdoutに出力し、stderrはINFOより大きいレベルのすべてのログをstderrに出力します。
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : log4j.xml
Created on : 13 Δεκέμβριος 2011, 3:55 μμ
Author : elitex
Description : Purpose of the document follows.
-->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="stderr" class="org.Apache.log4j.ConsoleAppender">
<param name="threshold" value="warn" />
<param name="target" value="System.err"/>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" />
</layout>
</appender>
<appender name="stdout" class="org.Apache.log4j.ConsoleAppender">
<param name="threshold" value="debug" />
<param name="target" value="System.out"/>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" />
</layout>
<filter class="org.Apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="debug" />
<param name="LevelMax" value="info" />
</filter>
</appender>
<root>
<priority value="debug"></priority>
<appender-ref ref="stderr" />
<appender-ref ref="stdout" />
</root>
</log4j:configuration>
詳細については、以下を参照してください。 http://www.laliluna.de/articles/posts/log4j-tutorial.html
log4j2のThresholdFilter
マークアップを使用した別の例。
<Console name="ConsoleERR" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
doc を参照してください。
これはあなたが求めていることを正確に(!)するログバック設定です:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root level="${LOGBACK_ROOT_LEVEL:-INFO}">
<appender-ref ref="STDOUT" />
<appender-ref ref="STDERR" />
</root>
</configuration>
これをNEUTRALに変更し、DEBUGのフィルターを追加すると、DEBUGもキャプチャできるようになります。 janino 依存関係を必要とする別の組み込みフィルターがあります。
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>
<![CDATA[ level > INFO ]]>
</expression>
</evaluator>
<OnMatch>DENY</OnMatch>
<OnMismatch>NEUTRAL</OnMismatch>
</filter>