使用 log4j 将错误记录到 stderr 和调试,将信息记录到 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() … 也在标准输出中打印。

原文由 Elvis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 644
2 个回答

Per Jon Skeet 在 Post 上的前一篇文章

不幸的是,没有 最大 阈值,所以无论您在哪里收到调试消息,您也会收到警告消息。 IMO,这有点痛苦。

原文由 John B 发布,翻译遵循 CC BY-SA 3.0 许可协议

下面也以属性文件格式解决。诀窍是正确定义过滤器。 此处的 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

原文由 Jonas Berlin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题