log4j2 与 spring mvc整合

log4j2不仅仅是log4j的简单升级,而是整个项目的重构,官网地址:http://logging.apache.org/log4j/2.x/,大家可以从官网的介绍看出它相比log4j第1代的种种优点。

一、基本使用

1.1 maven依赖项

log4j2 与 spring mvc整合
 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>
View Code

1.2 Hello world示例

log4j2 与 spring mvc整合
 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 }
View Code

在没有任何配置的情况下,log4j2会使用默认配置:

log4j2 与 spring mvc整合
 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>
View Code

该配置只有一个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 文件方式记录日志

真正应用中,更多的是以纯文本文件的方式来记录系统的运行日志,来看一段稍微复杂点的配置

log4j2 与 spring mvc整合
 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>
View Code

 解释一下:

第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 与 spring mvc整合
 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 }
View Code

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依赖项

log4j2 与 spring mvc整合
 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>
View Code

2.2 web.xml配置

log4j2 与 spring mvc整合
 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>
View Code

注:这是web app 2.5的整合方法,web app3.0不需要这么复杂的配置,3.0的整合请参考官方pdf文档
2.3 log4j2.xml

内容前面那段“复杂的”配置差不多,就不重复贴出来了

放置在resources目录即可,打包后,会自动复制到classpath下.

你可能感兴趣的:(spring mvc)