log4j2不仅仅是log4j的简单升级,而是整个项目的重构,官网地址:,大家可以从官网的介绍看出它相比log4j第1代的种种优点。
一、基本使用
1.1 maven依赖项
12 6org.apache.logging.log4j 3log4j-api 42.0.2 57 org.apache.logging.log4j 8log4j-core 92.0.2 10
1.2 Hello world示例
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会使用默认配置:
1 23 4 85 76 9 1310 1211
该配置只有一个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 message2 13:07:56.100 [main] FATAL - fatal message3 Hello World!
配置第1行中的status="WARN",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF,设置成“WARN”指:所有log4j2的event信息中,只有WARN及以上级别的信息才记录,大家可以把它改成TRACE试试(最低级别),看下输出内容有何变化。
另:配置文件通常命名为log4j2.xml,运行时只要在classpath下能找到即可。
1.3 文件方式记录日志
真正应用中,更多的是以纯文本文件的方式来记录系统的运行日志,来看一段稍微复杂点的配置
1 23 4 5 8 9logs/sample 6mylog 710 25 2611 13 1412 16 2418 19 2220 21 23 27 3529 3130 32 3433
解释一下:
第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,如果正好有这样一个类:
1 package com.cnblogs.yjmyzz; 2 3 import org.apache.logging.log4j.LogManager; 4 import org.apache.logging.log4j.Logger; 5 6 public class App2 { 7 8 static Logger logger = LogManager.getLogger(); 9 10 public static void main(String[] args) {11 for (int i = 0; i < 10; i++) {12 logger.trace("trace message " + i);13 logger.debug("debug message " + i);14 logger.info("info message " + i);15 logger.warn("warn message " + i);16 logger.error("error message " + i);17 logger.fatal("fatal message " + i);18 } 19 System.out.println("Hello World! 2");20 }21 }
log4j2是根据名称来用哪个logger的,第8行没有传任何参数,默认这个logger的name就是当前类的全称,即 com.cnblogs.yjmyzz.App2,这样就跟配置对应上了,所以刚才配置中的 nam="com.cnblogs.yjmyzz.App2"的logger,相当于只对App2这一个类起作用。
更多关于logger name继承的规则,请参考
二、与Spring MVC 的整合
2.1 maven依赖项
12 61.6 33.2.8.RELEASE 42.0.2 57 8 9 13org.springframework 10spring-core 11${springframework.version} 1214 18org.springframework 15spring-beans 16${springframework.version} 1719 23org.springframework 20spring-context 21${springframework.version} 2224 28org.springframework 25spring-web 26${springframework.version} 2729 33org.springframework 30spring-webmvc 31${springframework.version} 3234 38 39 40org.springframework 35spring-expression 36${springframework.version} 3741 45org.apache.logging.log4j 42log4j-api 43${log4j2.version} 4446 50org.apache.logging.log4j 47log4j-core 48${log4j2.version} 4951 55org.apache.logging.log4j 52log4j-web 532.0.2 54
2.2 web.xml配置
1 25 6 7 10contextConfigLocation 8/WEB-INF/spring/root-context.xml 911 13 14 15org.springframework.web.context.ContextLoaderListener 1216 18org.apache.logging.log4j.web.Log4jServletContextListener 1719 22log4jServletFilter 20org.apache.logging.log4j.web.Log4jServletFilter 2123 30 31 32log4jServletFilter 24/* 25REQUEST 26FORWARD 27INCLUDE 28ERROR 2933 40CharacterEncodingFilter 34org.springframework.web.filter.CharacterEncodingFilter 3536 39encoding 37utf-8 3841 44CharacterEncodingFilter 42/* 4345 53appServlet 46org.springframework.web.servlet.DispatcherServlet 4748 51contextConfigLocation 49/WEB-INF/spring/appServlet/servlet-context.xml 501 5254 57appServlet 55/ 56
注:这是web app 2.5的整合方法,web app3.0不需要这么复杂的配置,3.0的整合请参考官方pdf文档
2.3 log4j2.xml内容前面那段“复杂的”配置差不多,就不重复贴出来了
放置在resources目录即可,打包后,会自动复制到classpath下.