文章目录

记一次日记不输出的排查过程

刚接手一个springMVC的老项目,系统起来后,控制台不输出日记,日记文件中也没日记

1.首先确认了下,系统启动后是会生成指定的日记文件的,且控制台能输出system.out.print的日记,不能输出Logger输出的日记。

2.百度了解了下,可能是log4j的依赖冲突,导致并没有这个包加载进来,于是使用mvn dependency:tree -Dverbose>temp/tree.txt(点击见详解)指令查看依赖关系,发现有很多的org.slf4j:slf4j-api conflict

3.使用exclusions在所有冲突的包下去除掉slf4j依赖

1
2
3
4
5
6
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>

4.重启项目后发现,日记文件里有日记进去了,但是控制台还是一直没有输出,继续排查
log4j.properties配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
log4j.rootLogger = stdout,D

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%d] [%t] %-5p [%c] [x-transaction-id: %X{x-transaction-id}] - %m%n

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ./log/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}] [%c]-[%p] [x-transaction-id: %X{x-transaction-id}] - %m%n
log4j.appender.D.ImmediateFlush = true
log4j.appender.D.DatePattern = '.'yyyy-MM-dd

log4j.rootLogger认识
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
level : 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。
appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
例如:log4j.rootLogger=info,A1,B2,C3 配置了3个输出地方,这个名字可以任意(如上面的db),但必须与我们在后面进行的设置名字对应;

控制台不输出的原因是我把level给去掉了,stdout为控制台输出放到了最前面导致的,修改log4j.rootLogger配置如下:
log4j.rootLogger = INFO,stdout,D

至此,问题解决!

文章目录