当前位置: 首页 > 知识库问答 >
问题:

log4j2:将错误级别记录到特定文件中

夏侯渊
2023-03-14

在我的log4j2配置中,我将一个AsyncRoot设置为INFO,因为我想在一个文件中记录这个级别和更高的级别。

但我也希望将错误级别记录到特定的文件和在AsyncRoot中配置的appender中

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
    <Appenders>
        <RollingFile name="file" fileName="${LOG_PATH}/${APP_NAME}.log" filePattern="${LOG_PATH}/${APP_NAME}-${FILE_PATTERN_TRAILER}.log">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>
        <RollingFile name="errorFile" fileName="${LOG_PATH}/${APP_NAME}-errors.log" filePattern="${LOG_PATH}/${APP_NAME}-errors-${FILE_PATTERN_TRAILER}.log">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <AsyncRoot level="INFO">
            <AppenderRef ref="file"/>
        </AsyncRoot>

        <AsyncLogger level="ERROR">
            <AppenderRef ref="errorFile"/>
        </AsyncLogger>
    </Loggers>
</Configuration>
    null

谢谢你

共有1个答案

宦子琪
2023-03-14

您可以通过将root记录器的级别设置为info来实现您想要的,因为您不希望任何tracedebug事件到达您的附加程序。将错误文件追加器上的级别设置为错误,以便仅将该级别或更特定的事件写入文件。

这里有一个简单的示例,您可以根据自己的需要进行调整:

Java类生成一些日志事件

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();   

    public static void main(String[] args){
        log.debug("This is some debug!");
        log.info("Here's some info!");
        log.error("Some error happened!");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <File name="ErrorFile" fileName="logs/errors.log" immediateFlush="false"
            append="false">
            <PatternLayout
                pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>

        <File name="InfoFile" fileName="logs/Info.log" immediateFlush="false"
            append="false">
            <PatternLayout
                pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="InfoFile" />
            <AppenderRef ref="ErrorFile" level="error" />
        </Root>
    </Loggers>
</Configuration>
2019-12-04 10:05:34.672 [main] ERROR example.SomeClass - Some error happened!

信息日志包含信息和错误事件:

2019-12-04 10:05:34.670 [main] INFO  example.SomeClass - Here's some info!
2019-12-04 10:05:34.672 [main] ERROR example.SomeClass - Some error happened!
 类似资料:
  • 问题内容: 我正在使用python日志记录模块在python代码中记录事件。我也希望记录2个日志文件,一个包含用户信息,另一个包含针对开发人员的更详细的日志文件。我已将两个日志文件设置为所需的级别(usr.log = INFO和dev.log = ERROR),但无法解决如何将日志记录限制为usr.log文件,因此仅写入INFO级别日志到日志文件,而不是INFO以及上面的所有其他内容,例如INFO

  • 我正在使用log4j进行日志记录。我有一个场景,我必须为不同的严重性使用单独的日志记录。例如,对于软件包foo,我必须在控制台中打印具有严重性ERROR的消息,而我必须在日志文件中打印具有严重性WARN的消息。我如何配置我的log4j.xml相同。

  • 我已经读了2个小时的日志手册,仍然无法想出如何做我需要的事情。 我可以让根用户只有控制台,并定义一个文件记录器: 但我必须这样称呼普通的记录器: 文件记录器如下所示: 这可能吗?

  • 运行时,我收到以下消息: 我已经把位于下(但不在中,因为我不希望它随实际应用程序一起提供),如这里所建议的那样没有任何效果。 生成超文本标记语言报告,编写日志文件,构建成功,如上所述。我不确定错误是从哪里来的。

  • 问题内容: 因此,我正在尝试学习log4j2,并把头放在记录器及其级别和父母传播上。 当前,我的源层次结构运行是: 而我的CalculatorMain是: 我的log4j2.xml是 问题是将输出到控制台的root记录程序设置为。根据我对级别的理解,这意味着我的root记录器应仅输出错误日志或更低的错误日志。然后是我的 记录器,前者应仅记录错误并降低记录,而后者应记录跟踪并降低记录。因此,我的理解