Log4j探秘

日志是一个系统不可或缺的一部分,这两天遇到了一个这方面的问题,笔者对这方面的知识还没有一个全方面的了解,正好借此机会好好研究一下

从一个简单例子开始

log4j.properties

log4j.rootCategory=WARN, anyname
log4j.appender.anyname=org.apache.log4j.ConsoleAppender
log4j.appender.anyname.layout=org.apache.log4j.PatternLayout

测试代码

public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(IDVerifyWebService.class);
        logger.debug("debug 233");
        logger.info("info 123");
        logger.warn("warn 233");
        logger.error("error 233");
    }

运行结果如下

warn 233
error 233

下面解释配置的含义
log4j.rootCategory=WARN, anyname
更通用的格式是
log4j.rootCategory=Level,appenderName,appenderName,appenderName
Level是日志记录的优先级,按优先级从低到高分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别,如上面的例子,指定为WARN,那WARN级别以下的日志不会被输出

appenderName是标识了一个输出源,等同于一个子节点,同一条日志可以有多个appenderName来输出到不同位置,这个名字可以随意取

log4j.appender.anyname=org.apache.log4j.ConsoleAppender
log4j.appender.anyname.layout=org.apache.log4j.PatternLayout
这两条就是对输出log4j.rootCategory中配置的输出源anyname的必要配置,指明了它的输出类型,布局

神说:要有时间和标志

上面的例子确实很简单,好像简单过头了,我们无从得知这是什么时候发生的,也不知道这个日志的严重程度,而这就是ConversionPattern要做的事情

log4j.rootCategory=INFO, anyname
log4j.appender.anyname=org.apache.log4j.ConsoleAppender
log4j.appender.anyname.layout=org.apache.log4j.PatternLayout
log4j.appender.anyname.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

下图可以很容易看出日志的级别,方便寻找真正严重的问题


image.png

定义appender,只能在rootCategory吗?

当然不是,log4j.logger.appenderName 也能定义.下面这个例子也定义了一个新的appender

log4j.logger.anyname=WARN, anyname
log4j.appender.anyname=org.apache.log4j.ConsoleAppender
log4j.appender.anyname.layout=org.apache.log4j.PatternLayout

对于一些框架自带的日志,我不想要,如何去关闭?

很简单,覆盖它的默认设置,不给它输出位置,例如spring
log4j.logger.org.springframework=WARN
这里应该是有个约定俗称的地方: 框架的默认日志appendName都是它的包名的一部分,比如

  • spring log4j.logger.org.springframework
  • hibernate log4j.logger.org.hibernate

  1. https://blog.csdn.net/caolaosanahnu/article/details/7553999

你可能感兴趣的:(Log4j探秘)