虽然用了老长一段时间的log4j了,基本的配置也都在项目里面使用了,但总还是会有一些问题时不时的摆在自己面前,还有有时候想修改一下输出格式,还的在网上搜,于是最近研究了一下,总结如下:
slf4j是java日志的接口,下面有好多实现,比如log4j,commons-logging,logback,jdk-log,如下图:
因为slf4j是接口日志包,所以在具体的项目里面可以选择不同的实现包,这样在代码里面只用调用slf4j的方法,具体在部署时可以选择不同的实现包,比如log4j或commons-logging进行切换,不用更改代码。但需要一个桥梁包用户slf4j api包和实现包的连接,比如slf4j-log4j12-1.7.5.jar。
因为在项目里面用的最多的还是log4j,因此下面专门讲解log4j。
配置文件log4j.properties,需要放在classpath下面,一般都是放在src目录下面。jar包只用一个log4j.jar。
1、在项目里面配置自定义的logger时,有时会遇到logger和category,他们之间的关系是category是旧版本中用的,logger是最近的,logger继承了category,现在一般都用logger。
2、日志级别:FATAL >ERROR>WARN >INFO > DEBUG
3、appender
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
4、layout
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
5、自定义layout格式
参数 | 说明 | 例子 | |
---|---|---|---|
%c
|
列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 |
log4j配置文件参数举例
|
输出显示媒介
|
假设当前logger名字空间是"a.b.c" | |||
%c | a.b.c | ||
%c{2} | b.c | ||
%20c | (若名字空间长度小于20,则左边用空格填充) | ||
%-20c | (若名字空间长度小于20,则右边用空格填充) | ||
%.30c | (若名字空间长度超过30,截去多余字符) | ||
%20.30c | (若名字空间长度小于20,则左边用空格填充;若名字空间长度超过30,截去多余字符) | ||
%-20.30c | (若名字空间长度小于20,则右边用空格填充;若名字空间长度超过30,截去多余字符) | ||
%C
|
列出调用logger的类的全名(包含包路径) | 假设当前类是"org.apache.xyz.SomeClass" | |
%C | org.apache.xyz.SomeClass | ||
%C{1} | SomeClass | ||
%d
|
显示日志记录时间,{<日期格式>}使用ISO8601定义的日期格式 | %d{yyyy/MM/dd HH:mm:ss,SSS} | 2005/10/12 22:23:30,117 |
%d{ABSOLUTE} | 22:23:30,117 | ||
%d{DATE} | 12 Oct 2005 22:23:30,117 | ||
%d{ISO8601} | 2005-10-12 22:23:30,117 | ||
%F
|
显示调用logger的源文件名 | %F | MyClass.java |
%l
|
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 | %l | MyClass.main(MyClass.java:129) |
%L
|
显示调用logger的代码行 | %L | 129 |
%m
|
显示输出消息 | %m | This is a message for debug. |
%M
|
显示调用logger的方法名 | %M | main |
%n
|
当前平台下的换行符 | %n | Windows平台下表示rn UNIX平台下表示n |
%p
|
显示该条日志的优先级 | %p | INFO |
%r
|
显示从程序启动时到记录该条日志时已经经过的毫秒数 | %r | 1215 |
%t
|
输出产生该日志事件的线程名 | %t | MyClass |
%x
|
按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志 | 假设某程序调用顺序是MyApp调用com.foo.Bar | |
%c %x - %m%n | MyApp - Call com.foo.Bar. com.foo.Bar - Log in Bar MyApp - Return to MyApp. |
||
%X
|
按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。 | %X{5} | (记录代号为5的客户端的日志) |
%%
|
显示一个百分号 | %% | % |
6、修改logger4j配置文件位置
PropertyConfigurator.configure("baby/logger4jconfig.property");
7、控制台选项:
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
8、FileAppender 选项
Threshold=DEBUF:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
9、RollingFileAppender 选项
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
10、占位符
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20m:指定输出category的名称,最小的宽度是20,如果小于20的话,默认的情况下右对齐。
2)%-20m:指定输出category的名称,最小的宽度是20,如果小于20的话,"-"号指定左对齐。
3)%.30m:指定输出category的名称,最大的宽度是30,如果大于30的话,就会将左边多出的字符截掉,但 小于30的话也不会有空格。
4)%20.30m:如果小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
11、log4j.rootCategory 是根logger,其他logger默认会集成此logger,但若使用log4j.additivity.loggername=false,则会不集成父logger
12、在logger4j里面,自定义的logger都是有一个父子关系的,比如说包名x.y是一个logger,x.y.z也是一个logger,那么x.y就是x.y的父logger,可以通过log4j.additivity=true/false来配置是否继承父apperder
13、一个logger,可以配置多个appender,logger后面的第一个参数是此logger的最低输出日志级别,但在appender里面也可以通过Threshold= error来设置级别。
14、若一个类属于属于多个logger,当子logger配置继承为假的时候,只会在子logger里面打印,若配置真(默认)时,会在子logger和父logger里面都会打印
15、实战:
#根logger log4j.rootCategory=debug, stdout #log4j.rootCategory=debug #为spring配置logger,根据包名(包含子包) log4j.category.org.springframework.beans.factory=DEBUG log4j.logger.org.springframework.remoting.rmi.RmiServiceExporter=INFO #为包名baby.log.log4j配置logger,包含子包(子包特殊指定logger时,不会在此logger里面输出) log4j.logger.baby.log.log4j=DEBUG, stdout log4j.additivity.baby.log.log4j=false #为包名baby.log.log4j.service.impl配置logger,包含子包(子包特殊指定logger时,不会在此logger里面输出),即 #现在这个logger不会在上面的父logger里面输出 log4j.logger.baby.log.log4j.service.impl=DEBUG, net log4j.additivity.baby.log.log4j.service.impl=false #根据指定的名字配置logger,此时在代码里面写的是Logger logger = Logger.getLogger("FTPD"); log4j.logger.FTPD=DEBUG,ftpd,D,E log4j.additivity.FTPD=false log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%-80m]-[%p] [%d] [%t] [%c{2}] - %n log4j.appender.net=org.apache.log4j.RollingFileAppender log4j.appender.net.File=net.log log4j.appender.net.MaxFileSize=5000kb log4j.appender.net.MaxBackupIndex=10 log4j.appender.net.layout=org.apache.log4j.PatternLayout log4j.appender.net.layout.ConversionPattern=[%-80m]-[%p] [%d] [%t] [%c] - %n log4j.appender.ftpd=org.apache.log4j.RollingFileAppender log4j.appender.ftpd.File=ftpderror.log log4j.appender.ftpd.Threshold =error log4j.appender.ftpd.Append = true log4j.appender.ftpd.MaxFileSize=1024KB log4j.appender.ftpd.MaxBackupIndex=10 log4j.appender.ftpd.layout=org.apache.log4j.PatternLayout log4j.appender.ftpd.layout.ConversionPattern=[%-80m]-[%p] [%d] [%t] [%c] - %n #debug级别之上的输出到log文件 log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n #ERROR 级别之上的输出到ERROR 文件 log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n