作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。

热门文章推荐

  • (1)《人工智能时代,软件工程师们将会被取代?》
  • (2)《超全人工智能 AI工具导航网站合集》
  • (3)《如何写出高质量的文章:从战略到战术》
  • (4)《我的技术学习方法论》
  • (5)《什么? 你还没用过 Cursor? 智能 AI 代码生成工具 Cursor 安装和使用介绍》
  • (6)《我的性能方法论》
  • (7)《AI 时代的学习方式: 和文档对话》
  • (8)《人工智能终端来了,你还在用过时的 iterm?》
  • (9)《无需魔法打开即用的 AI 工具集锦》

一、背景

在日常开发中,通常为了方便调试、方便查问题,会打印很多 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 )来辅助我们查问题。

你还有哪些不错的日志瘦身技巧?
欢迎在文章末尾评论和我交流。


创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。

欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。
https://t.zsxq.com/Z3bAiea 申请时标注来自CSDN。

欢迎加入我们的 slack 工作区,在里面可以对ai 和我进行提问。
https://join.slack.com/t/ai-yx51081/shared_invite/zt-1t8cp1lk3-ZMAFutZcN3PCW~8WQDGjPg

同学,运维喊你来精简日志啦 - 日志瘦身方法论相关推荐

  1. 「运维有小邓」为什么网络日志如此重要?

    「运维有小邓」为什么网络日志如此重要? 如果你对网络安全有所关注,那你一定听说过日志审计.在本文中,我们将讨论日志审计的重要性,以及它如何帮助改善你的网络安全状况.日志审计的定义非常简单.当系统内部发 ...

  2. 运维基础(二):Tomcat日志文件详解

    一.tomcat日志文件路径 tomcat/logs 二.tomcat日志配置文件 tomcat对应日志的配置文件:tomcat目录下的/conf/logging.properties tomcat的 ...

  3. python 打包 太大 精简_pyinstaller打包结果瘦身

    如果想把python程序发布成.exe的话,一般我们都会使用pyinstaller, 怎么打包这里我就不说了.有时我们打包的结果会非常大,我最大的一次居然有900M......下面我就总结一下可以对发 ...

  4. 日志对于运维的重要性

    一个成功的软件,全力开发的时间可能占其整个生命周期的1/4还不到,软件发布后要运维(Operation),运维的视角和开发的视角是很不一样的,但是有一点,运维的数据能反哺开发,同时,开发的时候也得考虑 ...

  5. 登录日志怎么实现_运维必看:日志标准化必须面对的 4 类问题

    朱林 高效运维 作者介绍:朱林,日志及数据分析专家,<Elasticsearch技术解析与实战>作者,对安全技术.数据分析有较深的研究,拥有15年数据分析及安全产品开发经验. 引言 在很多 ...

  6. 智能运维时代,如何做好日志全生命周期管理

    云智慧 AIOps 社区是由云智慧发起,针对运维业务场景,提供算法.算力.数据集整体的服务体系及智能运维业务场景的解决方案交流社区.该社区致力于传播 AIOps 技术,旨在与各行业客户.用户.研究者和 ...

  7. spring Boot 2 运维篇(spring boot程序的打包与部署,多环境开发配置文件的配置,spring boot集成日志框架)

    目录 1.SpringBoot程序的打包与运行 程序打包 程序运行 SpringBoot程序打包失败处理 命令行启动常见问题及解决方案 SpringBoot项目快速启动(Linux版) 2.配置高级 ...

  8. 感恩有你——云端运维企业客户突破500家

    "叮叮当,叮叮当,铃儿响叮当......"圣诞.元旦的节日气氛愈发浓郁,仿佛和越来越冷的天气一样,无时无刻都在提醒着我们新年即将到来.在这对过往难舍.对未来期盼的特殊时刻,云端团队 ...

  9. 又拍云邵海杨 - 25年Linux老兵,聊聊运维的“术”与“道”

    您好邵总,请您先做个自我介绍吧,聊聊您的履历和现状,让大家更好的认识您,了解您的背景也有助于读者理解后面的采访内容 我是来自又拍云的邵海杨,从1998年开始使用Linux至今快25年了,资深(老鸟)L ...

最新文章

  1. 程序员带你解析Python3
  2. 【网络流】解题报告: luogu P2045 方格取数加强版(k取方格数)(最大费用最大流)
  3. Win7下共享文件(以及凭据管理简单介绍)
  4. 猴子选王c语言链表程序代码,C语言程序设计-猴子选大王[链表应用]
  5. swift 原生给h5发消息_Swift-WKWebView与JavaScript的细节,H5页面跳转原生界面
  6. 51CTO博客 NO.1 大奖赛之后感想---奖品
  7. MoCoV3:何恺明团队新作!解决Transformer自监督训练不稳定问题!
  8. linux uefi无法启动文件,解决UEFI安装无法启动的问题
  9. 《Scikit-Learn与TensorFlow机器学习实用指南》第5章 支持向量机
  10. new一个对象的过程
  11. 背景差分检测物体,背景白点去除
  12. 计算机应用水平考试dream,2016年职称计算机Dreamwaver使用教程:操作环境
  13. java编程剪刀石头布_Java实现的剪刀石头布游戏示例
  14. 横向对比EXT4,带你感受真实的Linux文件系统F2FS
  15. 如何用计算机名安装打印机,如何添加打印机,教您添加共享打印机的方法
  16. 【EXLIBRIS】#小词旮旯# 001 Lock
  17. WebView 加载微信公众号文章加载失败或图片不显示
  18. 股票行情查询易语言代码
  19. Dev C++开发lib和dll
  20. 微信电商小程序流量入口介绍

热门文章

  1. dede flag php,dede新增自定义flag(自定义属性)的方法
  2. 网络流量监控为某图书馆系统排忧解难(一)
  3. 变废为宝,键盘scroll lock键妙用
  4. 移动端踩坑记---------ios下输入法遮挡input
  5. java集合Cloneable
  6. :target 伪类使用技巧
  7. ETL--oracle --CDC技术
  8. 看《士兵突击》有感~~
  9. 用七步解决所有质量问题
  10. 【情态动词练习题】may not 和 can‘t / might 的区别