gpt4 book ai didi

java - Log4j 为每个附加程序设置不同的日志记录级别

转载 作者:行者123 更新时间:2023-11-30 06:19:13 26 4
gpt4 key购买 nike

我正在使用Log4j 2记录我的应用程序的事件。但是我遇到了以下问题。

当前所有日志消息都被写入两个不同的附加程序。一个有RollingFile类型,而另一个有 Console类型。

我想要的是 RollingFile 附加程序记录具有 INFO 级别或更高级别(ERROR、FATAL)的消息,并让控制台附加程序记录具有 ERROR 级别或更高级别(FATAL)的消息。

在我的 log4j2.xml 文件中,我似乎只能声明整个记录器(包括其所有附加程序)的日志记录级别。这是我的 log4j2.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%d %level %msg%n</Pattern>
</PatternLayout>
</Console>

<RollingFile name="Log" fileName="log/Log.log" filePattern="log/Log-%d{yyyy-MM-dd}-%i.log" append="false">
<PatternLayout>
<Pattern>%d %level %msg%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>

<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="Log" />
</Root>
</Loggers>
</Configuration>

有没有简单的方法可以做到这一点?我搜索了 log4j 文档,但找不到我要找的内容(也许我错过了?)。如果可能的话,我真的希望该解决方案适用于任何附加程序的类型;不特定于 RollingFile 和 Console。

编辑:

我看到很多问题,要求将特定级别的消息写入文件,同时将不同级别的消息写入不同的文件。就我而言,我需要将特定级别的消息写入不同的文件。例如,在我提供级别为 ERROR 或 FATAL 的消息的情况下,将写入 RollingFile 和 Console,而级别为 INFO 的消息将仅写入 RollingFile。

最佳答案

要限制 log4j2 中特定附加程序的日志记录级别,您应该使用 ThresholdFilter附加程序的元素。

在您的情况下,log4j2.xml 文件将如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>%d %level %msg%n</Pattern>
</PatternLayout>
</Console>

<RollingFile name="Log" fileName="log/Log.log" filePattern="log/Log-%d{yyyy-MM-dd}-%i.log" append="false">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>%d %level %msg%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>

<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="Log" />
</Root>
</Loggers>
</Configuration>

这是一个简单的测试:

public class Log4jTest {
private static final Logger logger = LogManager.getLogger(Log4jTest.class);

public static void main(String[] args) {
logger.debug("Debug");
logger.info("Info");
logger.warn("Warning");
logger.error("Error");
logger.fatal("Fatal");
}
}

控制台输出:

2020-02-25 12:33:50,587 ERROR Error
2020-02-25 12:33:50,589 FATAL Fatal

Log.log内容:

2020-02-25 12:33:50,585 INFO Info
2020-02-25 12:33:50,587 WARN Warning
2020-02-25 12:33:50,587 ERROR Error
2020-02-25 12:33:50,589 FATAL Fatal

在 log4j 的第一个版本中,它是附加程序的 Threshold 属性。关于如何在log4j中解决相同问题see the answer on question .

在过滤器的帮助下,Log4j2 允许将输出配置到特定的附加程序,比 log4j 更加灵活。

关于java - Log4j 为每个附加程序设置不同的日志记录级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48541989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com