【发布时间】:2021-07-26 22:42:07
【问题描述】:
我在我的 Java 项目中使用 log4j2,并希望在 linux 控制台上过滤错误日志。
log4j2配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="pattern">[%d{yyyy-MM-dd HH:mm:ss.SSS}][%highlight{%-5level}][%t][%logger] %msg%n</Property>
</Properties>
<Appenders>
<Console name="stdout" target="SYSTEM_OUT"> <!-- 1 -->
<PatternLayout pattern="${pattern}"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/> <!-- 3 -->
</Console>
<Console name="stderr" target="SYSTEM_ERR"> <!-- 2 -->
<PatternLayout pattern="${pattern}"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 3 -->
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="stdout"/> <!-- 4 -->
<AppenderRef ref="stderr"/> <!-- 4 -->
</Root>
</Loggers>
</Configuration>
(在这里找到:https://rmannibucau.metawerx.net/log4j2-error-log-event-on-stderr.html)
当我通过命令行运行我的程序时
java -jar program.jar 2>&1 >/dev/null
stdout 被重定向到 /dev/null,而 stderr 被打印在屏幕上。 (好的)
奇怪的是,我的 LOGGER.error("...") 跟踪也被重定向到 /dev/null(这意味着它已登录 linux 标准输出)(NOK),同时在我的 Eclipse 控制台(OK)上显示为红色(错误)。
我是否遗漏了什么,或者为什么我的 log4j2 标准错误记录器没有记录到 linux 标准错误?
【问题讨论】:
-
重定向是从右到左读取的,因此在您的情况下,stdout 将被重定向到 dev/null 和 stderr 到 stdout。要仅将 stderr 重定向到 dev null 使用
java -jar program.jar 2>/dev/null -
我想将 stdout 重定向到
/dev/null并且只打印 stderr 但是程序本身应该打印每个日志(信息和更高版本)
标签: java linux logging command-line log4j2