Log4j2 与 SpringMVC 整合
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>
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 <?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 文件方式记录日志
真正应用中,很多其它的是以纯文本文件的方式来记录系统的执行日志。来看一段略微复杂点的配置
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依赖项
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配置
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下.
Log4j2 与 SpringMVC 整合的更多相关文章
- (转)Dubbo与Zookeeper、SpringMVC整合和使用
原文地址: https://my.oschina.net/zhengweishan/blog/693163 Dubbo与Zookeeper.SpringMVC整合和使用 osc码云托管地址:http: ...
- SSM整合(三):Spring4与Mybatis3与SpringMVC整合
源码下载 SSMDemo 上一节整合了Mybatis3与Spring4,接下来整合SpringMVC! 说明:整合SpringMVC必须是在web项目中,所以前期,新建的就是web项目! 本节全部采用 ...
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- springmvc整合fastjson
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 【转】Dubbo_与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
原文链接:http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 ...
- 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- SpringMVC整合Tiles框架
SpringMVC整合Tiles框架 Tiles组件 tiles-iconfig.xml Tiles是一个JSP布局框架. Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离 ...
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)转
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
随机推荐
- OpenGL编程逐步深入(十)索引绘制
准备知识 OpenGl提供了一些绘图函数.到目前为止我们使用的glDrawArrays绘图函数属于"顺序绘制".这意味着顶点缓冲区从指定的偏移量开始被扫描,每X(点为1,直线为2等 ...
- Android属性动画-Interpolator和ViewPropertyAnimator的用法
Interpolator的用法 Interpolator这个东西很难进行翻译,直译过来的话是补间器的意思,它的主要作用是可以控制动画的变化速率,比如去实现一种非线性运动的动画效果.那么什么叫做非线性运 ...
- 【agc004f】Namori Grundy
那个问一下有人可以解释以下这个做法嘛,看不太懂QwQ~ Description 有一个n个点n条边的有向图,点的编号为从1到n. 给出一个数组p,表明有(p1,1),(p2,2),…,(pn,n)这n ...
- 记intel杯比赛中各种bug与debug【其四】:基于长短时记忆神经网络的中文分词的实现
(标题长一点就能让外行人感觉到高大上) 直接切入主题好了,这个比赛还必须一个神经网络才可以 所以我们结合主题,打算写一个神经网络的中文分词 这里主要写一下数据的收集和处理,网络的设计,代码的编写和模型 ...
- python Web抓取(一)[没写完]
需要的模块: python web抓取通过: webbrowser:是python自带的,打开浏览器获取指定页面 requests:从因特网上下载文件和网页 Beautiful Soup:解析HTML ...
- Python学习笔记(3)--数据结构之列表list
Python的数据结构有三种:列表.元组和字典 列表(list) 定义:list是处理一组有序项目的数据结构,是可变的数据结构. 初始化:[], [1, 3, 7], ['a', 'c'], [1, ...
- TortoiseGit 弹出 git@xxx.com's password 对话框
安装完 tortoise git,用它克隆项目的时候,一直弹出git@xxx.com's password 对话框 解决的办法是,将ssh客户端默认的路径,换为git 安装目录下ssh.exe的路径就 ...
- 【Educational Codeforces Round 37 C】 Swap Adjacent Elements
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然l..r这一段连续的1可以把l..r+1变成有序的. 那么就把所有的连续1段变成有序的就好. 看看最后是不是升序即可. [代码] ...
- python里面 __future__的作用 & 下划线的作用 & 3.0实现不换行
参考这篇文章: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820 ...
- Android之Handler源代码深入解析
闲着没事.就来看看源代码,看看源代码的各种原理,会用仅仅是简单的,知道为什么才是最牛逼的. Handler源代码分析那,从使用的步骤来边用边分析: 1.创建一个Handler对象:new Handle ...