我正在使用 Tomcat 6 并尝试将 JUL 切换到 Log4j2 (2.0 beta 3)。但是,由于它是一个相当新的项目,文档非常稀少,在线资源还不是很多。
我想要的是
- 调试级别以上的所有事件都应转到磁盘上的文件。
- 错误应该去
syserr
。 - 从信息到警告的所有内容都应该转到
sysout
. - 标记的审计日志应该跳过所有这些并转到磁盘上的不同文件。
我试过的
这是我的第一次尝试log4j2.xml
文件:
我应该写configuration status
什么?关于它的一些文档在哪里?
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<appenders>
<Console name="Console-err" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<Console name="Console-out" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="MyFile" fileName="app.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
<loggers>
<logger name="com.ecm" level="error" additivity="false">
<appender-ref ref="Console-err" />
<appender-ref ref="MyFile" />
</logger>
<root level="info">
<appender-ref ref="Console-out" />
<appender-ref ref="MyFile" />
</root>
</loggers>
</configuration>
记录器名称与 Java 类及其记录器有何关系?
示例代码:
package com.ecm.backend;
public final class Foo {
private static final Logger LOG = LogManager.getLogger(Foo.class);
public static void bar() {
LOG.error("this is error");
LOG.warn("this is warning");
}
}
当我运行它时,我在控制台和日志文件中得到它:
10:22:49.385 [http-8080-3] ERROR com.ecm.backend.Foo - this is error
为什么忽略警告?
如果我删除additivity="false"
,我得到:
10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error
10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error
再次忽略警告并重复错误(如预期的那样)。
我究竟做错了什么?
在折叠下:Tomcat 的其余部分可以使用 JULI,我只想要 Log4j2 用于我的应用程序。