1、背景
Datahub-monitor不打印服务日志。在生产环境中,日志是一个非常重要的监控手段,如果没有日志输出,无疑是非常危险的。
2、出题初步排查
1) 检查log4j2的配置,没有发现任何问题
2)本地代码调试,可以打印日志,控制台可以打印日志,没毛病
3)如果一个pod能正常启动,但是不能打印日志,有没有可能是所有线程进入一种假锁状态。采用jstack统计所有线程状态,没有死锁。
4)log4j2的异步日志会不会有问题呢?修改异步日志为同步日志,不能解决问题。
3、诡异现象
在进行了各种检查以后,并没有发现任何异常,也看不到任何日志信息。此时我尝试将该服务的调度到另一台机器上,服务能够正常打印日志。同样一个镜像,在一台节点上可以打印日志,在另外一台节点上可以打印日志。我试着将pod调度到更多的节点上,诡异的事情产生了,某些节点可以正常打印日志,某些节点则不能正常打印日志。那这是否与k8s节点的环境有关?后续做了许多无用的工作,从cpu负载、jdk版本、线程死锁等多方面排查均没有发现异常。
4、发现端倪
整个服务都不打印日志,唯一一点信息Java进程重启时重定向到out文件里面的控制台输出。一开始就有看过这么几行日志,没有发现什么特别的地方。在启动多个服务后,发现了一些端倪。似乎打印日志服务与不打印日志的服务日志似乎有点不一样。二者bingding的日志jar包顺序有一点点不同。
打印日志 [root@hfa-alpha0015 k8s-config-test]# kubectl logs datahub-monitor-55b77f7768-bchn6 -n odeon SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/odeon/loghub/datahub_monitor_server/datahub_monitor_server-deploy/lib/log4j-slf4j-impl-2.7.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/odeon/loghub/datahub_monitor_server/datahub_monitor_server-deploy/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] 不打印日志 [root@k8s001 ~]# kubectl logs datahub-monitor-8ccf4cf88-7mdkh -n odeon SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/odeon/loghub/datahub_monitor_server/datahub_monitor_server-deploy/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/odeon/loghub/datahub_monitor_server/datahub_monitor_server-deploy/lib/log4j-slf4j-impl-2.7.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardServletEnvironment). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
5、问题定位
不打印日志的服务是先绑定的slf4j-log4j12-1.7.25.jar它兼容的是log4j1的工厂类,查看jar包源码可以发现,二者都有StaticLoggerBinder类,所以造成了jiar冲突,产生了同样一个镜像在不同机器上有不同表现得诡异现象。
6、日志问题修复
通过DockerFile文件在原来得镜像上删除冲突jar,重新生成新的镜像。
7、其他问题
在日志问题排查得过程中,log.info.level=debug,短短几个小时就产生了10G左右得日志文件,这给磁盘造成了巨大压力,所以备份当前得日志文件以供后续使用,同时将日志等级改为info。
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/268400.html