一、log4j简介
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以把日志信息输送控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等目的地;此外,我们还可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
Log4j主要由三个部分构成:日志信息的优先级,日志信息的输出目的地,和日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。
Log4j有两种系列的版本,一种是1.x系列的版本,可名为Log4j1,目前的最新版本是1.2.17,已停止更新(2012年5月)。另一种是2.x系列的版本,可名为Log4j2,目前的最新版本是2.14.1(2021年3月),还在不断的更新,Log4j2应该会逐渐取代Log4j1。其次,1.x版本的配置文件的后缀名可为".xml"和".properties",而2.x版本不再支持1.x中的以.properties
为后缀的文件配置方式,其配置文件后缀名只能为".xml",".json"或者".jsn"。
二、入门级示例
在程序中使用Log4j之前,需要下载Log4j,1.x系列的Log4j的下载地址为:http://logging.apache.org/log4j/1.2/index.html
,下载完毕后,解压之,应该会发现很多文件,我们只取其中的log4j-1.2.17.jar包,并将其导入到项目的classpath中,然后再将log4j.properties配置文件放于src根目录中(配置文件的位置是可以随意的,只要在初始化Log4j配置时,其路径设置正确即可)。如此,就可以在程序中使用Log4j了。
1.新建一个Java项目,其名Log4jTest,导入1.x系列的Log4j库jar包:log4j-1.2.17.jar,整个项目的最终目录如下:
2.在src的根目录中创建并设置log4j配置文件
### 设置根记录器 ###
log4j.rootLogger = debug,A,B,C
### 输出日志信息到控制台 ###
log4j.appender.A = org.apache.log4j.ConsoleAppender
log4j.appender.A.Target = System.out
log4j.appender.A.layout = org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG级别以上的日志到=D:\\logs\\log.log,分隔符为\\或//都可 ###
log4j.appender.B = org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.File = D://logs//log.log
log4j.appender.B.Append = true
log4j.appender.B.Threshold = DEBUG
log4j.appender.B.layout = org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR级别以上的日志到=D:\\logs\\error.log,分隔符为\\或//都可 ###
log4j.appender.C = org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File = D://logs//error.log
log4j.appender.C.Append = true
log4j.appender.C.Threshold = ERROR
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
3.在主程序中设置日志信息
package log4jtest;
import java.io.File;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
* @author ym
*/
public class Log4jTest {
/**
* @param args
*/
public static void main(String[] args){
// 加载配置文件进行初始化
String path=System.getProperty("user.dir")+File.separator+"src"
+File.separator+"log4j.properties";
PropertyConfigurator.configure(path);
// 获得记录器
Logger logger = Logger.getLogger(Log4jTest.class);
// 输出各种级别的日志信息
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}
}
4.输出结果
(1)首先是输出到控制的日志信息
(2)再就是输出到文件中的日志信息
5.注意事项
在主程序中,我们是通过如下的代码手动初始化配置的:
// 加载配置文件进行初始化
String path=System.getProperty("user.dir")+File.separator+"src"
+File.separator+"log4j.properties";
PropertyConfigurator.configure(path);
这是一种初始化配置的方式,但如果每次使用记录器输出日志信息,都需要手动设置properties文件的路径,那未免有些麻烦。那有没有自动初始化配置的方法呢?答案是:有的。但不管是上述的方法,还是接下来要介绍的方法,都需要告诉程序你的properties配置文件在哪里?只是上述的方法除了要告诉路径外,还要手动初始化配置而已。
如果要告诉程序你的properties配置文件在哪里?可把配置文件所在的文件夹路径添加到classpath中,如例子中的配置文件是在src文件夹中,那么只要把src的路径添加到classpath中即可,如下,往classpath添加了src路径:
如此,就可以使用如下的程序输出日志信息了,显然,相比于手动初始化配置,这种方式无疑要简洁一些。
package log4jtest;
import org.apache.log4j.Logger;
/**
* @author ym
*/
public class Log4jTest {
/**
* @param args
*/
public static void main(String[] args){
// 获得记录器
Logger logger = Logger.getLogger(Log4jTest.class);
// 输出各种级别的日志信息
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}
}
三、配置文件
1.x系列的Log4j支持两种配置文件格式,一种是XML格式的文件(.xml),另一种是properties格式的文件(.properties)。下面我们介绍的是properties格式的配置文件:
配置文件示例:
### 设置根记录器 ###
log4j.rootLogger = debug,A,B,C
### 输出日志信息到控制台 ###
log4j.appender.A = org.apache.log4j.ConsoleAppender
log4j.appender.A.Target = System.out
log4j.appender.A.layout = org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG级别以上的日志到=D:\\logs\\log.log,分隔符为\\或//都可 ###
log4j.appender.B = org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.File = D://logs//log.log
log4j.appender.B.Append = true
log4j.appender.B.Threshold = DEBUG
log4j.appender.B.layout = org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR级别以上的日志到=D:\\logs\\error.log,分隔符为\\或//都可 ###
log4j.appender.C = org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File = D://logs//error.log
log4j.appender.C.Append = true
log4j.appender.C.Threshold = ERROR
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
(1)配置根记录器Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
其中,level
是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过定义此处的级别,可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了DEBUG级别,则应用程序中所有级别的日志信息都将被打印出来,而如果在这里定义了INFO级别,则应用程序中的DEBUG级别的日志信息将不被打印出来,因为DEBUG的优先级低于INFO的优先级。为了可以打印所有级别的日志信息,此处一般把级别设置为DEBUG。appenderName
是追加器的名称,用于指定日志信息所输出的地方。追加器可以有多个,即可以同时指定多个输出目的地。
(2)配置日志信息的输出目的地Appender,其语法为:
log4j.appender.appenderName = 全限定类名
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(3)各种追加器的选项设置
- ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台 - FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件内容。 - DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
’.'yyyy-MM: 每月
’.'yyyy-ww: 每周
’.'yyyy-MM-dd: 每天
’.'yyyy-MM-dd-a: 每天两次
’.'yyyy-MM-dd-HH: 每小时
’.'yyyy-MM-dd-HH-mm: 每分钟
- RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB:后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
(4)配置日志信息的布局,其语法为:
log4j.appender.appenderName.layout = 全限定类名
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式,推荐使用这种
),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
(4)日志输出格式的设置
在配置文件中可以通过log4j.appender.appenderName.layout.ConversionPattern设置日志的输出格式。
各种通配符如下:
%p: priority,输出日志信息的优先级,即ALL,DEBUG,INFO,WARN,ERROR,FATAL, OFF
%d: date,输出日志记录的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: class,输出日志信息所属的类目(类信息从创建logger时传入的Class对象className.class中获得),通常就是所在类的全限定类名,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间。
%C: 列出调用logger的类的全限定名称(包含包路径),假设当前类是"org.apache.xyz.SomeClass",%C表示org.apache.xyz.SomeClass,%C{1}表示SomeClass。
%t: thread,输出产生该日志事件的线程名,主程序中的线程名默认是main
%l: location,输出日志事件的发生位置,相当于%c.%t(%f:%L)的组合,包括类目、发生的线程,以及在代码中的行数。举例:log4jtest.Log4jTest.main(Log4jTest.java:24)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
%%: 输出一个”%”字符
%F: file name,输出日志消息产生时所在的源文件名称
%L: line number,输出调用logger的代码行的行号
%m: message,输出代码中的指定消息,即日志的具体信息
%M: 输出调用logger的方法名
%n: 输出一个回车换行符,Windows平台为”/r/n”,Unix平台为”/n”输出日志信息换行
可以在%与通配字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
%20c :指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
%-20c :指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
%.30c :指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
log4j.logger 用法如下
# 1)log4j.logger.包名 = 日志级别 , appenderName1,appenderName2,....
# 定义该包名下的所有类的日志输出
# 2)log4j.logger.类全名含包名 = 日志级别 ,appenderName1,appenderName2,....
# 定义指定类的日志输出
# 3) log4j.logger.日志对象Logger命名名称 = 日志级别 , appenderName1,appenderName2,....
# 定义了某命名名称的日志的 输出,如:
# log4j.logger.Log1 就是指定义通过 Logger.getLogger("Log1") 获取的日志对象的日志输出
#以log4j.logger.包名为例子
log4j.logger.edu.service.impl = error,service_stdout,service_logfile
log4j.appender.service_stdout=org.apache.log4j.ConsoleAppender
log4j.appender.service_stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.service_stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n
log4j.appender.service_logfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.service_logfile.file=d:\\log\\service.log
log4j.appender.service_logfile.DatePattern= '.'yyyy-MM-dd
log4j.appender.service_logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.service_logfile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n
log4j.appender.service_logfile.Encoding=UTF-8
```