目前,java下应用最广泛的日志系统主要就是两个系列: log4j和slf4j+logback 。

其中,slf4j只包含日志的接口,logback只包括日志的具体实现,两者加起来才是一个完整的日志系统。Log4j则同时包含了日志接口和实现。

这两套日志系统之间有可以相互兼容的组件,分别是slf4j-log4j12和 log4j-over-slf4j,引入之后就可以用log4j打出slf4j接口的日志,或者用logback打出log4j接口的日志。

背景知识介绍到这里,再简单说一下标题里提到的问题。问题的现象就是我们在war包里配置了log4j的日志级别为info, 但在catalina里却一直在打大量的debug日志。初看现象肯定很诡异,前期各种研究tomcat配置也没什么头绪。直到磁盘压力太大,去看jstack发现大量进程是等待在Logback代码中,才发现之前关注错了重点。再去具体了解了java下的日志系统后,问题也就很明了了。

先把几个事实摆出来:
1. 打出的debug日志都是用slf4j写的,根据堆栈得知logback具体执行了日志打印
2. logback在无配置文件时默认debug级别
3. 我们的war包中同时包含logback,log4j和slf4j-log4j12
4. Slf4j无法主动选择具体的日志实现
想必看到这里,大家也明白了问题所在。根据我们引入的包,log4j和logback都可以实现打印slf4j日志,而具体谁来打,不是一个用正常办法可以控制的事情,在这个具体案例下,logback就成了具体的日志打印者。而因为我们其实是想用lo4j打日志,所以没有配logback配置,所以logback就按默认的debug级别打了大量日志。

解决办法也很简单,就是把logback的包全去掉。看似有些暴力,但确实是最合理的一个解决办法。

查看依赖,发现spring-boot-starter-web包含了logback依赖包,将其移除即可。

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>logback-core</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.29</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.26</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

最后提供一个排查日志问题的通用套路,免得找不到方向乱看。
1. 找几行不符合自己日志配置的具体日志,翻阅对应代码,看看是哪个日志接口打的
2. 查jar包,看看这套日志框架有哪些具体实现
3. 把多的jar包去掉

参考博文:http://lichuanyang.top/posts/4433/

最新文章

  1. css浮动与绝对定位小记
  2. git使用和理解之一(不含分支)
  3. Bootstrap&lt;基础三&gt; 排版
  4. android 最详细的动画大全,包括如何在代码和在XML中使用
  5. java报表工具FineReport的SQL编辑框的语法简介
  6. 通过SharePoint Designer对SharePoint 2010的Master Page进行自定制
  7. Android doc打开太慢
  8. 浅谈实现placeholder效果的几种方案
  9. VirtualBox中虚拟Ubuntu添加新的虚拟硬盘
  10. 函数:内嵌函数和闭包 - 零基础入门学习Python020
  11. Mysql优化之创建高性能索引(二)
  12. js打开新窗口的两种方式
  13. 动态rem与1px边框问题的理解
  14. 关于KPM算法
  15. .NET Core 3.0-preview3 发布
  16. 【C语言编程练习】5.9 爱因斯坦的阶梯问题
  17. web前端安全
  18. 立一个Flag吧
  19. 进行分支切换时,出现error的修复方法
  20. Python基础:三、Python的解释器

热门文章

  1. (转)Vmware vSphere 5.0系列教程 vSphere网络原理及vSwitch简介 及一个host两个网卡说明
  2. mongdb 备份还原导入导出
  3. CSS:CSS 轮廓(outline)
  4. Centos7 安装 telnet 服务
  5. JAVA学习之数组
  6. POJ3630-Phone List-Trie字典树模板题
  7. 快速高效学习Java编程在线资源Top 20(转载)
  8. Redis数据结构之压缩列表-ziplist
  9. 关于redis闪退的案例
  10. Eureka配置详解(转)