Redian新闻
>
线上日志瘦身方法论

线上日志瘦身方法论

公众号新闻

一、背景

在日常开发中,通常为了方便调试、方便查问题,会打印很多 INFO 级别的日志。

随着访问量越来越大,一不小心,某个日志文件一天的 size 就大于了某个阈值(如 5G),于是,收到了优化日志大小的告警,一定时间内不优化反馈给你主管,囧...

日志过大容易导致一些运维操作消耗机器性能,如日志文件检索、数据采集、磁盘清理等。

那么,日志瘦身哪些常见的思路呢?本文结合某个具体案例谈谈我的看法。

二、日志瘦身方法论

2.1 只打印必要的日志

有时候为了方便测试,临时打印很多 INFO 级别日志。对于这种日志,等项目上线前,可以将非必要的日志删除或者调整为 DEBUG 级别。

但有些场景下有些日志可打印为 DEBUG 也可打印为 INFO,打印成 INFO 级别占空间,打印成 DEBUG 级别线上查问题的时候又需要用到,肿么办?

我们可以对日志工具类进行改造,支持上下文传递某个开关时(正常调用没有这个开关,通过公司的 Tracer 或者 RPC上下文传递),可以临时将 DEBUG日志提升为 INFO级别。伪代码如下:

if(log.isDebugEnable()){
   log.debug(xxx);
}else if(TracerUtils.openDebug2Info()){
 log.info("【debug2info】"+xxx);
}

这样,可以将一些纠结是否要打印成 INFO 日志的 log 打印成 DEBUG 级别,查问题时自动提升为INFO 日志。为了避免误会,区分 DEBUG 提升 INFO 的日志和普通 INFO 日志,加上 类似【debug2info】 日志前缀。

当然,你也可以搞一些其他骚操作,这里只是举个例子,请自行举一反三。

2.2 合并打印

有些可以合并的日志,可以考虑合并。如在同一个方法前后都打印了 INFO 日志:

INFO   [64 位traceId]   XXXService 执行前  size =10
INFO   [64 位traceId]   XXXService 执行后  size =4

可以合并成一条:

INFO   [64 位traceId]   XXXService 执行前  size =10 执行后 size =4

2.3 简化&缩写&压缩

某个日志非常有必要,但是打印的对象有些大,如果可以满足问题排查需求的情况下,我们可以:

  1. 选择只打印其 ID
  2. 创建一个只保留关键字段的日志专用对象,转化为日志专用对象,再打印。
  3. 可以用缩写,如 write 简化为 w, read 简化为 r, execute 简化为e 等;比如 pipeline 中有 20个核心 bean ,打印日志时可以使用不同的编号替代 bean 全称,如 S1,S2 ,虽然没那么直观,但既可以查问题,又降低了日志量。

三、优化案例

3.1 场景描述

一个业务场景涉及很多 bean, 为了复用一些通用逻辑,这些 bean 都继承自某个抽象类。在抽象类中,定义了执行 bean 前后的一些通用逻辑,如执行前后打印当前 pipeline 中 item 的数量。最后一个 bean 执行完结果转换后需要打印出结果。

3.2 优化分析

3.2.1 只打印必要日志

  1. 由于当前 bean 执行前 相当于前一个 bean 执行后,因此只打印执行后的日志就可以,执行前的INFO 日志可以删除或者改为 DEBUG (只打印必要日志)
  2. 通常问题只出现在执行前后 size 不一致的情况下,因此执行后打印日志前可以加个判断,如果执行前后 size 相同则不打印。(只打印必要日志) 伪代码如下:
if(sizeBefore != sizeAfter){
log.info("service:{}, 前size:{},后size:{}", getName(),sizeBefore, sizeAfter)
}

这招效果很明显,因为大多数 bean 的执行前后 size 是相同的,就不会打印这条日志。而假设之前有 20 个,这条日志就需要打印 20次,改进后可能只需要打印 2-3 次。

3.2.2 日志合并

(2)为了方便查问题还需要打印执行前的 size ,那么将执行前的 size 记录在内存中,打印执行后日志时多打印出执行前的 size。(合并打印) 伪代码如下:

log.info("service:{}, 执行前size:{}", getName(),sizeBefore)

log.info("service:{}, 执行后size:{}", getName(),sizeBefore, sizeAfter)

合并后

log.info("service:{}, 前size:{},后size:{}", getName(),sizeBefore, sizeAfter)

3.2.3 日志精简

对于最终结果,将结果对象(如 XXDTO)转化为只包括关键信息,如 id, title 的日志对象(XXSimpleLogDTO),转化为日志对象后再打印。

log.info("resultId:{}",result.getId());

或者

log.info("result:{}",toSimpleLog(result));

3.3 效果评估

该日志一天产生 5 G 左右,这里百分之80% 左右都是打印执行前后的 size,10%左右是打印最终结果, 还有一些其他的日志。经过上述方法优化后,每天日志量不足 1G。

在满足排查问题的需要,又实现日志瘦身之间进行了取舍。

四、总结

日志瘦身需要进行权衡,保留排查问题的必要日志情况下尽可能精简。

可以采用删除不必要日志,合并日志,日志简化等方式进行优化。

我们还可以进行一些骚操作,支持线上 DEBUG 临时提升 INFO (当然也可以使用 arthas )来辅助我们查问题。

链接:https://juejin.cn/post/7117046503616544804

(版权归原作者所有,侵删)


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
这年头靠稿费能养活自己吗?2022爆剧启示录③ | 《卿卿日常》背后的古偶方法论我以前在阿里巴巴的流量方法论(后续篇)前哨大会2022·预测未来方法论24节气日历、365个珍贵养身方……大爱这份中式美学!白话版本,基金经理的投资方法论是的。对个体来说,还是法治清爽。但中国的“大局观”虽因压制个体而遭到反抗与蔑视,但却一直在整体层面起作用。悖论是以传统文化撬动长线运营,这就是三消游戏的成功方法论?内容成王,产业造路,优酷少儿这份撬动“千亿级”内容消费市场的方法论值得收藏我们笃信,共创是所有喜剧的基础方法论听诗做小红书必备的14个运营模型方法论内卷时代,这4家企业凭借这个方法论,逆势拿下第一!新春会变开学礼,这款二次元常青树的同人方法论究竟有何奥妙?一文梳理Code Review方法论与实践总结陈大康 | 文学研究融入数学思想方法论《狂飙》背后的营销方法论天塌了:不让缠足 剪辫子 不做核酸安慕希×敦煌博物馆、天坛 | 重构CNY营销方法论,引领国货新潮流Web3.0体验营销方法论白皮书——营销数字化:从新一代营销理论创新开始|甲子光年智库资本周期方法论2023年工作的方法论高端战役验证vivo方法论:埋头种因,穿越周期品牌营销操盘手必备理论及渠道运营方法论|9、10月会员活动回顾吴晓波年终演讲:勇敢者的7大方法论,以及2023年的8大预见(附全文)如果结婚有方法论,生活会更容易吗? | 谷雨有哪些听起来“操蛋”,却靠谱好坚持的健身方法?前哨大会2023:预测未来方法论如果结婚有方法论,生活会更容易吗?猫咪的吃华为:数据治理方法论我们笃信,共创是所有喜剧的基础方法论!张同道创作课(上)丨找到纪录片创作背后的学术方法论【独家发布】企业合规官的4大闭环方法论和10大热门领域前哨大会2022·产业分析方法论
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。