我正在使用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。
要限制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级别或更高级别的任何内容)。但运行应用程序时,在控制台上看不到任何日志消息。我错过了什么?