转自:https://my.oschina.net/xianggao/blog/523401
1 系列目录
- 2种日志接口框架,4种日志实现框架
- Apache Log4j
- Apache Commons Logging
- JDK Logging
- Logback
- Apache Log4j2
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可以有四种方法(其中任何一种都可以):
- 通过一个格式为
XML或JSON
的配置文件。 - 以编程方式,通过创建一个
ConfigurationFactory工厂和Configuration实现
。 - 以编程方式,通过调用
api暴露
在配置界面添加组件的默认配置。 - 以编程方式,通过调用
Logger内部类
上的方法。
注意,与Log4j 1.x不一样的地方,公开的Log4j 2 API没有提供任何添加、修改或删除 appender和过滤器或者操作配置文件的方法。
Log4j能够自动配置本身在初始化期间
。当Log4j启动它将定位所有的ConfigurationFactory插件和安排然后在加权从最高到最低。Log4j包含两个ConfigurationFactory实现,一个用于JSON和XML
。加载配置文件流程如下:
- Log4j将检查“Log4j的配置文件“系统属性,如果设置,将
尝试加载配置使用 ConfigurationFactory 匹配的文件扩展
。 - 如果
没有系统属性设置JSON ConfigurationFactory log4j2-test将寻找
。 json或 log4j2-test。json在类路径中。 - 如果
没有这样的文件发现XML ConfigurationFactory log4j2-test将寻找
。 xml在 类路径。 - 如果
一个测试文件无法找到JSON ConfigurationFactory log4j2将寻找
。 log4j2.jsn json或 在类路径中。 - 如果
一个JSON文件无法找到XML ConfigurationFactory将试图定位 log4j2
。 xml在类路径中。 - 如果
没有配置文件可以找到了 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>
-
扩展组件
- ConsoleAppender:输出结果到System.out或是System.err。
- FileAppender:输出结果到指定文件,同时可以指定输出数据的格式。append=“false”指定不追加到文件末尾
- RollingFileAppender:自动追加日志信息到文件中,直至文件达到预定的大小,然后自动重新生成另外一个文件来记录之后的日志。
-
过滤标签
- ThresholdFilter:用来过滤指定优先级的事件。
- 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支持XML格式和properties属性文件格式的配置文件。以properties属性文件为例,配置文件一般包括Logger、Appender和Layout三个部分的配置。对于Logger,可以通过设置根...
本文将深入探讨log4j的配置以及配置文件的详解。** 首先,我们要理解什么是`log4j.properties`文件。这是log4j框架的配置文件,使用Java Properties格式,用于定义日志输出的行为。主要包括以下几个核心部分: 1. ...
3. **配置SpringBoot**:在`application.properties`中指定Log4j配置文件位置。 ```properties logging.config=classpath:log4j.properties ``` ### SpringBoot与Log4j2 Log4j2作为Log4j的升级版,提供更好的性能...
#### 二、Log4j配置文件格式详解 Log4j配置文件的基本格式如下: ```properties # 配置根Logger log4j.rootLogger=[level],appenderName1,appenderName2,... # 配置日志信息输出目的地Appender log4j.appender....
在Log4j.properties配置文件中,我们可以通过设置Logger、Appender和Layout来实现日志管理。 1. **Loggers** Loggers是Log4j中的关键组件,它们负责决定哪些信息应该被记录。Log4j提供了五个日志级别,从低到高...
### log4j配置文件详解 #### 一、日志记录器简介与日志级别 **日志记录器**(Logger)作为日志处理系统的核心组件,在log4j中扮演着关键角色。它负责接收应用程序产生的日志信息,并根据配置决定是否记录以及如何...
Log4j 配置文件说明 Log4j 是一种流行的日志记录工具,用于记录和管理应用程序中的日志信息。配置文件是 Log4j 的核心组件之一,通过配置文件可以控制日志记录的级别、输出目的地和格式。在本文中,我们将详细介绍 ...
log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn". 系统选择配置文件的优先级(从先到后)如下: (1).classpath下的名为log4j2-test.json...
### log4j.properties配置文件详解 #### 一、概述 `log4j.properties`是Apache Log4j框架中用于配置日志记录行为的核心文件之一。通过这个文件,开发者可以定义日志消息的输出方式(例如控制台或文件)、日志级别...
### Log4J 全能配置文件详解 #### 一、概述 Log4J是一款非常流行的Java日志框架,被广泛应用于各种规模的应用程序中。它提供了灵活的日志记录机制,可以将日志输出到不同的目的地,如控制台、文件、数据库等,并且...
**二、Log4j配置文件** 在压缩包中,还包含了一份名为`log4j.properties`的配置文件。这是Log4j使用的一种配置格式,基于Java Properties格式。配置文件决定了日志信息如何输出、输出到哪里,以及日志的级别等关键...
log4j 配置文件详解 log4j 配置文件是 Java 语言中使用 Log4j 日志记录工具的核心配置文件,用于设置日志记录的级别、输出目的地、日志输出格式等。下面是 log4j 配置文件的详解。 Logger 是 log4j 配置文件中的...
通过对 Log4j 的配置文件进行细致的分析,我们可以了解到如何通过配置文件来灵活地控制日志的输出行为。合理的日志配置不仅可以帮助开发者更好地理解程序的运行状态,还能有效提高系统的可维护性和稳定性。同时,...
在 SSM 整合项目中,需要在 web.xml 文件中指定 Log4j 配置文件的位置,以便 Spring 可以加载 Log4j 配置文件。下面是一个基本的 web.xml 配置: ``` <listener-class>org.springframework.web.util.Log4...
本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j是一个开源的日志组件,支持多种输出格式,如控制台、文件、数据库等。它的核心概念包括Logger、...
### Log4j中配置日志文件相对路径方法详解 #### 概述 在软件开发过程中,日志记录是一项重要的功能,它有助于开发者调试程序、监控应用程序的运行状态以及追踪问题。`Log4j`作为一款优秀的日志管理工具,被广泛应用...
#### 三、配置文件详解 log4j的核心配置文件通常是`log4j.properties`或`log4j.xml`,这里重点介绍`.properties`文件的配置方法。 ##### 3.1 配置文件基础结构 ```properties # 设置root logger的级别和输出目标 ...
#### 五、配置文件详解 log4j的配置文件通常是`.properties`或`.xml`格式。以下是一个简单的配置示例: ```properties # 设置全局的日志级别为INFO log4j.rootLogger=INFO, stdout, file # 控制台输出配置 log4j....
Log4j配置文件主要由以下三个部分组成: 1. **Logger**:用于定义日志的输出等级。 2. **Appender**:指定日志信息的输出目的地。 3. **Layout**:定义日志信息的格式。 #### 四、配置根Logger 根Logger用于设置...
《log4j从入门到详解》是一份深入探讨日志框架log4j的教程资料,主要面向对Java日志管理有需求的开发者。log4j是Apache组织开发的一个开源项目,它提供了一种灵活的日志记录方案,广泛应用于Java应用程序中,以帮助...