slf4j-log4j12加log4j自定义配置包路径日志输出

项目日志在定位问题原因上起着重要的作用,有用的日志输出能提高解决问题的效率,所以日志配置还是很关键的,对一个项目来说有用的日志包路径一般都是项目自己包路径下的日志,集成的框架和依赖包中的包路径下的日志其次,代码在哪里需要输出日志和开发者的水平有关,排除这个因素,假设项目代码输出日志都很合理,那就剩下日志配置了,下面记录一下配置log4j.properties文件,实现自定义包路径日志输出。

配置遵循以下几个原则:

1、项目本身包路径就使用info级别日志,

2、项目依赖第三方包中的日志对接好之后一般对解决公司业务问题不会起到作用,这些日志级别可以设置在ERROR

3、可能还会要看sql,这对前期项目问题较多的时候很有用,sql输出有种两种,一种mybatis配置文件配置上logImpl,可以有格式的输出sql,参数,和结果集,但是这种用在生产上就不太好了,有的结果集多了导致日志很大,所以这种开发的时候用用可以,测试以后的阶段禁止。第二种就是log4j里配置mapper路径下的级别在DEBUG,可以输出sql和参数,这里是没有结果集的。

这是目前认为比较合理好的配置,下面说我遇到的问题:

原项目配置


    org.slf4j
    slf4j-log4j12
    ${slf4j.version}

原项目只引用了上面这一个slf4j-log4j12的依赖包,项目也是正常的在跑,日志也是看似正常的输出,日志一直是info级别,且只是简单的配置了一下输出到控制台,如下:

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

上面这个log4j.properties配置只是把项目中所有info级别的可见日志输出到控制台,因为用的tomcat也就是会输出到catalina.out这个文件里,并且log4j配置里没有控制文件切割,如果服务器上也没控制catalina.out文件切割那么这个文件就会越来越大,等哪天真的有问题要查日志了那文件估计大到打不开,不能给自己找那麻烦。

额外多说几句

这里切割文件直接在服务器上做了,脚本处理逻辑:加了一个定时任务0点钟catalina.out文件内全部内容复制到另一个文件,当前文件清空,亲测可用。这里不能mv成新文件名再从新创建一个catalin.out文件,亲测不可用。

改动的内容

最近在升级项目架构,支持多数据源切换,部署的时候发现log4j不能正常初始化,配置内容如下:

让日志根级别是warn,项目自己包路径下是info,打印sql的要配置成debug,其它的第三方包都是error,看着清净

log4j.rootLogger=WARN,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c]-[%p] %m%n
#这里配置是自定义的包路径日志级别,只要这些就行
log4j.logger.xxx.xxx=INFO,A2
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c]-[%p] %m%n

#...这里配置的三项和上面一样就不写了
log4j.logger.xxx.xxx.service=INFO,A3
...
log4j.logger.xxx.xxx.mapper=DEBUG,A4
...
log4j.logger.org.apache.dubbo=ERROR,A5
...

出现异常一

1、log4j WARN No appenders could be found for logger, Please initialize the log4j system properly
2、Class path contains multiple SLF4J bindings,这里提示是类是StaticLoggerBinder.class

原因是有两个同名类,一个在activemq-all包里,一个在slf4j-log4j12包里,第一个感觉这第一个错是因为第二个错导致,所以解决先第二个,在mq依赖包中排除slf4j-log4j12的依赖就行了,但是我从依赖树关系查看(maven项目pom.xml文件dependency analyzer可以看到),项目mq引用的依赖包是activemq-all这个包里只有一个slf4j-api的依赖包,没有看到slf4j-log4j12,这个包比较坑,它把slf4j-log4j12包中东西应该打进去了,看图:

slf4j-log4j12加log4j自定义配置包路径日志输出_第1张图片

不知道的一定不会想到为什么mq没有依赖slf4j-log4j12还一直提示在mq包中找到了StaticLoggerBinder这个类,所以以后引用什么依赖就专门找那个包,像这种带all的包指不定加了什么东西,所以果断更换mq依赖:


	org.apache.activemq
	activemq-client
	${activemq.version}

出现异常二

上面的问题解决之后,发现很多日志都打印了两遍,原因在上面log4j.properties配置文件,只有log4j.rootLogger的时候日志会打印一遍,后面又单独配置了包路径和控制台输出又打印一遍,所以log4j.rootLogger配置了控制台输出就不需要配置其它包路径输出了,除非指定出错到文件,所以上面的配置最终修改是:

log4j.rootLogger=WARN,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c]-[%p] %m%n
#这里配置是自定义的包路径日志级别,只要这些就行
log4j.logger.xxx.xxx=INFO
log4j.logger.xxx.xxx.service=INFO
log4j.logger.xxx.xxx.mapper=DEBUG
log4j.logger.org.apache.dubbo=ERROR

我这里没有配置输出到文件切割,因为做了catalina.out切割输出,看这一个文件就够了

补充

上面配置发现还存在一个导致日志输出两边的问题,就是自定义的两个包路径是父子包路径的时候,配置了父包之后,增加一条子包配置就会出现打印两边的问题,所以不能配置子包路径日志级别。

你可能感兴趣的:(那些年走过的路,java,log4j2,slf4j,log4j)