Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地(控制台、文件、GUI组件,甚至是套接口服务器),我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。—百度百科
一、Log4j基本用法
1. 添加log4j依赖(添加Log4j包)
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
2. 在相关业务类中创建Logger对象
2.1创建Logger对象有两种方式,第一种是通过当前类的Class对象创建。
public class UserService {
//用当前类创建Logger对象
public static final Logger logger = Logger.getLogger(UserService.class);
public void userAdd(){
//省略内容...
}
}
2.2第二种方式则通过自定义名称创建。(不建议采用该方式)
public class UserService {
//用当前类创建Logger对象
public static final Logger logger = Logger.getLogger("test");
public void userAdd(){
//省略内容...
}
}
3. 在业务代码中添加日志输出代码
根据系统中日志信息的重要程度,选择logger对象不同的级别进行记录,log4j会根据配置文件(log4j.properties)中配置的日志级别来输入对应的日志。
public void userAdd(){
logger.debug("记录Debug级别信息......");
logger.info ("记录Info级别信息......");
logger.warn ("记录Warn级别信息......");
logger.error("记录Error级别信息......");
logger.fatal("记录fatal级别信息......");
}
4. 添加Log4j配置文件
Log4j中组件是通过属性文件进行配置的,该文件默认名称为log4j.properties
,默认路径在src
根目录下,在web项目中,通过在web.xml
文件中添加log4jConfigLocation属性来修改配置文件名称及路径。
4.1 web.xml中修改log4j.properties文件名称及路径
<context-param>
<param-name>log4jConfigLocation</param-name >
<param-value>classpath:log4j.properties</param-value>
</context-param>
4.2 log4j.properties文件配置示例
######配置输出日志的目录和输出日志的级别##########
#rootLogger:设置输出根目录(classpath)下所有配置了Logger对象的日志
#第一个参数Debug: 输出什么级别的日志
#第二个参数stout: 输出哪个Appender(可配置多个Appender,如:DF_DEBUG,DF_ERROR)
#log4j.logger.cn.ship.log4j=warn,stout :输出cn.ship.log4j包下的配置了Logger对象的日志,如果指定包下的日志级别小于rootLogger,则指定包下的日志按当前配置级别输出
#log4j.logger.test = warn,stout:基于Logger名称的访问,需要在创建logger对象的时候用名称指定(参见创建Logger第二种形式)
#############################################
log4j.rootLogger=debug,stout,DF_DEBUG,DF_ERROR
log4j.logger.cn.ship.log4j=warn,stout
log4j.logger.test = warn,stout
##################控制台输出##################
#log4j.appender.stout : 指定采用那种方式进行日志输出(控制台方式),stout为用户自定义appender名称
#log4j.appender.stout.Target : 采用System.out方式进行输出,还可以使用System.err
#log4j.appender.stout.layout : 指定当前Appender的日志的布局模式(当前选用PatternLayout模式)
#log4j.appender.stout.layout.ConversionPattern : 指定PatternLayout模式的日志格式
############################################
log4j.appender.stout=org.apache.log4j.ConsoleAppender
log4j.appender.stout.Target=System.out
log4j.appender.stout.layout=org.apache.log4j.PatternLayout
log4j.appender.stout.layout.ConversionPattern= [%5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
##################滚动文件输出(DEBUG级别)##################
log4j.appender.DF_DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DF_DEBUG.File=/home/ship/log/debug.log
log4j.appender.DF_DEBUG.Threshold=DEBUG
log4j.appender.DF_DEBUG.DatePattern='.'yyyy-MM-dd'
log4j.appender.DF_DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DF_DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
##################滚动文件输出(ERROR级别)##################
log4j.appender.DF_ERROR=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DF_ERROR.File=/home/ship/log/error.log
log4j.appender.DF_ERROR.Threshold=ERROR
log4j.appender.DF_ERROR.DatePattern='.'yyyy-MM-dd'
log4j.appender.DF_ERROR.layout=org.apache.log4j.PatternLayout
log4j.appender.DF_ERROR.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
二、Log4j组件
通过log4j结构图可以看出Log4j分别由Logger(日志写入器)、日志输出终端(Appender)、日志布局模式(Layout)三个重要组件构成。其中一个Logger对应多个Appender,一个Appender包含一种日志布局模式。
1. 日志写入器(Logger)
Logger主要负责记录日志信息,根据日志信息的重要程度,Logger对象共分为以下几种日志级别,从高到底分别为:
日志级别 | 说明 |
---|---|
OFF | 最高等级,用于关闭所有的日志记录 |
FATAL | 指出每个严重的错误事件将会导致应用程序的退出 |
ERROR | 指出虽然发生错误事件,但仍然不影响系统的继续允许 |
WARN | 指出会出现潜在的错误情形 |
INFO | 一般用于粗粒度级别上,强调应用程序的运行全程 |
DEBUG | 一般用于细粒度级别上,对于调式程序非常有帮助 |
ALL | 最低等级,用于打开所有日志记录 |
Log4j建议只使用四个级别,优先级从高到低分别是:ERROR、WARN、INFO、DEBUG。通过在这里定义级别,你可以控制应用程序中相应级别的日志信息的开关。
2. 日志输出终端(Appender)
Appender用于配置日志信息输出的目的地,Log4j提供了一下几种Appender对象:
Appender对象 | 说明 |
---|---|
org.apache.log4j.ConsoleAppender | 输入至控制台 |
org.apache.log4j.FileAppender | 输入至文件 |
org.apache.log4j.DailyRollingFileAppender | 输入至文件(按照指定时间生成文件) |
org.apache.log4j.RollingFileAppender | 输入至文件(按照指定文件大小生成文件) |
org.apache.log4j.WriterAppende | 将日志信息以流的方式发送到指定地点 |
3. 日志布局模式(Layout)
3.1 Layout负责控制日志信息输出格式,Log4j提供了以下几种布局模式:
Layout对象 | 对象说明 |
---|---|
org.apache.log4j.HTMLLayout | 已HTML表格形式布局 |
org.apache.log4j.PatternLayout | 可以灵活地自定义布局 |
org.apache.log4j.SimpleLayout | 包含日志信息的级别和消息字符串的简单布局 |
org.apache.log4j.TTCCLayout | 包含日志产生的时间、线程、类别等等信息 |
3.2 如果采用PatternLayout模式,则可以通过如下参数来自定义日志格式:
参数 | 说明 |
---|---|
%m | 输入代码中指定的消息 |
%p | 输出优先级,即DEBUG,INFO,WARN,ERROR |
%r | 输出自应用启动到输出该log消息耗费的毫秒数 |
%c | 输出所属的类目,通常就是所在类的全名 |
%t | 输出产生该日志事件的线程名 |
%n | 输出一个回车换行符 |
%d | 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如%d{yyyy-MM-dd HH:mm:ss,SSS} |
%l | 输出日志事件的发生位置,包括类名,发生的线程,以及在代码中的函数 |
%x | 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像Java Servlet这样的多客户多线程的应用中 |
%% | 输出一个”%”字符 |
%F | 输出日志消息产生时所在的文件名称 |
%L | 输出代码中的行号 |
3.3 我们也可以通过在百分号(%)与模式字符之间加上修饰符来控制最小宽度、最大宽度和对齐方式,如下:
- %20c : 指定输出category的名称,最小宽度是20,如果category的名称小于20的话,默认右对齐。
- %-20c : 指定输出category的名称,最小宽度是20,如果category的名称小于20的花,“-”号指定左对齐。
- %.30c : 指定输出category的名称,最大宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
- %20.30c : 如果category的名称小于20就补空格,并且右对齐,如果其名称大于30, 就将左边多出的字符截掉。