补几个打日志导致的线上事故
日志是什么? 虽然他不是业务逻辑,但日志是代码,是计算,是需要耗费算力和内存、硬盘的
很多刚毕业的应届生不懂如何打日志,然后学会了日志的好处以后,开始变着花样的打日志。 打着打着把系统给打挂了。
鄙人不才,和日志相关的bug20次有了。
打日志,把mysql打挂了??
在浪潮的时候,有一次同事打日志。
▼text复制代码nohup java -jar XXX > log.log 2&>1
然后,他就把磁盘给打满了。
打满了以后,mysql由于申请不到硬盘,直接拒绝服务。 拒绝服务以后,连接池无法释放,报错too many connnections。
为啥不分页:shell脚本的分页不好写 为啥没监控:公司穷
删除日志表,搞出来连接数泄露?
在浪潮的时候,日志存在mysql里面。
磁盘打满了以后,领导急于解决这个问题,于是查询了一下,有个mysql的日志表68G。
领导直接血怒:多少年了,你们都不管?也不清理下??看我一个rm -rf。
然后:用shell脚本维护的业务逻辑,最后因为删除了日志表,导致脚本执行失败。 脚本执行失败,导致了连接数泄露。
磁盘频繁读写健康度下降,搞挂了hadoop?
这个事情就更离谱了:由于磁盘不够、反复读写日志,导致硬盘健康度下降。 责任不全是日志的问题,谁读写磁盘多谁担责。
我们项目组很穷,没有上raid5。导致数据损坏。 然后,hadoop1.8的nameNode挂了。
整个集群挂了。
打个日志,打到软连接上?
项目推动ELK,需要挂载EndPoint。
我不负责解释各种技术名词、专业术语。因为讲不明白。自行百度
然后,同事为了省事、不想修改挂载卷名称,直接新建了一个挂载卷,然后软连接到日志文件夹。 当然:挂载卷里面啥也没有。查询失败。
于是,我去推动,要求他们修改启动的dockfile和logback.xml,不要拿软连接糊弄人。 推不动。
同事是这样的:
- 我想用ELK辅助生产
- 但是想用ELK就得改动代码适配ELK,我不想改动代码
打印巨大模型
一个模型50M,直接一个toJson打印到log里面去了。
我在百度工作的时候,从堡垒机上下载了一个用户、一个请求的所有日志。 你猜猜有多大?10M。
原因也很简短:·模型参数全量打印到日志。方便日后调优。 整个微服务,一个小时干出来好几T的日志。但是K8s抗住了。 toJson需要内存,集群抗住了。
我扛不住了。
你模型几百几千个参数,就统统打印到日志里面,谁扛得住?
MDC?
MDC是个好东西,但是他有线程安全问题。
为啥? 因为多线程的时候,MDC数据丢失。 比如磁盘分片下载,创建多个线程解决问题,MDC数据丢了。
然后:当线程结束的时候,MDC的内容没有同步到主线程。
好好的打印日志,愣是搞出来线程安全问题。
打个日志,打出NPE?
有人说:
▼text复制代码log.info("{}", list.size());
这个非常好,可以不计算。
并不是。list.size()会正常执行,然后抛出NPE。
我一个周前刚给美团同事修了一个NPE,他打了一行日志有NPE,导致了我调用直接失败。
拿着单例工厂打日志
python有个包叫做Logger。他的作用是打日志。
但是问题是:
- 需要先通过Logger创建一个日志工厂,设置format
- 然后通过工厂创建logger
- 通过logger打日志
然后华为那群菜鸟:听不懂听不懂,反正CSDN上可以用Logging,我就用Logging。
于是:出现了一个奇观:把继承了不打日志的日志工厂创建出来的logger被Logging给覆盖了。
我不想解释这个事情,因为很啰嗦。
于是,华为那群菜鸟开了血怒,表示日志太多,提了一个工单让我修。 我让他实现logger 他们表示听不懂,让我自己想办法。
排除log4j2
互联网有几大毒瘤,谁用谁死。
- fastjson
- hutool
- log4J2
为啥,因为你用了以后排除不干净。
我在百度的时候,有3份非常重要的工作摆在我面前:
- 通过maven排除掉fastjson
- 给fastjson升级
- 排除掉log4J2
每次扫描的时候,都能扫出这个log4J2,百分之百。 因为A调用了B,B调用了C,C调用了Log4J2。
百度也没有像阿里一样创建空包,所以一个一个手工排除。
你怎么不打日志???
简单来说,在使用K8s的时候,引入了一个调度器,这个调度器叫做火山。
而这个调度器他不打日志!!!
原因?我怎么知道原因,我只是一个菜鸟,我懂啥火山调度器,我配置都配置不明白。
而这个火山调度器,他有个非常核心的问题:他负责让pod在不满足条件的情况下失败
你说说,你说说。你让调度失败了,但是你又不通过日志告知为啥调度失败,你是玩谁呢?
加日志?怎么加?如何加?在不改变代码的情况下如何保证调度成功?
冷备日志??
有的人,贯彻了既要还要的规范:
- 他希望查看3年内的所有日志
- 他又抱怨日志太多
于是,搞出来了一个神奇的词汇:冷备日志。
把日志压缩,节省磁盘空间。想的不错,但是算力和调度出了问题
压缩需要大量的算力和内存,然后调度的时候需要大量的内存。
造就了一个奇观:晚上夜深人静没人用我们的系统,我们的系统服务器定时抽风。内存疯狂告警。
