log4j2不仅仅是log4j的简单升级,而是整个项目的重构。官网地址:http://logging.apache.org/log4j/2.x/,大家能够从官网的介绍看出它相比log4j第1代的种种长处。
一、基本使用
1.1 maven依赖项
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <dependency> 2 <groupId>org.apache.logging.log4j</groupId> 3 <artifactId>log4j-api</artifactId> 4 <version>2.0.2</version> 5 </dependency> 6 <dependency> 7 <groupId>org.apache.logging.log4j</groupId> 8 <artifactId>log4j-core</artifactId> 9 <version>2.0.2</version> 10 </dependency>
1.2 Hello world演示样例
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.cnblogs.yjmyzz; 2 3 import org.apache.logging.log4j.LogManager; 4 import org.apache.logging.log4j.Logger; 5 6 /** 7 * Hello world! 8 * 9 */ 10 public class App { 11 static Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); 12 13 public static void main(String[] args) { 14 logger.trace("trace message"); 15 logger.debug("debug message"); 16 logger.info("info message"); 17 logger.warn("warn message"); 18 logger.error("error message"); 19 logger.fatal("fatal message"); 20 System.out.println("Hello World!"); 21 } 22 }
在没有不论什么配置的情况下,log4j2会使用默认配置:
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration status="WARN"> 3 <Appenders> 4 <Console name="Console" target="SYSTEM_OUT"> 5 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 6 </Console> 7 </Appenders> 8 <Loggers> 9 <Root level="error"> 10 <AppenderRef ref="Console" /> 11 </Root> 12 </Loggers> 13 </Configuration>
该配置仅仅有一个Appender:Console,目标是SYSTEM_OUT。即日志内容,都会打印在eclipse控制台上。
Root Logger的级别是error,即:全部error及以上级别的日志才会记录。(注:日志级别顺序为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL ),所以终于仅仅有2日志会输出(error,fatal)
1 13:07:56.099 [main] ERROR - error message 2 13:07:56.100 [main] FATAL - fatal message 3 Hello World!
配置第1行中的status="WARN"。能够去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF。设置成“WARN”指:全部log4j2的event信息中,仅仅有WARN及以上级别的信息才记录,大家能够把它改成TRACE试试(最低级别),看下输出内容有何变化。
另:配置文件通常命名为log4j2.xml,执行时仅仅要在classpath下能找到就可以。
1.3 文件方式记录日志
真正应用中,很多其它的是以纯文本文件的方式来记录系统的执行日志。来看一段略微复杂点的配置
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration status="off" monitorInterval="1800"> 3 4 <properties> 5 <property name="LOG_HOME">logs/sample</property> 6 <property name="FILE_NAME">mylog</property> 7 </properties> 8 9 <Appenders> 10 <Console name="Console" target="SYSTEM_OUT"> 11 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 12 </Console> 13 14 <RollingRandomAccessFile name="running-log" 15 fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"> 16 <PatternLayout 17 pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" /> 18 <Policies> 19 <TimeBasedTriggeringPolicy /> 20 <SizeBasedTriggeringPolicy size="10 MB" /> 21 </Policies> 22 <DefaultRolloverStrategy max="20" /> 23 </RollingRandomAccessFile> 24 </Appenders> 25 26 <Loggers> 27 <Logger name="com.cnblogs.yjmyzz.App2" level="trace" 28 additivity="true"> 29 <AppenderRef ref="running-log" /> 30 </Logger> 31 <Root level="error"> 32 <AppenderRef ref="Console" /> 33 </Root> 34 </Loggers> 35 </Configuration>
解释一下:
第1行中的 monitorInterval="1800" 指log4j2每隔1800秒(半小时)。自己主动监控该配置文件是否有变化。假设变化。则自己主动依据文件内容又一次配置(非常不错的功能。)
4-7行定义了一些属性(能够依据须要自己随便加入)。主要是为了后面引用起来方便
14行 RollingRandomAccessFile 即表示以文件方式记录,注意一下filePattern 的设置,它与20行的SizeBasedTriggeringPolicy (表示单个文件最大多少容量)结合在一起,非常实用。以这段配置为例,当单个文件达到10M后。会自己主动将曾经的内容,先创建相似 2014-09(年-月)的文件夹,然后按 "xxx-年-月-日-序号"命名。打成压缩包(非常体贴的设计,即省了空间,又不丢失曾经的日志信息)
22行的DefaultRolloverStrategy max="20"表示压缩包,最多保留20个
27-30行,定义了一个新logger。它的级别是trace 。使用文件方式来记录日志。additivity="true" 这里注意一下。由于以下另一个root logger,不论什么其它的logger终于都相当于继承自root logger,所以“com.cnblogs.yjmyzz.App2”这个logger中,假设记录了error及以上级别的日志,除了文件中会记录外,root logger也会生效。即:控制台也会输出一次。假设把additivity="true" 中的true,改成false,root logger就不会再起作用,即仅仅会记录在文件中,控制台无输出。
另外关于logger的命名。非常有讲究的,这里我们命名为com.cnblogs.yjmyzz.App2。假设正好有这样一个类:
log4j2是依据名称来用哪个logger的。第8行没有传不论什么參数,默认这个logger的name就是当前类的全称,即 com.cnblogs.yjmyzz.App2。这样就跟配置相应上了。所以刚才配置中的 nam="com.cnblogs.yjmyzz.App2"的logger,相当于仅仅对App2这一个类起作用。
很多其它关于logger name继承的规则,请參考log4j2的官方pdf文档
二、与Spring MVC 的整合
2.1 maven依赖项
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <properties> 2 <java.version>1.6</java.version> 3 <springframework.version>3.2.8.RELEASE</springframework.version> 4 <log4j2.version>2.0.2</log4j2.version> 5 </properties> 6 <dependencies> 7 <!-- Spring --> 8 <dependency> 9 <groupId>org.springframework</groupId> 10 <artifactId>spring-core</artifactId> 11 <version>${springframework.version}</version> 12 </dependency> 13 <dependency> 14 <groupId>org.springframework</groupId> 15 <artifactId>spring-beans</artifactId> 16 <version>${springframework.version}</version> 17 </dependency> 18 <dependency> 19 <groupId>org.springframework</groupId> 20 <artifactId>spring-context</artifactId> 21 <version>${springframework.version}</version> 22 </dependency> 23 <dependency> 24 <groupId>org.springframework</groupId> 25 <artifactId>spring-web</artifactId> 26 <version>${springframework.version}</version> 27 </dependency> 28 <dependency> 29 <groupId>org.springframework</groupId> 30 <artifactId>spring-webmvc</artifactId> 31 <version>${springframework.version}</version> 32 </dependency> 33 <dependency> 34 <groupId>org.springframework</groupId> 35 <artifactId>spring-expression</artifactId> 36 <version>${springframework.version}</version> 37 </dependency> 38 39 <!-- log4j2 --> 40 <dependency> 41 <groupId>org.apache.logging.log4j</groupId> 42 <artifactId>log4j-api</artifactId> 43 <version>${log4j2.version}</version> 44 </dependency> 45 <dependency> 46 <groupId>org.apache.logging.log4j</groupId> 47 <artifactId>log4j-core</artifactId> 48 <version>${log4j2.version}</version> 49 </dependency> 50 <dependency> 51 <groupId>org.apache.logging.log4j</groupId> 52 <artifactId>log4j-web</artifactId> 53 <version>2.0.2</version> 54 </dependency> 55 </dependencies>
2.2 web.xml配置
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <?xml version="1.0" encoding="UTF-8" ?
>
2 < web-app version ="2.5" xmlns ="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" > 5 6 < context-param > 7 < param-name >contextConfigLocation </ param-name > 8 < param-value >/WEB-INF/spring/root-context.xml </ param-value > 9 </ context-param > 10 < listener > 11 < listener-class >org.springframework.web.context.ContextLoaderListener </ listener-class > 12 </ listener > 13 14 <!-- log4j2-begin --> 15 < listener > 16 < listener-class >org.apache.logging.log4j.web.Log4jServletContextListener </ listener-class > 17 </ listener > 18 < filter > 19 < filter-name >log4jServletFilter </ filter-name > 20 < filter-class >org.apache.logging.log4j.web.Log4jServletFilter </ filter-class > 21 </ filter > 22 < filter-mapping > 23 < filter-name >log4jServletFilter </ filter-name > 24 < url-pattern >/* </ url-pattern > 25 < dispatcher >REQUEST </ dispatcher > 26 < dispatcher >FORWARD </ dispatcher > 27 < dispatcher >INCLUDE </ dispatcher > 28 < dispatcher >ERROR </ dispatcher > 29 </ filter-mapping > 30 <!-- log4j2-end --> 31 32 < filter > 33 < filter-name >CharacterEncodingFilter </ filter-name > 34 < filter-class >org.springframework.web.filter.CharacterEncodingFilter </ filter-class > 35 < init-param > 36 < param-name >encoding </ param-name > 37 < param-value >utf-8 </ param-value > 38 </ init-param > 39 </ filter > 40 < filter-mapping > 41 < filter-name >CharacterEncodingFilter </ filter-name > 42 < url-pattern >/* </ url-pattern > 43 </ filter-mapping > 44 < servlet > 45 < servlet-name >appServlet </ servlet-name > 46 < servlet-class >org.springframework.web.servlet.DispatcherServlet </ servlet-class > 47 < init-param > 48 < param-name >contextConfigLocation </ param-name > 49 < param-value >/WEB-INF/spring/appServlet/servlet-context.xml </ param-value > 50 </ init-param > 51 < load-on-startup >1 </ load-on-startup > 52 </ servlet > 53 < servlet-mapping > 54 < servlet-name >appServlet </ servlet-name > 55 < url-pattern >/ </ url-pattern > 56 </ servlet-mapping > 57 </ web-app >注:这是web app 2.5的整合方法,web app3.0不须要这么复杂的配置,3.0的整合请參考官方pdf文档
2.3 log4j2.xml
内容前面那段“复杂的”配置差点儿相同,就不反复贴出来了
放置在resources文件夹就可以,打包后,会自己主动拷贝到classpath下.