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

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

景理
2023-03-14

我正在使用log4j2记录应用程序的事件。然而,我被以下问题所困扰。

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

<?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>

编辑:

我看到很多问题,要求只将某个级别的消息写入文件,而将不同级别的消息写入不同文件。在我的情况下,我需要将具有一定级别的更高的消息写入到不同的文件中。例如,在我提供的情况下,带有级别错误或致命的消息将同时写入RollingFile和控制台,而带有级别信息的消息将只写入RollingFile。

共有1个答案

岳玉书
2023-03-14

要限制log4j2中特定appender的日志记录级别,应该使用appender的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
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

借助过滤器,Log4j2允许将输出配置为特定的附加器,比log4j灵活得多。

 类似资料:
  • 我希望在我的应用程序(Spring Integration)中有两个日志文件,Debug.log和Main.log。我想在信息级别运行main.log,在调试级别运行DEBUG.log。这可以通过附加程序上的筛选器来实现。我想根据源记录不同级别的附加程序。换句话说,也就是 总结一下: Spring记录器 主->错误 调试->调试 主->信息 调试->调试 因此,我必须让记录器在DEBUG运行,而附

  • 问题内容: 是否可以基于附加程序为单个Logger配置不同的日志级别? 我意识到这与这个问题类似,这是我已经了解到的,但是问题是该阈值适用于登录到该附加程序的所有记录器,而我只希望该阈值适用于单个记录器。 即到目前为止,我有这样的事情: 我希望将 Mylogger的 DEBUG消息发送到 日志文件 追加器,但是我也希望将 Mylogger的 INFO消息发送到 stdout 追加器(但对于所有其他

  • 问题内容: 我目前正在使用log4j的项目中。我正在运行一个测试用例(junit),并希望将日志级别设置为跟踪,以便我可以查看所有值是否正确。在项目中使用日志记录的类包含如下一行: 并使用类似这样的命令进行实际调试 我以前从未使用过log4j,有人知道我该如何仅为测试用例更改日志级别,最好仅通过在Eclipse的运行配置对话框中定义一个参数即可。 问题答案: 使用另一个配置文件 也许您可以指向另一

  • 问题内容: 我有一个Web应用程序,并且我想为每个用户使用不同的日志,因此我可以了解该用户在系统上所做的事情的“历史记录”。 这是我到目前为止所拥有的: 问题是,作为Web应用程序,它是多线程的,所以AFAIK我不能一直使用并根据我要登录的用户来更改附加程序。我认为我应该为每个用户创建不同的内容,但这是正确的吗? 问题答案: 尝试切换到logback(log4j的后继者)。它带有一个Sifting

  • 我有一个多线程Java应用程序,每个线程都是一个扩展基类的类。其中一个线程偶尔会给基类中的一个方法大量机器生成的数据,而其他线程只给出少量的人类类型数据。我想在比机器数据更高的日志级别上记录这些人类类型的消息,但是由于基类是所有线程的一部分,我无法在代码中区分出来。 一种解决方案是通知扩展类中的基类在不同的级别上登录,但是我必须将这些知识硬编码到应用程序中,这很难看。 我想做的是通过我的logba

  • 我试图通过以下代码实现一个基本配置器 的类def是 我使用的是Log4j2,分布在这里。当我在构建路径中有Log4j-to-slf4j和实现jar时,我总是得到SLF4J桥接错误: 我认为应该为DEBUG配置根记录器,因此我的所有日志语句都应该通过(即DEBUG级别或更高级别的任何内容)。但运行应用程序时,在控制台上看不到任何日志消息。我错过了什么?