使用log4j将错误记录到stderr并调试,将信息记录到stdout

Elv*_*vis 55 java logging log4j

我想使用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
Run Code Online (Sandbox Code Playgroud)

那么我的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
Run Code Online (Sandbox Code Playgroud)

上述配置的问题是logger.error()...也在stdout上打印.

Jon*_*lin 47

以下也以属性文件格式解决.诀窍是让过滤器定义正确.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
Run Code Online (Sandbox Code Playgroud)

  • 您确定过滤器可以像这样应用于第一个附加程序吗?我使用 .properties 文件没有任何运气 (2认同)
  • 找到答案:它似乎在1.2.16和1.2.17中的属性文件中受支持,但在此之前不支持(/sf/ask/261124041/). (2认同)

Joh*_*n B 12

Per Jon Skeet在Post上发过的帖子

遗憾的是,没有最大阈值,因此无论何时获得调试消息,您都会收到警告消息.IMO,这有点痛苦.


Rae*_*ald 8

  1. 而不是使用.properties配置,您必须使用.xml配置.
  2. 在.xml配置中,放置一个名为"filter"的元素"org.apache.log4j.varia.LevelRangeFilter"并设置其参数LevelMaxLevelMin.

例如,以下.xml配置定义了两个appender: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>
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请访问:http://www.laliluna.de/articles/posts/log4j-tutorial.html


Aur*_*ien 6

使用 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>
Run Code Online (Sandbox Code Playgroud)

请参阅文档