Log4j学习(使用流程,Log4j.properties配置文件,配置到多个不同目标)

时间:2024-01-11 12:07:08

参考网址:

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)、在代码中获取日志,并调用其接口记录日志

 Logger logger  =  Logger.getLogger(TestLog4j.class );
logger.debug( " debug消息 " );
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设置好根路径。