现在的位置: 首页 > 综合 > 正文

Log4j的基本配置和个人理解

2018年02月05日 ⁄ 综合 ⁄ 共 3715字 ⁄ 字号 评论关闭

详细信息请参照   如何使用Log4j? http://www.blogjava.net/rickhunter/articles/28133.html此文章写的比较详细。

先看我的log4j的配置:

Log4j.properties  放在src/resource目录下,会自动加载log4j配置(即使你使用junit测试此配置文件还会加载)。

# Global Log Level(OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL)
##假如是debug级别,OFF,FATAL,ERROR,WARN,INFO,DEBUG的将会打印
##假如是INFO级别,OFF,FATAL,ERROR,WARN,INFO的将会打印
 
log4j.rootCategory=DEBUG, stdout , R  
  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n  
   
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.R.File=D:\\myLog.log  
log4j.appender.R.layout=org.apache.log4j.PatternLayout  
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n  
  
log4j.logger.com.neusoft=DEBUG  
log4j.logger.com.opensymphony.oscache=ERROR  
log4j.logger.net.sf.navigator=ERROR  
log4j.logger.org.apache.commons=ERROR  
log4j.logger.org.apache.struts=WARN  
log4j.logger.org.displaytag=ERROR  
log4j.logger.org.springframework=DEBUG  
log4j.logger.com.ibatis.db=WARN  
log4j.logger.org.apache.velocity=FATAL  
  
log4j.logger.com.canoo.webtest=WARN  
 
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN  
log4j.logger.org.hibernate=DEBUG  
log4j.logger.org.logicalcobwebs=WARN 

里面的详细语法请参照上面的链接,这里不做重复性叙述。

我在此说明两点:

(1),在项目中我们经常可以看到这样的代码:

if (logger.isDebugEnabled()) {

    logger.debug(message);

}

为什么不直接logger.debug(message);而先判断有没有开启debug模式呢?

我们参照log4j源码分析:

org.apache.log4j. Categoryy

# Global Log Level(OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL)
##假如是debug级别,OFF,FATAL,ERROR,WARN,INFO,DEBUG的将会打印
##假如是INFO级别,OFF,FATAL,ERROR,WARN,INFO的将会打印
 
log4j.rootCategory=DEBUG, stdout , R  
  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n  
   
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.R.File=D:\\myLog.log  
log4j.appender.R.layout=org.apache.log4j.PatternLayout  
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n  
  
log4j.logger.com.neusoft=DEBUG  
log4j.logger.com.opensymphony.oscache=ERROR  
log4j.logger.net.sf.navigator=ERROR  
log4j.logger.org.apache.commons=ERROR  
log4j.logger.org.apache.struts=WARN  
log4j.logger.org.displaytag=ERROR  
log4j.logger.org.springframework=DEBUG  
log4j.logger.com.ibatis.db=WARN  
log4j.logger.org.apache.velocity=FATAL  
  
log4j.logger.com.canoo.webtest=WARN  
 
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN  
log4j.logger.org.hibernate=DEBUG  
log4j.logger.org.logicalcobwebs=WARN 

    以下是debug()的源码:

   

   public void debug(Object message) {
    if(repository.isDisabled(Level.DEBUG_INT))
      return;
    if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
      forcedLog(FQCN, Level.DEBUG, message, null);
    }
  }

表面看logger.isDebugEnabledlogger.debug(message)都调用了

repository.isDisabled(Level.DEBUG_INT),多判断isDebugEnabled反而会麻烦,但实际上如果直接调debug(message)就算设置的不是debug模式,里面的message也会构建,如果这message构建花的时间长或者这message在内存中创建了这对象,即使很小也是创建了,多这个对象又靠java垃圾回收机制回收,这本来就是很浪费的事,既然没用的对象,干脆不创建不是更好吗?所以建议在调用logger.debug(message)前最好多判断一下isDebugEnabled,养成好习惯。

(2)对于这个log4j.appender.CONSOLE.layout的配置,刚开始理解不是很清晰,这些layout是干什么用的?

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

对于layout log4j提供了以下4

org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout
包含日志产生的时间、线程、类别等等信息)

 

在实际应用中这四种可能不能满足我们的需求:比如在你打日志的时候需要loggerDebugCreditCard)记录信用卡的信息,但是写入log文件万一被不良者利用,查看这些信用卡信息怎么办?所以我们可以扩展下这些layout

比如

Public class MyLayout extends PatternLayout{
@Override
Public String format(LoggingEvent event){
…这里你可以信用卡进行加密再记录日志日志
Supper.format(event);
}
}

这样我们在需要记录信用卡日志的时候就可以log4j.appender.CONSOLE.layout=com.biao.MyLayout

这样记录日志的时候就会调用你复写的MyLayout。format()来按照你的想法来记录日志了。


希望我对log4j的理解对大家有帮助,发现有错的我会改掉的,有需要分享的我会写进来的。

抱歉!评论已关闭.