log4j2 与 spring mvc整合

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: log4j2不仅仅是log4j的简单升级,而是整个项目的重构,官网地址:http://logging.apache.org/log4j/2.x/,大家可以从官网的介绍看出它相比log4j第1代的种种优点。

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

一、基本使用

1.1 maven依赖项

 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示例

 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会使用默认配置:

 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 文件方式记录日志

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

 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,如果正好有这样一个类:

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

 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配置

 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下.

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
28天前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
53 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
98 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
3月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
3月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
3月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
157 4
下一篇
无影云桌面