关于log4j的研究

45 篇文章 1 订阅

       虽然用了老长一段时间的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"
%ca.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"
%Corg.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的源文件名%FMyClass.java
%l
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数%lMyClass.main(MyClass.java:129)
%L
显示调用logger的代码行%L129
%m
显示输出消息%mThis is a message for debug.
%M
显示调用logger的方法名%Mmain
%n
当前平台下的换行符%nWindows平台下表示rn
UNIX平台下表示n
%p
显示该条日志的优先级%pINFO
%r
显示从程序启动时到记录该条日志时已经经过的毫秒数%r1215
%t
输出产生该日志事件的线程名%tMyClass
%x
按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志假设某程序调用顺序是MyApp调用com.foo.Bar
%c %x - %m%nMyApp - 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 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值