日志是一个系统不可或缺的一部分,这两天遇到了一个这方面的问题,笔者对这方面的知识还没有一个全方面的了解,正好借此机会好好研究一下
从一个简单例子开始
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
下图可以很容易看出日志的级别,方便寻找真正严重的问题
定义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
- https://blog.csdn.net/caolaosanahnu/article/details/7553999