本章主要讲解如何在Spring MVC中配置Log4j,并对log4j.properties 的属性进行介绍。
1.Spring MVC配置Log4j
1.1.pom.xml
<log4j.version>1.2.17</log4j.version>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
1.2.log4j.properties
src\main\resources\log4j.properties
log4j.rootLogger=all, stdout, file
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} %-5p %c{1}:%L - %m%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:/Users/hanchao/IdeaProjects/hispringmvc/hi-spring-mvc.log
log4j.appender.file.MaxFileSize=5KB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.S} %-5p %c{1}:%L - %m%n
1.3.App.java
package pers.hanchao.hespringmvc.log4j;
import org.apache.log4j.Logger;
/**
* <p>Log4j实例</p>
* @author hanchao 2018/1/19 21:42
**/
public class App {
private static final Logger LOGGER = Logger.getLogger(App.class);
public static void main(String[] args) {
LOGGER.fatal("致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。");
LOGGER.error("错误级别日志: 指出虽然发生错误事件,但仍然不影响系统的继续运行的信息。");
LOGGER.warn("警告级别日志: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。");
LOGGER.info("消息级别日志: 用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。");
LOGGER.debug("调试级别日志: 开发人员可以将任意信息在此打印,比如局部变量的值等等,主要是为了了解程序运行状态,便于调试。");
LOGGER.trace("跟踪级别日志: 一般不使用。");
}
}
1.4.result
2018-01-19 21:43:32 FATAL App:13 - 致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。
2018-01-19 21:43:32 ERROR App:14 - 错误级别日志: 指出虽然发生错误事件,但仍然不影响系统的继续运行的信息。
2018-01-19 21:43:32 WARN App:15 - 警告级别日志: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
2018-01-19 21:43:32 INFO App:16 - 消息级别日志: 用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
2018-01-19 21:43:32 DEBUG App:17 - 调试级别日志: 开发人员可以将任意信息在此打印,比如局部变量的值等等,主要是为了了解程序运行状态,便于调试。
2018-01-19 21:43:32 TRACE App:18 - 跟踪级别日志: 一般不使用。
如果将src\main\resources\log4j.properties
的第一行修改诚如下
log4j.rootLogger=info, stdout, file
则运行结果为:
2018-01-19 21:45:16 FATAL App:13 - 致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。
2018-01-19 21:45:16 ERROR App:14 - 错误级别日志: 指出虽然发生错误事件,但仍然不影响系统的继续运行的信息。
2018-01-19 21:45:16 WARN App:15 - 警告级别日志: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
2018-01-19 21:45:16 INFO App:16 - 消息级别日志: 用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
2.log4j.properties详解
2.1.日志级别
- 日志级别:all < debug < info < warning < error < fatal
- 当前开启某一级别日志时,大于它的日志也将被开启
- 常用的日志级别有 debug(开发环境) info(生产环境)
2.2.日志载体配置
- 日志载体共有五种类型,分别是控制台、文件、以大小划分的日志文件、以时间划分的日志文件以及输出流。
- 本例中定义了两种日志载体,分别为 stdout-控制台 和 file-以大小划分的日志文件
- 日志载体的名称并不限定,例如,我将
log4j.rootLogger=info, stdout, file
修改为log4j.rootLogger=info, console, bigfile
,也能实现同样的效果,只不过后面的配置也要做相应的调整。 - 日志输出媒介数量至少有一种,可以有多种。
2.3.日志载体
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.file=org.apache.log4j.RollingFileAppender
以上代码的作用是:将stdout
设置为控制台日志载体,file
设置为以大小划分的日志文件。
全部可用的日志载体类型有:
1. org.apache.log4j.WriterAppender : 输出流
2. org.apache.log4j.ConsoleAppender : 控制台
3. org.apache.log4j.FileAppender : 文件
4 org.apache.log4j.DailyRollingFileAppender : 以时间划分的日志文件
5. org.apache.log4j.RollingFileAppender : 以大小划分的日志文件
这些Appender
都是AppenderSkeleton
的子类,这些Appender
的类图如下:
2.4.输出布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
以上代码的作用是:设置stdout
的日志输出布局为
1. org.apache.log4j.SimpleLayout : 包含日志信息的级别和信息字符串
2. org.apache.log4j.TTCCLayout : 包含日志产生的方法、类路径等信息
3. org.apache.log4j.HTMLLayout : 以HTML代码模式布局
4. org.apache.log4j.PatternLayout : 自定义模式布局
2.4.1.SimpleLayout的运行结果
FATAL - 致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。
2.4.2.TTCCLayout的运行结果
[main] FATAL pers.hanchao.hespringmvc.log4j.App - 致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。
2.4.3.HTMLLayout的运行结果
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Log4J Log Messages</title>
<style type="text/css">
<!--
body, table {font-family: arial,sans-serif; font-size: x-small;}
th {background: #336699; color: #FFFFFF; text-align: left;}
-->
</style>
</head>
<body bgcolor="#FFFFFF" topmargin="6" leftmargin="6">
<hr size="1" noshade>
Log session start time Fri Jan 19 22:14:58 CST 2018<br>
<br>
<table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
<tr>
<th>Time</th>
<th>Thread</th>
<th>Level</th>
<th>Category</th>
<th>Message</th>
</tr>
<tr>
<td>0</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>FATAL</strong></font></td>
<td title="pers.hanchao.hespringmvc.log4j.App category">pers.hanchao.hespringmvc.log4j.App</td>
<td title="Message">致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。</td>
</tr>
2.4.4.PatternLayout的运行结果
2018-01-19 22:19:22 FATAL App:13 - 致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。
此布局需要注意在log4j.properties
中添加ConversionPattern
,如下:
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
ConversionPattern
的常用参数如下:
%c
类的全名,如pers.hanchao.hespringmvc.log4j.App
%d
时间,如2018-01-19 22:23:29,899
;可以通过{}指定格式,如%d{yyyy-MM-dd}
,输出为2018-01-19
%l
类路径(精确到行),如pers.hanchao.hespringmvc.log4j.App.main(App.java:13)
%m
即日志信息本身,如*致命级别日志: 指出每个严重的错误事件将会导致应用程序的退出。*
%n
回车换行%p
打印当前日志的日志级别,如:LOGGER.fatal("致命错误");
的日志级别为FATAL
%r
输出自应用启动到输出该日志信息所耗费的毫秒数%t
输出产生该日志事件的线程名,如main
2.5.AppenderSkeleton抽象日志媒介-配置项
- layout : 布局,前面讲过
- threshold : 指定日志消息的输出最低层次。如
threshold = ERROR
,日志输出的最低层次是ERROR
。
2.5.WriterAppender输出媒介-配置项
配置项:
- encoding : 输出的编码格式,默认按照系统的默认编码格式输出
- immediateFlush : 是否需要立刻记录,默认为true,表示每产生一条日志都立刻输出到日志媒介上。
2.6.ConsoleAppender控制台-配置项
继承关系:
public class ConsoleAppender extends WriterAppender {//...}
配置项:
- target : 输出方式,可选
System.out
和System.err
,默认为System.out
2.7.FileAppender日志文件-配置项
继承关系:
public class FileAppender extends WriterAppender {//...}
配置项:
- fileAppend : 是否追加
- fileName : 日志文件全路径
2.8.RollingFileAppender以大小划分的日志文件-配置项
继承关系:
public class RollingFileAppender extends FileAppender {//...}
配置项:
- maxFileSize : 最大文件大小,默认为10485760L。允许通过使用KB,MB,或者GB来方便的指定文件的大小。
- maxBackupIndex : 设置备份文件能够存在的最大索引号。Log4J会把已经达到最大值的日志文件后缀名修改为1,2,3,4等,并重开log.log,用来作为最新日志记录文件。本例中maxBackupIndex = 10
,则最多存在11个日志文件分别是*.log/*.log.1/*.log.2.../*.log.10
2.9.DailyRollingFileAppender以时间划分的日志文件-配置项
继承关系:
public class DailyRollingFileAppender extends FileAppender {//...}
配置项:
- datePattern : 多次时间产生一个新的日志文件。例如,默认为datePattern = '.'yyyy-MM-dd
,即一天一个日志文件。
DatePattern
的其他配置:
datePattern = '.'yyyy-MM
monthly 每月产生一个日志文件datePattern = '.'yyyy-ww
weekly 每周产生一个日志文件datePattern = '.'yyyy-MM-dd
daily 每天产生一个日志文件datePattern = '.'yyyy-MM-dd-a
half-daily 每半天产生一个日志文件datePattern = '.'yyyy-MM-dd-HH
hourly 每小时产生一个日志文件datePattern = '.'yyyy-MM-dd-HH-mm
minutely 每分钟产生一个日志文件