0 本文主要涉及
Log4j在基于 Spring 和 SpringMVC 的前后端分离的 JavaWeb 项目中记录日志。
1 Log4j 简介
Log4j 是 Apache 提供的开源日志记录工具,使用他我们可以通过配置文件控制日志信息输送的目的(控制台,文件等),输出格式,日志信息的级别等等不同的日志记录需求。
官网:http://logging.apache.org/log4j/1.2/
2 Log4j 配置集成
pom.xml依赖配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
web.xml配置文件路径及配置文件监听器配置
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>${project.name}.web.root</param-value>
</context-param>
<!--不需要配置 WebAppRootListener ,因为 Log4jConfigListener 已经包含了 WebAppRootListener 的功能-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<!-- 指定 log4j.properties 文件位置-->
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!-- watch dog 监听 log4j 配置变化,60 秒钟扫描一次,如果有更新了则重新装载 log4j 配置 -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<!--虽然被Deprecated了(官方说,会丢失log4j初始化之前产生的日志,没关系),但是Log4j只能用这个-->
<!--要放在ContextLoaderListener之前-->
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
Log4jConfigListener在 web 上下文初始化的时候会获取ServletContext 对象中的
webAppRootKey对应的值(默认值是webapp.root,如果容器中有多个webapp必须配置不同的值)通过System.getProperty("webapp.root") 获取项目路径。
log4j.properties 日志具体配置
首先配置rootLogger
log4j.rootLogger = [ level ] , appenderName, appenderName
[level]日志级别:
OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
推荐用ERROR、WARN、INFO、DEBUG,在代码中写日志的时只有在当前写日志的级别大于等于当前日志实例的配置级别的时候,日志写操作才生效,比如当前日志实例的配置级别(如果没有配置从parent找一直到root )为 INFO,那么 log.info 会写成功,而 log.debug 则不会写。
OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
推荐用ERROR、WARN、INFO、DEBUG,在代码中写日志的时只有在当前写日志的级别大于等于当前日志实例的配置级别的时候,日志写操作才生效,比如当前日志实例的配置级别(如果没有配置从parent找一直到root )为 INFO,那么 log.info 会写成功,而 log.debug 则不会写。
配置日志信息输出目的地Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
Log4j 提供的Appender :
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
org.apache.log4j.JDBCAppender(输出到 JDBC 数据库)
org.apache.log4j.SocketAppender(远程日至服务器)
org.apache.log4j.SMTPAppender(发送邮件)
配置日志信息的格式:log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
Log4j 提供的 layout:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
Log4J 采用类似 C 语言中的 printf 函数的打印格式格式化日志信息,打印参数如下:
-X 号: X 信息输出时左对齐;
%p: 输出日志信息优先级,即 DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002 年 10 月 18 日 22:10:28,921
%r: 输出自应用启动到输出该 log 信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于 %C.%M(%F:%L) 的组合, 包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%x: 输出和当前线程相关联的 NDC(嵌套诊断环境), 尤其用到像 java servlets 这样的多客户多线程的应用中。
%%: 输出一个 "%" 字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息, 产生的日志具体信息
%n: 输出一个回车换行符,Windows 平台为 "/r/n",Unix 平台为 "/n" 输出日志信息换行
Appender 其他属性配置
Threshold=DEBUG: 指定日志消息的输出最低层次。
ImmediateFlush=true: 默认值是 true, 意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out, 指定输出控制台
FileAppender 选项
Threshold=DEBUF: 指定日志消息的输出最低层次。
ImmediateFlush=true: 默认值是 true, 意谓着所有的消息都会被立即输出。
File=mylog.txt: 指定消息输出到 mylog.txt 文件。
Append=false: 默认值是 true, 即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
RollingFileAppender 选项
Threshold=DEBUG: 指定日志消息的输出最低层次。
ImmediateFlush=true: 默认值是 true, 意谓着所有的消息都会被立即输出。
File=mylog.txt: 指定消息输出到 mylog.txt 文件。
Append=false: 默认值是 true, 即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是 KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到 mylog.log.1 文件。
MaxBackupIndex=2: 指定可以产生的滚动文件的最大数。
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m
配置子类Logger
通过配置子类Logger分类输出日志
log4j.logger.[包路径]=[ level ] , appenderName, appenderName
log4j.additivity.[包路径]=false# 子 Logger 是否继承 父 Logger 的 输出源(appender) 的标志位,不继承父类不输出
注:logger 是 category 的子类,category 现在已经不提倡使用。
log4j.properties配置示例
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
在代码中输出日志
org.slf4j.LoggerFactory.getLogger(getClass()).error();
3 Log4j 其他相关
为什么要使用日志工具?将异常堆栈信息输出到日志中e.printStackTrace();其实相当于什么都没做,同时也不会把异常信息输出到日志文件中
log.error(Object var1, Throwable var2);
代码中打印日志用slf4j接口
Spring Framework相关日志输出
# logger for spring
log4j.logger.org.springframework=DEBUG, org.springframework, stdout
log4j.appender.org.springframework=org.apache.log4j.FileAppender
log4j.appender.org.springframework.File=/opt/adstat/log/spring.log
log4j.appender.org.springframework.Encoding=utf8
log4j.appender.org.springframework.layout=org.apache.log4j.PatternLayout
log4j.appender.org.springframework.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
参考文章:
http://www.importnew.com/24746.html
http://www.codeceo.com/article/log4j-usage.html
http://blog.csdn.net/drift_away/article/details/7403658
http://blog.csdn.net/u011794238/article/details/50720087