日志瘦身骚操作:从 5G 优化到 1G,牛逼!!

SpringBoot使用mybatis-plus的自动代码生成器 一.SpringBoot使用mybatis-plus+自动代码生成 使用mybatis-plus可以自动帮我们生成通用的 controller,service,dao,mapper 二.加入依赖 <!-- MP 核心库 --> <dependency> <groupId>com.baomidou</groupId> <artif... 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:c1n.cn/mtr19


背景

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

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

日志瘦身方法论

86892e1d816de478dbe40b135d596695.png

只打印必要的日志

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

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

1884067a7a090ab8929f41ff3c8f2e83.png

我们可以对日志工具类进行改造,支持上下文传递某个开关时(正常调用没有这个开关,通过公司的 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】 日志前缀。

80d7168bcfbc43fddada72a2922b7c41.png

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

合并打印

有些可以合并的日志,可以考虑合并。

如在同一个方法前后都打印了 INFO 日志:

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

可以合并成一条:

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

简化&缩写&压缩

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

  • 选择只打印其 ID

  • 创建一个只保留关键字段的日志专用对象,转化为日志专用对象,再打印。

  • 可以用缩写,如 write 简化为 w, read 简化为 r,execute 简化为 e 等;比如 pipeline 中有 20 个核心 bean ,打印日志时可以使用不同的编号替代 bean 全称,如 S1,S2 ,虽然没那么直观,但既可以查问题,又降低了日志量。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

优化案例

场景描述

一个业务场景涉及很多 bean,为了复用一些通用逻辑,这些 bean 都继承自某个抽象类。

在抽象类中,定义了执行 bean 前后的一些通用逻辑,如执行前后打印当前 pipeline 中 item 的数量。最后一个 bean 执行完结果转换后需要打印出结果。

优化分析

①只打印必要日志

只打印必要日志:

  • 由于当前 bean 执行前 相当于前一个 bean 执行后,因此只打印执行后的日志就可以,执行前的 INFO 日志可以删除或者改为 DEBUG (只打印必要日志)

  • 通常问题只出现在执行前后 size 不一致的情况下,因此执行后打印日志前可以加个判断,如果执行前后 size 相同则不打印。

伪代码如下:

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

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

②日志合并

为了方便查问题还需要打印执行前的 size ,那么将执行前的 size 记录在内存中,打印执行后日志时多打印出执行前的 size。

伪代码如下:

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

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

合并后:

log.info("service:{}, 前size:{},后size:{}", getName(),sizeBefore, sizeAfter)
③日志精简

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

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

或者:

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

效果评估

该日志一天产生 5G 左右,这里百分之 80% 左右都是打印执行前后的 size,10% 左右是打印最终结果,还有一些其他的日志。

经过上述方法优化后,每天日志量不足 1G。

507ff9095e17198f803368db0b5d90f6.png

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

总结

日志瘦身需要进行权衡,保留排查问题的必要日志情况下尽可能精简。可以采用删除不必要日志,合并日志,日志简化等方式进行优化。

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

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



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

268ddee2106681ec4744c1ffeae0c92c.png

已在知识星球更新源码解析如下:

641705857a5d4924b8e330b2079b1004.jpeg

614a915e1f1a8bdd5ed917b054170ac9.jpeg

a6af47777759f9da190ca752810b49c2.jpeg

91a4f6a7b6a5c295dc19ab5b0fe565ea.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
llama.cpp部署大模型 llama.cpp如何部署大模型 阅读详情

相关推荐

保姆级教程:用CH34xSerCfg工具修改USB转串口芯片的VID/PID,避免驱动冲突

本文详细介绍了如何使用CH34xSerCfg工具修改USB转串口芯片的VID/PID,解决驱动冲突问题。通过实战案例和配置技巧,帮助开发者高效管理嵌入式设备,避免常见的USB设备识别问题,提升开发效率。

weixin_30924239的博客 225

日志瘦身骚操作:从 5G 优化到 1G,牛逼!

点关注公众号,回复“1024”获取2TB学习资源!背景在日常开发中,通常为了方便调试、方便查问题,会打印很多 INFO 级别的日志。随着访问量越来越大,一不小心,某个日志文件一天的 size 就大于了某个阈值(如 5G),于是,收到了优化日志大小的告警,一定时间内不优化反馈给你主管,囧...日志过大容易导致一些运维操作消耗机器性能,如日志文件检索、数据采集、磁盘清理等。那么,日志瘦身哪些常见的思路...

民工哥的博客 548

5.44GHz超高精度!STM32G474的HRTIM时钟配置避坑指南

本文深入解析STM32G474内置高分辨率定时器的时钟配置要点,帮助工程师避开常见陷阱。文章详细阐述了从系统时钟到5.44GHz等效时基的路径,重点分析了预分频器乘法器、周期计算溢出、影子寄存器同步等关键配置,并结合实测波形对比,确保HRTIM在电机控制、数字电源等精密应用中发挥极限性能。

book8的博客 524

好漂亮!全新 QQ Linux 3.0 正式上线

点关注公众号,回复“1024”获取2TB学习资源!腾讯正式宣布,QQ Linux 版 3.0 已在 QQ 官网上架,并表示此次大型的版本重构和更新,不仅实现了全新架构,同时还新增了许多符合 Linux 用户日常使用需求的特色功能。下载地址:https://im.qq.com/linuxqq/index.shtml公告写道,QQ Linux 3.0 版本基于 QQNT 技术架构驱动实现了全新架构,并...

民工哥的博客 474

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 182

Dify插件离线部署全攻略:从下载到安装的完整流程

本文详细介绍了Dify插件离线部署的完整流程,针对企业内网等无网络环境需求。核心步骤包括在联网环境下载插件包、在特定Python 3.12.9环境下使用专用工具进行离线重打包,以及最终在离线Dify环境中安装验证。重点解决了离线安装的核心难题,并提供了环境配置、批量处理和故障排查等实用技巧,帮助用户实现Dify插件的顺利离线部署。

seed的博客 659

Linux 发行版新秀震撼发布 !手里的系统瞬间不香了…

点关注公众号,回复“1024”获取2TB学习资源!出品 | OSC开源社区(ID:oschina2013)Vanilla OS 是近期才公开发布的 Linux 发行版,基于 Ubuntu 构建,免费且开源,默认桌面环境是 GNOME。虽然 Vanilla OS 的底层是 Ubuntu,但它并不是简单地基于 Ubuntu 进行 "remix",而且外观看起来也不像 Ubuntu。从官方介绍来看,Va...

民工哥的博客 428

基于树莓派4B与NCNN的YOLOv8高效部署实战:无GPU环境下的C++加速优化全流程指南**

本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的全流程。内容包括:从PyTorch模型导出NCNN格式文件、树莓派环境配置(OpenCV和NCNN编译)、C++实现代码解析(含模型加载、推理及后处理),以及实际部署测试结果。在树莓派4B上达到约2FPS,并提供INT8量化、多线程等优化建议。该方案为无GPU设备提供了轻量化目标检测的实用部署方案,适合边缘计算场景。

FJN110的博客 917

我也中年危机了!收入骤降、压力骤增...

点关注公众号,回复“1024”获取2TB学习资源!年近三十五,真的卷不动了,新技术层出不穷,这个还没摸清门道,那个就已经开始流行使用了。跟其他行业的朋友吐槽, 他说你学呀,你们这行不就是终身学习的嘛。我苦笑, 平时早上七八点出门工作一天到家晚上七点,不加班都头昏脑涨,只想躺平,如果加班更不用说了。那么晚回来还能看技术文档刷视频敲代码学习的那真的是个狼火。前段时间听一个前同事讲,现在出门面个试, 一...

民工哥的博客 336

石油化工软件:ProII二次开发_(9).案例研究:ProII二次开发实例

我们将上述三个步骤整合到一个完整的案例中,展示如何从头到尾实现一个ProII二次开发项目。这个项目包括自动化流程模拟、数据处理与分析以及动态工艺参数调整。

kkchenjj的博客 919

QT实现ftp服务器(附完整源码)

QT实现ftp服务器(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1784

Linux服务器磁盘扩容完整指南

df -T # 看 Type 列# 或最常见的低级错误:XFS 上跑resize2fs。resize2fs只管 ext2/3/4,XFS 必须用xfs_growfs,且参数传的是挂载点而不是设备名。经验值:Ubuntu/Debian 默认 ext4,CentOS/RHEL/Rocky/Alma 默认 XFS。# ── 无 LVM,ext4 ────────────────────────────# ── 无 LVM,XFS ─────────────────────────────。

qq_19716091的博客 349

电脑技巧:Hyper-V安装UOS操作系统图文教程

今天给大家分享微软官方Hyper-v虚拟机管理软件安装UOS操作系统图文教程,感兴趣的朋友也可以下载试一试,当然有啥问题也可以互相沟通交流!

IT技术分享社区 4707

UMFCPPD快速载波相位极性判断

传统的载波相位极性通过帧同步头的极性进行判定的时间 较长,判定周期为一个子帧的周期(GPS L1为6s,GLONASS G1/G2为2s,BDS IGSO/MEO卫星B1/B2/B3为6s),而极性 判定时间很大程度上影响了RTK的初始化时间。为此在载 波跟踪初始锁定或载波跟踪失锁时,须缩短载波相位极性 判定有效时间,从而提高RTK的初始化效率。

Uicore的博客 214

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

如何提升 5G 移动性切换验证效率?德思特 Amarisoft Callbox 新增 NR SA LTM 测试功能详解

针对5G车联网、工业互联网和智能机器人等高移动性场景的切换中断问题,德思特Amarisoft Callbox 推出NR SA LTM测试方案,通过双小区环境配置、无线信号条件调整与协议日志分析,实现5G终端LTM切换流程的可重复、可观测验证,助力移动性性能优化与问题定位。

hongke_weixin的博客 333

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

软银利用 Transformer 神经接收机实现更高的 5G 上行吞吐量

使用商用智能手机进行的空口测试表明,NVIDIA Aerial 可实现最高 60.5% 的上行 L1 吞吐量提升。软银将基于 Transformer 的神经接收机集成到 NVIDIA Aerial 的 5G 物理层(L1)中,并在屏蔽室内使用商用智能手机,通过单层上行空间传输进行了空口(OTA)测试。我们采集了上行 IQ 数据,对模型进行了微调,并在启用链路自适应的情况下,对两种接收机处理路径进行了比较。

凡森 257

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MiniMax H3-Image 部署评估:约 135GB 模型组件、单卡与多卡配置及使用条件

MiniMax发布33.1B参数图像生成模型H3-Image,支持文生图、改图与参考图生成,统一权重,6步采样即可输出约16MP高清图像,最高生成速度达主流方案5倍。模型部署需约135GB显存(含文本编码器),支持vLLM-Omni与SGLang部署,推荐4卡并行或卸载策略。官方许可协议限制商用范围,年收入超百万美元或对外提供服务需授权,境内公开服务须履行备案与内容标识义务。使用前需核查部署与合规双重门槛。

2601_96080144的博客 322

无人配送车通信架构解析:双5G、1000BASE-T1与TSN/gPTP时间同步

从车载网络架构出发,分析无人配送车中的双5G通信、1000BASE-T1千兆车载以太网、TSN/gPTP时间同步及多链路通信机制,并介绍SV920网联域控制器的应用。

starelink的博客 282

工业5G/4G路由器怎么选?核心参数解析与工业级网关选购指南

选对工业 5G 路由器,不仅是选择一个上网硬件,更是为整个工业系统的稳定运行买下“保险”。在选型时,切记结合实际现场的网络频段需求、接口类型(网口/串口)、Wi-Fi规格以及防护等级进行综合评估。如需了解具体的型号参数对比、技术白皮书或项目落地报价,欢迎访问官方产品页面或联系南京码讯获取更多专业支持。

陈海飞博客 42

读数据安全架构设计与实践25GRC

读数据安全架构设计与实践25GRC

lyingSeven的博客 376

从CeMAT看极智嘉:如何打造自进化无人仓

11月3日,CeMAT Asia展会上,极智嘉以“全仓自主,极智进化”为主题,展示全品类、全场景、全流程的仓储机器人解决方案。其RSHyper攀爬机器人实现每1000㎡每小时6000箱吞吐,搭配具身智能机器人Gino1与无人拣选工作站RAPS,打通拣选自动化最后一环。依托仓库大脑平台,实现跨形态协同调度,推动7×24小时无人化自主运营。从“全”到“快”,极智嘉正重塑仓储智能化竞争逻辑。

151

NR 5G-A NTN 多普勒频移补偿

多普勒频移:由于接收端和发射端的相对运动而导致的信号频率偏移。多普勒变化率:随时间推移,多普勒频移会发生变化。被称为多普勒变化率,简称多普勒率。下图展示了该系统的基本几何结构。卫星接收到的信号载波频率会受到发射机运动的影响;UE 从卫星接收到的信号的多普勒效应,除了受卫星或 HAPS 运动的影响外,也会受到 UE 自身运动的影响。由于空中/空间载具与 UE 均相对于地球运动,两者的各自影响可通过代数方式叠加。ΔFFo∗V∗cosθFo 是载波频率;V 是UE速度;θ。

littleBird_2的博客 193

NR 5G-A NTN 随机接入

NTN的随机接入流程和普通NR一样,但因为NTN的传播时延非常大,协议对此新增了一些措施。

littleBird_2的博客 251

中国信创5G蜂窝路由器软硬件技术方案-从国产软硬件适配到工业站点部署与迁移

假设一座泵站通过 5G 向中心平台上报水位。柜门关上以后,信号比开门时差,上报开始断断续续。现场切换到备用 SIM,路由器很快重新拿到了 IP 地址,中心却过了一会儿才收到数据。无线接入已经恢复,原有隧道和应用连接还在重建,采集器也要决定哪些记录需要补发。现场要交付的,是从采集器到中心平台这条完整的业务路径。将主控和通信模组换成国产平台,泵站对中心的业务接口可以继续沿用,设备内部却要重新打通驱动、数据通道、密码库和升级链。

2601_95451299的博客 448
上一篇: 项目终于用上了插入式注解,真香!
下一篇: 分库分表,可能真的要退出历史舞台了!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值