一、日志级别不是摆设
刚入行那会儿觉得日志随便打打就行,后来被线上问题教做人了。DEBUG/INFO/WARN/ERROR这几个级别真得琢磨清楚:
DEBUG:比如循环里每条数据的状态跟踪,记得一定要用isDebugEnabled()包起来,否则字符串拼接能给你性能干崩
INFO:关键业务流程节点必须留痕,比如"用户158支付订单完成,金额299"
WARN:别人调我接口参数传错这种,不能算错误但要监控
ERROR:捕获异常时务必带上上下文参数,别光打e.getMessage()
(掏心窝子)见过最坑的是把第三方接口超时打成INFO的,监控告警完全没触发,半夜被叫起来扩容数据库!(捂脸)
二、日志输出得讲武德
格式规范:时间戳+级别+线程名+类名+业务ID这五大金刚不能少。推荐用JSON格式,ELK收集起来那叫一个丝滑
异步写入:同步写日志阻塞业务线程的惨案年年有。Logback的AsyncAppender配置队列大小2048起步,discardingThreshold设为80防止内存溢出
日志分离:
(突然激动)前两天发现个骚操作:有人把MyBatis的SQL日志打到单独文件,结果磁盘三天写满!切记要设置maxHistory和totalSizeCap啊兄弟们!
三、追踪链路不能丢
现在都是分布式系统,一个请求经过十几个服务:
在过滤器里生成traceId塞到MDC
RPC调用时通过header传递
线程池场景要用TTL做线程间传递
最终在日志配置里统一添加%X{traceId}
(敲黑板)特别注意:MDC用完一定要clear!上次有个兄弟忘记清理导致traceId串到其他请求,查问题查得差点怀疑人生!
四、日志收集有讲究
ELK三板剑搭建起来之后:
Filebeat配置多行合并(异常堆栈必须合并处理)
Logstash管道里用grok解析复杂格式
ES索引按周创建,别傻乎乎按月创建(查询速度差三倍)
Kibana做统计看板:错误数TOP10接口、慢查询趋势图必备
(压低声音)说个真实案例:某电商大促时日志量暴涨,Kafka集群被日志灌崩,连带订单服务雪崩。所以一定要给日志Topic单独配置集群!
五、实战避坑指南
日志位置:别写根目录!放专属挂载盘,iops单独监控
参数占位:("订单{}金额异常", orderId) 比字符串拼接性能提升40%
敏感信息:身份证/手机号必须脱敏,正则替换一步到位
日志清理:crontab里写find -mtime +7 | xargs rm -f 这种骚操作会误删!用logrotate配压缩策略
(突然严肃)最后说个血的教训:某金融公司日志打了用户银行卡密码!虽然很快就删了,但审计过来直接罚了200个!所以上线前必须用安全扫描工具过一遍!
总结
好的日志系统就像行车记录仪,平时觉得占空间,出事时就是救命稻草。建议大家每个月做一次日志复盘,看看哪些该打的没打,哪些不该打的瞎打。记住:日志打得好,加班加到老(划掉)故障追得少!(狗头保命)
(举手)下次想听什么实战技巧?评论区告诉我,安排!