Log4j不同的包做不同的日志处理

时间:2021-02-21 23:19:08

项目进行过程中,有若干debug信息需要打印。之前都是统一一个rootCatogry输出,将日志级别调整到debug后,会输出框架的很多debug代码,导致日志文件非常大。知道log4j可以将不同的包下的日志输出到不同的位置,在网上恶补了一下log4j的基础概念之后,得到了一个可以暂时使用的方案。

 

Log4j配置中分为logger、appender、layout等几种元素,其中appender、layout的配置网上介绍比较多,不再赘述。通过对logger的定义,可以做到上述的需求。

 

Logger的定义需要指定级别,appender等。rootLogger是所有Log的父log,除此之外,还可以自定义若干logger。logger的继承关系是根据名称的前缀匹配决定的,如logger a为logger a.b的父log。在父log中定义的属性可以在子log中被覆盖。

 

如果在代码中通过Logger.getLogger(this.getClass)的方式得到Logger对象,就可以做到不同的包的日志做不同的处理。如定义logger org.apache.struts的级别为INFO,Logger com.mypack的级别为DEBUG,就可以做到不看框架复杂的DEBUG信息,同时自己写的类中可以使用log.debug()输出调试信息。

 

另外,我现在使用的方式是只定义了两个appender,所有的logger共用,在使用的时候会出现:

log4j:ERROR Attempted to append to closed appender named [A1].
log4j:ERROR Attempted to append to closed appender named [A2].

这样的错误信息。经过google发现可能是由于共用appender所致,具体原因还没有找到。

 

刚开始做项目,关于日志管理的理解还很初步,欢迎指教。

 

==============================================================

关于log4j:ERROR Attempted to append to closed appender named [A1].

 

之前的配置文件没问题,增加了一个logger之后无论怎么改,都会出现这个问题。最后无奈,将配置文件完全复原,竟然还是有这个错误。这是个web项目,突然想到将tomcat中webapp文件夹下部署的文件夹完全删除再重新部署,问题竟然解决了!然后重新配置多个logger,都没有问题。

 

不禁想到一句名言:对于此类不能用常理解决的问题,我们统统归结为人品!

 

粘贴我的log4j.properties如下:

 

 

#定义2个输出端
log4j.rootCategory=INFO,A1,A2
log4j.logger.edu.tju=DEBUG #这一句为新添加的,将我自己的类的日志级别调整为DEBUG级别,顺便秀一下母校天津大学^_^


#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p [%c] (%t) %m%n


#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./hrms12319.log
#定义A2输出文件的最大长度
log4j.appender.A2.MaxFileSize = 10000KB
#定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p [%c] (%t) %m%n