参考网址:
【http://blog.csdn.net/drift_away/article/details/7403658】
【http://blog.csdn.net/lxzo123/article/details/6331783】
【http://baike.baidu.com/view/25347.htm?fr=aladdin】
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库等目标,而且所有的这些实现都可以通过更改配置文件来实现,实际应用非常便利。最近因为工作需要,对这个类库做了比较详细的学习,整理资料如下:
一、Log4j的使用。
1)、下载需要下载其官方(http://logging.apache.org/log4j/2.x/)的jar包,引入工程
2)、置本地的log4j.properties文件。(默认读取的是src根目录地址,如果不在根目录,则需要在使用前调用其设置即可)
PropertyConfigurator.configure( "D:/Code/conf/log4j.properties");
3)、在代码中获取日志,并调用其接口记录日志
1 Logger logger = Logger.getLogger(TestLog4j.class ); 2 logger.debug( " debug消息 " ); 3 logger.error( " error消息 " );
二、Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties格式的文件。下面我们介绍使用properties格式做为配置文件的方法:二、Log4j.properties配置文件介绍
1)、Log4j.properties参数比较多,不过搞清楚其规律则会非常好用,我们首先看一个独立的日志配置项,然后逐一介绍其参数内容和可选项。
一个简单的完整日志配置
#配置根Logger log4j.rootLogger=INFO,appenderName1,appenderName2, … #配置日志信息输出目的地Appender log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.optionN = valueN #配置日志信息的格式(布局) log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.optionN = valueN |
其中appenderName可以当作是定义了一个变量,并配置其具体参数内容。
2)、上述文件中的参数介绍如下。
1、 配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
2、 配置日志信息输出目的地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.lf5.LF5Appender (应用于Log Factor 5 Appender:)
org.apache.log4j.net.SMTPAppender(# 应用于发送日志给邮件: )
org.apache.log4j.jdbc.JDBCAppender(# 应用于数据库:)
..............................................................................................................................................
(1).ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.'yyyy-MM: 每月
2)’.'yyyy-ww: 每周
3)’.'yyyy-MM-dd: 每天
4)’.'yyyy-MM-dd-a: 每天两次
5)’.'yyyy-MM-dd-HH: 每小时
6)’.'yyyy-MM-dd-HH-mm: 每分钟
(4).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:指定可以产生的滚动文件的最大数。
3、配置日志信息的布局,其语法为:
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(包含日志产生的时间、线程、类别等等信息)
4、输出格式设置 (类似C语言中的printf函数的打印格式)
在配置文件中可以通过log4j.appender.A1.layout.ConversionPattern设置日志输出格式。
参数:
%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”输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
****************************************************************************
下面给出一个日志文件配置各种不同场景的完整demlog4j.rootLogger=DEBUG,CONSOLE,A1,im#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.net.SocketAppende
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
三、Log4j配置不同日志文件目录(不同数据库类似)
1、我们除了对不同级别的日志设置不同输出appender目标,在一个单个配置文件中,也可设置多个日志文件以供不同场景使用。
假设我们需要对三个不同场景"系统","操作","远程访问"分别记录日志。那么可以使用如下配置。
log4j.logger.log.SYSTEM_LOG=,SYSTEM_LOG
log4j.logger.log.OPERATE=,OPERATE
log4j.logger.log.REMOTE=,REMOTE
# SYSTEM_LOG
log4j.appender.SYSTEM_LOG=org.apache.log4j.RollingFileAppender
log4j.appender.SYSTEM_LOG.File=E:/icloud/log/SYSTEM_LOG.log
log4j.appender.SYSTEM_LOG.encoding=UTF-8
log4j.appender.SYSTEM_LOG.Threshold=all
log4j.appender.SYSTEM_LOG.MaxFileSize=50MB
log4j.appender.SYSTEM_LOG.MaxBackupIndex=10
log4j.appender.SYSTEM_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSTEM_LOG.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss} %m %n
# REMOTE远程访问
log4j.appender.REMOTE=org.apache.log4j.RollingFileAppender
log4j.appender.REMOTE.File=E:/icloud/log/REMOTE.log
......
# OPERATE 操作日志
log4j.appender.OPERATE=org.apache.log4j.RollingFileAppender
log4j.appender.OPERATE.File=E:/icloud/log/OPERATE.log
......
在Java代码中,可以通过传入对应参数来获得制定的日志类。
Logger system_log = log.getLogger("log.SYSTEM_LOG");
Logger operate = log.getLogger("log.OPERATE");
Logger remote = log.getLogger("log.REMOTE");
其中,传入的字符串参数即为log4j.logger.log.SYSTEM_LOG定义中的红色部分。
如果是不同包结构,也可以使用上述方式,不同的是字符串替换成包路径。下面定义中,com.supermap.action和com.supermap.view分别代表不同的包。
log4j.logger.com.supermap.action=INOF,AppenderName1
log4j.logger.com.supermap.view=INOF,AppenderName2
获取Log可以通过直接传入包名的方式
Logger log = log.getLogger("com.supermap.action");
也可以通过对应包下的class,并且会通过包结构层级往上传递。下面两者返回统一的日志记录目标相同。
Logger log = log.getLogger(com.supermap.action.DrawAction.class);
Logger log = log.getLogger(com.supermap.action.util.DrawActionTool.class);
2、我们也可以通过编写代码动态配置的方式来修改LogProperties中的信息。
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream("com/supermap/tools/locationnormalise/log/log4j.properties");
Properties p = new Properties();
try {
p.load(in);
//默认日志路径
p.setProperty("log4j.appender.SYSTEM_LOG.File", filePath+"/SYSTEM_LOG.log");
p.setProperty("log4j.appender.OPERATE.File", filePath+"/OPERATE.log");
p.setProperty("log4j.appender.REMOTE.File", filePath+"/REMOTE.log");
PropertyConfigurator.configure(p);
} catch (IOException e) {
e.printStackTrace();
}
3、最后,log4j.Properties中支持对环境变量的引用,可以通过更改环境变量来设置不同的日志记录目标
Log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其中“${WORKDIR}/”是个变量,会被System Property中的“WORKDIR”的值代替。这样,我们就可以在log4j加载配置文件之前,先用System.setProperty设置好根路径。