ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java-Tomcat中的Log4j2

2019-10-31 15:01:15  阅读:372  来源: 互联网

标签:logging log4j log4j2 tomcat java


我正在使用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.

标签:logging,log4j,log4j2,tomcat,java
来源: https://codeday.me/bug/20191031/1976731.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有