stderr 및 디버그에 오류 로깅, log4j를 사용하여 stdout에 정보 로깅
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 () ...도 stdout에 인쇄된다는 것입니다.
Per Jon Skeet의 이전 포스트 포스트
안타깝게도 최대 임계 값 이 없으므로 디버그 메시지를받을 때마다 경고 메시지도 받게됩니다. 그것은 약간의 고통입니다, IMO.
속성 파일 형식으로도 아래에서 해결되었습니다. 트릭은 필터 정의를 올바르게하는 것이 었습니다. 여기에 Log4j 속성 정보
경고 및 오류를 필터링하도록 수정 된 원래 시도 :
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
- .properties 구성을 사용하는 대신 .xml 구성을 사용해야합니다.
- .xml 구성에서 "org.apache.log4j.varia.LevelRangeFilter"유형의 "filter"라는 요소를 넣고 해당 매개 변수
LevelMax
및LevelMin
.
예를 들어 다음 .xml 구성은 stdout, stderr의 두 어 펜더를 정의합니다. 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을 참조하십시오.
another example using the ThresholdFilter
markup from log4j2.
<Console name="ConsoleERR" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
See the doc.
This is logback config which does exactly(!) what you asking for:
<?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>
Changing it to NEUTRAL and adding filter for DEBUG should let it capture DEBUG as well. There is another built-in filter which requires janino dependency:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>
<![CDATA[ level > INFO ]]>
</expression>
</evaluator>
<OnMatch>DENY</OnMatch>
<OnMismatch>NEUTRAL</OnMismatch>
</filter>
ReferenceURL : https://stackoverflow.com/questions/8489551/logging-error-to-stderr-and-debug-info-to-stdout-with-log4j
'programing' 카테고리의 다른 글
빌더 패턴 및 다수의 필수 매개 변수 (0) | 2021.01.15 |
---|---|
이 C ++ 11 정규식 오류 나 또는 컴파일러입니까? (0) | 2021.01.15 |
Haskell의 ($)는 마술 연산자입니까? (0) | 2021.01.15 |
나는“이혼”을 겪고 있습니까? (0) | 2021.01.15 |
Setup () 대 SetupGet () (0) | 2021.01.15 |