Spring MVC+Spring框架使用log4j的学习总结

作为程序员在日常的开发过程中,经常会遇到各种Bug,对于这种情况,作为初学者,我之前一直是在自己觉得可能出错的地方,输出相关变量的值。这种“笨”办法对于某些简单的Bug是可以的,但是大多数情况下是不可行的,要想快速定位程序出错的位置,最好的就是查看相关的日志文件。本文主要介绍如何在我们的项目中使用log4j来记录日志。如有错误之处还请指出、见谅。

log4j

Log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),是Apache的一个开放源代码项目。我们可以通过使用log4j可以向我们定义的地方、按照我们指定的格式输出日志文件。
log4j主要由三个组件组成:

1.logger : 负责捕获、记录日志,通过它我们可以选择记录不同优先级的日志
2.appender : 负责发布日志,通过它我们可以指定日志的输出地方
3.layout : 负责日志的格式,通过它我们可以按照我们自己定义的格式来输出日志

下面分别对这三个组件进行展开:

logger

之前有说通过它我们可以有选择性的输出不同优先级的日志,那么日志的优先级是什么?
日志的优先级按照优先级从低到高,可以分为:

DEBUG < INFO < WARN < ERROR < FATAL

这其中FATAL为致命的错误,会导致程序无法运行,ERROR 为严重错误 主要是程序的错误,WARN 为一般警告,比如session丢失,INFO 为一般要显示的信息,比如登录登出,DEBUG 为程序的调试信息

appender

一般情况下,appender的常用的值可以为:

  1. org.apache.log4j.ConsoleAppender(控制台)
  2. org.apache.log4j.FileAppender(文件)
  3. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  4. org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

之前有说,appender主要是定义了日志的输出地方,如果appender的值为org.apache.log4j.FileAppender则表示将日志以文件的形式输出。

layout

layout定义了日志的输出格式,其取值可以为:

  1. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  2. org.apache.log4j.PatternLayout(可以灵活地指定布局模式
  3. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  4. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

一般都会使用org.apache.log4j.PatternLayout,当使用org.apache.log4j.PatternLayout作为layout的取值时,可以结合具体的输出格式控制来格式化每一条记录的输出:

  1. %c 输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:”org.apache.elathen.ClassName”,%C{2}将输出elathen.ClassName)
  2. %d 输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
  3. %l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
  4. %n 换行符
  5. %m 输出代码指定信息,如info(“message”),输出message
  6. %p 输出优先级,即 FATAL ,ERROR 等
  7. %r 输出从启动到显示该log信息所耗费的毫秒数
  8. %t 输出产生该日志事件的线程名

log4j配置

前面介绍了log4j的一些组件,看起来肯定是一头雾水,现在我们动手把log4j配置到我们的项目中。
在web项目中使用log4j首先要创建它的配置文件,可以是以xml文件或者是property文件的形式,本文我们使用property文件的形式。
log4j.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
log4j.rootLogger = info,stdout,D,E

#配置stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n

#配置D
log4j.appender.D = org.apache.log4j.RollingFileAppender
log4j.appender.D.File = /Users/xiangang/JavaWebLearning/Log4j-Test/log/log.log
log4j.appender.D.Append = truelog4j.appender.D.Threshold = INFO
log4j.appender.D.MaxFileSize=5MB
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n

#配置E
log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File = /Users/xiangang/JavaWebLearning/Log4j-Test/log/error.log
log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR
log4j.appender.E.MaxFileSize=5MB
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p]-[%l] %m%n

上面的配置文件是按照如下的模式来进行配置的,通常情况下,都会按照下面的格式来配置:

1
2
3
4
5
6
7
8
9
10
11
12
#配置根Logger
log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …

#配置日志信息输出目的地Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.optionN = valueN 

#配置日志信息的格式layout
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.optionN = valueN

这里需要解释一下的是根loggerrootLogger继承自logger,如果想从源码的角度分析可以参考:http://www.cnblogs.com/davidwang456/p/4243161.html

要想使用log4j,除了配置完log4j的配置文件,还要在applicationContext初始化的时候加载它的配置文件。本文是在Spring框架中使用,所以相对来说比较简单,在web.xml中进行简单设置即可,在其他环境下使用log4j的可以参考:http://www.codeceo.com/article/log4j-usage.html

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

<!--设置log4j配置文件-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!--log4j的初始化类-->
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>

<!--定义Filter进行用户验证-->
<filter>
<filter-name>loginValidation</filter-name>
<filter-class>filter.LoginValidation</filter-class>
<init-param>
<param-name>logonPath</param-name>
<param-value>/log4j/register.jsp;/log4j/index.jsp</param-value>
</init-param>
<init-param>
<param-name>redirectPath</param-name>
<param-value>/index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginValidation</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!--配置字符过滤器,防止出现中文乱码-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!--设置Spring MVC的前置控制器-->
<servlet>
<servlet-name>DispactherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcherServlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispactherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
group 'xiangang.wei'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.8

repositories {
jcenter()
mavenCentral()
}

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
// servlet-api
compile group: 'javax.servlet', name: 'servlet-api', version: '2.5'
// log4j api
compile group: 'log4j', name: 'log4j', version: '1.2.17'
//spring api
compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.3.RELEASE'
compile group: 'org.springframework', name: 'spring-orm', version: '4.3.3.RELEASE'
compile group: 'org.springframework', name: 'spring-aspects', version: '4.3.3.RELEASE'
}

其余代码在:https://github.com/xiangang-wei/log4j

配置好本地Tomcat运行后在控制台可以看到:

控制台打印的日志信息

我们还可以在本地文件夹里看到输出的两个日志文件:

生成的日志文件

打开log.log文件:

log.log