记一次由日志引起的停服事故

12月28号1上午10点,所在项目停服了半个小时。期间有在推一个红包活动。根据jstack查看堆栈日志,发现是Log4j纪录日志时发生线程阻塞,如下图所示。

线程堆栈信息

赶紧去扒拉代码,发现红包活动代码里有记录接口调用时长操作。但这是正常的日志记录,怎么会引起线程阻塞呢?

去网上一查,好多有类似的案例,看来是共性问题。

原来,log4j在写入日志文件时,为了保证写入顺序,会对资源加锁。在高并发的场景下,多个线程会竞争资源,从而导致线程阻塞。

那如何解决呢?

1.日志格式要规范,去除不必要的写日志操作,只在关键部位添加日志(输入、输出参数、异常捕获等)

2.生产环境日志级别要调到最高,一般是开启info级别

3.日志框架更换,可采用logback、log4j2来替换log4j1.x


另外,在排查过程中,发现 System.currentTimeMillis()这个操作也是比较消耗性能的。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 历史 log4j可以当之无愧地说是Java日志框架的元老,1999年发布首个版本,2012年发布最后一个版本,20...
    kelgon阅读 10,182评论 3 53
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,014评论 0 6
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,077评论 1 13
  • 在项目开发过程中,我们可以通过 debug 查找问题。而在线上环境我们查找问题只能通过打印日志的方式查找问题。因此...
    Java架构阅读 3,499评论 2 41
  • 稍微了解一点测厚仪的人都应该知道,测厚仪的类型繁多。而往往正规企业都愿选择在线测厚仪,因为一般的在线测厚仪检测系...
    如果没有过去14阅读 221评论 0 0