`
bugyun
  • 浏览: 562009 次
社区版块
存档分类
最新评论

Log4j2配置文件详解(转)

    博客分类:
  • Java
 
阅读更多

 

转自:https://my.oschina.net/xianggao/blog/523401

 

1 系列目录

2 默认配置

本来以为Log4J2应该有一个默认的配置文件的,不过好像没有找到(通过DefaultConfiguration,初始化一个最小化配置),下面这个配置文件等同于缺省配置:

<?xml version="1.0" encoding="UTF-8"?><configurationstatus="OFF"><appenders><Consolename="Console"target="SYSTEM_OUT"><PatternLayoutpattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></appenders><loggers><rootlevel="error"><appender-refref="Console"/></root></loggers></configuration>

3 第一个配置例子

配置Log4j 2可以有四种方法(其中任何一种都可以):

  1. 通过一个格式为XML或JSON的配置文件。
  2. 以编程方式,通过创建一个ConfigurationFactory工厂和Configuration实现
  3. 以编程方式,通过调用api暴露在配置界面添加组件的默认配置。
  4. 以编程方式,通过调用Logger内部类上的方法。

注意,与Log4j 1.x不一样的地方,公开的Log4j 2 API没有提供任何添加、修改或删除 appender和过滤器或者操作配置文件的方法。

Log4j能够自动配置本身在初始化期间。当Log4j启动它将定位所有的ConfigurationFactory插件和安排然后在加权从最高到最低。Log4j包含两个ConfigurationFactory实现,一个用于JSON和XML。加载配置文件流程如下:

  1. Log4j将检查“Log4j的配置文件“系统属性,如果设置,将尝试加载配置使用 ConfigurationFactory 匹配的文件扩展
  2. 如果没有系统属性设置JSON ConfigurationFactory log4j2-test将寻找。 json或 log4j2-test。json在类路径中。
  3. 如果没有这样的文件发现XML ConfigurationFactory log4j2-test将寻找。 xml在 类路径。
  4. 如果一个测试文件无法找到JSON ConfigurationFactory log4j2将寻找。 log4j2.jsn json或 在类路径中。
  5. 如果一个JSON文件无法找到XML ConfigurationFactory将试图定位 log4j2。 xml在类路径中。
  6. 如果没有配置文件可以找到了 DefaultConfiguration 将被使用。 这将导致日志输出到控制台。
<?xml version="1.0" encoding="UTF-8"?><configurationstatus="OFF"><appenders><Consolename="Console"target="SYSTEM_OUT"><PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></appenders><loggers><!--我们只让这个logger输出trace信息,其他的都是error级别--><!--
            additivity开启的话,由于这个logger也是满足root的,所以会被打印两遍。
            不过root logger 的level是error,为什么Bar 里面的trace信息也被打印两遍呢
            --><loggername="cn.lsw.base.log4j2.Hello"level="trace"additivity="false"><appender-refref="Console"/></logger><rootlevel="error"><appender-refref="Console"/></root></loggers></configuration>

我们这里看到了配置文件里面是name很重要,没错,这个name可不能随便起(其实可以随便起)。这个机制意思很简单。就是类似于java package一样,比如我们的一个包:cn.lsw.base.log4j2。而且,可以发现我们前面生成Logger对象的时候,命名都是通过 Hello.class.getName(); 这样的方法,为什么要这样呢? 很简单,因为有所谓的Logger 继承的问题。比如 如果你给cn.lsw.base定义了一个logger,那么他也适用于cn.lsw.base.lgo4j2这个logger。名称的继承是通过点(.)分隔的。然后你可以猜测上面loggers里面有一个子节点不是logger而是root,而且这个root没有name属性。这个root相当于根节点。你所有的logger都适用与这个logger,所以,即使你在很多类里面通过类名.class.getName() 得到很多的logger,而且没有在配置文件的loggers下面做配置,他们也都能够输出,因为他们都继承了root的log配置

我们上面的这个配置文件里面还定义了一个logger,他的名称是 cn.lsw.base.log4j2.Hello ,这个名称其实就是通过前面的Hello.class.getName(); 得到的,我们为了给他单独做配置,这里就生成对于这个类的logger,上面的配置基本的意思是只有cn.lsw.base.log4j2.Hello 这个logger输出trace信息,也就是他的日志级别是trace,其他的logger则继承root的日志配置,日志级别是error,只能打印出ERROR及以上级别的日志。如果这里logger 的name属性改成cn.lsw.base,则这个包下面的所有logger都会继承这个log配置(这里的包是log4j的logger name的“包”的含义,不是java的包,你非要给Hello生成一个名称为“myhello”的logger,他也就没法继承cn.lsw.base这个配置了。

那有人就要问了,他不是也应该继承了root的配置了么,那么会不会输出两遍呢?我们在配置文件中给了解释,如果你设置了additivity="false",就不会输出两遍

4 复杂一点的配置

<?xml version="1.0" encoding="UTF-8"?><!--
        Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。 
    --><!--
        monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数。
    --><configurationstatus="error"monitorInterval=”30″><!--先定义所有的appender--><appenders><!--这个输出控制台的配置--><Consolename="Console"target="SYSTEM_OUT"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilterlevel="trace"onMatch="ACCEPT"onMismatch="DENY"/><!--这个都知道是输出日志的格式--><PatternLayoutpattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></Console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--><Filename="log"fileName="log/test.log"append="false"><PatternLayoutpattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- 这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFilename="RollingFile"fileName="logs/app.log"filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"><PatternLayoutpattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/><SizeBasedTriggeringPolicysize="50MB"/><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --><DefaultRolloverStrategymax="20"/></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><loggers><!--建立一个默认的root的logger--><rootlevel="trace"><appender-refref="RollingFile"/><appender-refref="Console"/></root></loggers></configuration>
  • 扩展组件

    1. ConsoleAppender:输出结果到System.out或是System.err。
    2. FileAppender:输出结果到指定文件,同时可以指定输出数据的格式。append=“false”指定不追加到文件末尾
    3. RollingFileAppender:自动追加日志信息到文件中,直至文件达到预定的大小,然后自动重新生成另外一个文件来记录之后的日志。
  • 过滤标签

    1. ThresholdFilter:用来过滤指定优先级的事件。
    2. TimeFilter:设置start和end,来指定接收日志信息的时间区间。

4.1 Appender之Syslog配置

log4j2中对syslog的简单配置,这里就不重复展示log4j2.xml了:

<Syslogname="SYSLOG"host="localhost"port="514"protocol="UDP"facility="LOCAL3"/>

host是指你将要把日志写到的目标机器,可以是ip(本地ip或远程ip,远程ip在实际项目中很常见,有专门的日志服务器来存储日志),也可以使用主机名,如果是本地,还可以使用localhost或127.0.0.1。

Port指定端口,默认514,参见/etc/rsyslog.conf(以Fedora系统为例,下同)。protocol指定传输协议,这里是UDP,facility是可选项,后面可以看到用法。

4.2 Syslog及Syslog-ng相关配置(Fedora)

在运行程序之前,需要修改:/etc/rsyslog.conf

把这两行前的#去掉,即取消注释:

#$ModLoad imudp
#$UDPServerRun 514

这里启用udp监听,514是默认监听端口,重启syslog:

service syslog restart

大部分日志会默认写到/var/log/messages中,如果不想写到这个文件里,可以按下面修改,这样local3的日志就会写到app.log中。这里的local3即 log4j2.xml中facility的配置。

*.info;mail.none;authpriv.none;cron.none;local3.none                /var/log/messages

新增一行:

local3.*                                                            /var/log/app.log

除了使用自带的syslog,我们也可以使用syslog的替代品,比如syslog-ng,这对于log4j2.xml配置没有影响。 安装:

yum install syslog-ng

启动:

service syslog-ng start

其配置文件为:

/etc/syslog-ng/syslog-ng.conf

启动前把source一节中这一行取消注释即可:

#udp(ip(0.0.0.0) port(514));

这个端口会和syslog冲突,可以使用别的端口比如50014,同时修改log4j2.xml中的port属性。另外提一下,使用非默认端口,要求log4j版本在1.2.15或以上。

syslog-ng本身也可以设置把日志送到远程机器上,在源机器上的syslog-ng.conf中添加:

destination d_remote1 {udp(153.65.171.73 port(514));};

这表示源机器上的syslog-ng会把接收到的日志送到远程主机153.65.171.73的514端口上,只要保证153.65.171.73上的syslog-ng正常运行并监听对应的端口即可。

5 Log4j2与Spring集成

web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- log4j2-begin -->
    <listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
    </listener>
    <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    <!-- log4j2-end -->

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
分享到:
评论

相关推荐

    Log4j配置详解高清版

    实际应用中,Log4j配置文件是必须的。Log4j支持XML格式和properties属性文件格式的配置文件。以properties属性文件为例,配置文件一般包括Logger、Appender和Layout三个部分的配置。对于Logger,可以通过设置根...

    log4j日志配置以及配置文件详解

    本文将深入探讨log4j的配置以及配置文件的详解。** 首先,我们要理解什么是`log4j.properties`文件。这是log4j框架的配置文件,使用Java Properties格式,用于定义日志输出的行为。主要包括以下几个核心部分: 1. ...

    SpringBoot框架配置log4j和log4j2的配置代码

    3. **配置SpringBoot**:在`application.properties`中指定Log4j配置文件位置。 ```properties logging.config=classpath:log4j.properties ``` ### SpringBoot与Log4j2 Log4j2作为Log4j的升级版,提供更好的性能...

    log4j.properties配置详解

    #### 二、Log4j配置文件格式详解 Log4j配置文件的基本格式如下: ```properties # 配置根Logger log4j.rootLogger=[level],appenderName1,appenderName2,... # 配置日志信息输出目的地Appender log4j.appender....

    Log4j.properties配置详解

    在Log4j.properties配置文件中,我们可以通过设置Logger、Appender和Layout来实现日志管理。 1. **Loggers** Loggers是Log4j中的关键组件,它们负责决定哪些信息应该被记录。Log4j提供了五个日志级别,从低到高...

    log4j配置文件详解

    ### log4j配置文件详解 #### 一、日志记录器简介与日志级别 **日志记录器**(Logger)作为日志处理系统的核心组件,在log4j中扮演着关键角色。它负责接收应用程序产生的日志信息,并根据配置决定是否记录以及如何...

    log4j配置文件说明(完整版)

    Log4j 配置文件说明 Log4j 是一种流行的日志记录工具,用于记录和管理应用程序中的日志信息。配置文件是 Log4j 的核心组件之一,通过配置文件可以控制日志记录的级别、输出目的地和格式。在本文中,我们将详细介绍 ...

    log4j2-所需jar包+配置详解(详细)

     log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn".  系统选择配置文件的优先级(从先到后)如下:  (1).classpath下的名为log4j2-test.json...

    log4j.properties配置文件

    ### log4j.properties配置文件详解 #### 一、概述 `log4j.properties`是Apache Log4j框架中用于配置日志记录行为的核心文件之一。通过这个文件,开发者可以定义日志消息的输出方式(例如控制台或文件)、日志级别...

    Log4J_全能配置文件.pdf

    ### Log4J 全能配置文件详解 #### 一、概述 Log4J是一款非常流行的Java日志框架,被广泛应用于各种规模的应用程序中。它提供了灵活的日志记录机制,可以将日志输出到不同的目的地,如控制台、文件、数据库等,并且...

    log4j-1.2.17的jar包以及依赖包,还有一份log4j的配置文件,输出到控制台和文件夹两种配置

    **二、Log4j配置文件** 在压缩包中,还包含了一份名为`log4j.properties`的配置文件。这是Log4j使用的一种配置格式,基于Java Properties格式。配置文件决定了日志信息如何输出、输出到哪里,以及日志的级别等关键...

    log4j配置文件详解附实例

    log4j 配置文件详解 log4j 配置文件是 Java 语言中使用 Log4j 日志记录工具的核心配置文件,用于设置日志记录的级别、输出目的地、日志输出格式等。下面是 log4j 配置文件的详解。 Logger 是 log4j 配置文件中的...

    log4j_properties配置详解

    通过对 Log4j 的配置文件进行细致的分析,我们可以了解到如何通过配置文件来灵活地控制日志的输出行为。合理的日志配置不仅可以帮助开发者更好地理解程序的运行状态,还能有效提高系统的可维护性和稳定性。同时,...

    SSM整合中的Log4j日志的配置详情

    在 SSM 整合项目中,需要在 web.xml 文件中指定 Log4j 配置文件的位置,以便 Spring 可以加载 Log4j 配置文件。下面是一个基本的 web.xml 配置: ``` &lt;listener-class&gt;org.springframework.web.util.Log4...

    log4j使用jar包和log4j.properties配置文件

    本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j是一个开源的日志组件,支持多种输出格式,如控制台、文件、数据库等。它的核心概念包括Logger、...

    log4j中配置日志文件相对路径方法(PDF)

    ### Log4j中配置日志文件相对路径方法详解 #### 概述 在软件开发过程中,日志记录是一项重要的功能,它有助于开发者调试程序、监控应用程序的运行状态以及追踪问题。`Log4j`作为一款优秀的日志管理工具,被广泛应用...

    log4j.properties配置详解 使用教程

    #### 三、配置文件详解 log4j的核心配置文件通常是`log4j.properties`或`log4j.xml`,这里重点介绍`.properties`文件的配置方法。 ##### 3.1 配置文件基础结构 ```properties # 设置root logger的级别和输出目标 ...

    log4j实用配置扩展

    #### 五、配置文件详解 log4j的配置文件通常是`.properties`或`.xml`格式。以下是一个简单的配置示例: ```properties # 设置全局的日志级别为INFO log4j.rootLogger=INFO, stdout, file # 控制台输出配置 log4j....

    Log4j配置详解.pdf

    Log4j配置文件主要由以下三个部分组成: 1. **Logger**:用于定义日志的输出等级。 2. **Appender**:指定日志信息的输出目的地。 3. **Layout**:定义日志信息的格式。 #### 四、配置根Logger 根Logger用于设置...

    log4j从入门到详解

    《log4j从入门到详解》是一份深入探讨日志框架log4j的教程资料,主要面向对Java日志管理有需求的开发者。log4j是Apache组织开发的一个开源项目,它提供了一种灵活的日志记录方案,广泛应用于Java应用程序中,以帮助...

Global site tag (gtag.js) - Google Analytics