Java-Tomcat中的Log4j2

我正在使用Tomcat 6,并尝试将JUL切换到Log4j2(2.0 beta 3).但是,由于这是一个新项目,因此文档非常稀疏,并且在线资源不多.

我想要的是

>所有高于调试级别的事件都应转到磁盘上的文件中.
>错误应转到syserr.
>从信息到警告的所有内容都应进入sysout.
> Marked审核日志应跳过所有这些操作,并转到磁盘上的其他文件.

我尝试了什么

这是我的首次尝试log4j2.xml文件:

我应该在配置状态下写些什么?关于它的一些文档在哪里?

<?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用于我的应用程序.

解决方法:

如果设置配置status =“ debug”,您将看到许多log4j2内部日志语句,这些语句涉及配置过程中发生的情况.这可能有助于解决配置问题.

我通常将配置状态设置为“警告”,因此只有在出现问题时才收到通知.

关于记录器名称,记录器及其java类之间的关系,这可能会有所帮助:
http://logging.apache.org/log4j/2.x/manual/architecture.html

关于为什么忽略警告的问题,有一个记录器配置:

<logger name="com.ecm" level="error" additivity="false">

还有一个这样的记录器:

Logger LOG = LogManager.getLogger(com.ecm.backend.Foo.class);

记录器配置“ com.ecm”将处理来自LOG记录器的所有调用,但实际上仅记录处于“错误”级别或更高级别(严重)的呼叫.由于其他级别的日志事件级别太低,因此将其过滤掉(警告,信息,调试和跟踪).

可加性的工作方式是,首先命名的记录器配置(在这种情况下为“ com.ecm”)决定是否应过滤事件.然后,如果additivity =“ true”(默认设置),则事件将传递到父记录器(在本例中为根记录器).
因为“警告”级别的事件已由“ com.ecm”记录器配置过滤掉,所以它永远不会到达根记录器.

不确定要达到的目标,但是如果要将不同的事件级别发送给不同的附加程序,一种方法可能是在appender-refs上而不是在记录器上设置级别:

<?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" additivity="false">
        <appender-ref ref="Console-err" level="error" />
        <appender-ref ref="MyFile" level="debug" />
    </logger>
    <root>
        <appender-ref ref="Console-out" level="info" />
        <appender-ref ref="MyFile" level="debug" />
    </root>
</loggers>
</configuration>

这会将LOG记录器的输出发送到MyFile,并且(如果级别错误或致命)也发送到Console-err.

不在“ com.ecm”包中的记录程序的输出将发送到MyFile,并且(如果级别为info,warn,error或致命)也将发送到Console-out.

上一篇:java-在log4j2中,我可以有多个同名记录仪吗?


下一篇:java-NoClassDefFoundError:org / slf4j / Logger