日志不是随便打的:输出规范与轮转清理实战
写作注释:本文由 AI 生成,主题「浅谈日志:输出规范与轮转清理」,内容仅供参考,欢迎留言交流。
开头引入
日志大概是所有开发者都”又爱又恨”的东西:没有它,出了问题只能干瞪眼;有了它,又常常面临两个更头疼的问题——要么日志格式五花八门,排障时 grep 都不知道搜什么;要么日志无限膨胀,把磁盘撑爆,系统先于业务崩溃。我自己就在手机上跑过几个常驻脚本,半年不管,~/.cache 里躺着几个 G 的日志文件,那滋味谁用谁知道。这篇文章不聊高大上的 ELK 全家桶,就讲一个普通开发者(尤其是 Termux / 单机服务器场景)真正需要的:日志该怎么打,以及怎么让它自动清理。
规范输出:让日志可读、可搜、可统计
日志的第一原则是结构化。同样是记一条错误,出错了 和 [2026-08-13 10:00:00] [ERROR] [job_sync] sync failed: network timeout (retry=2/5) 是两种完全不同的排障体验。推荐的最小格式包含四个字段:时间戳、级别、模块名、消息正文。级别建议统一用 DEBUG / INFO / WARN / ERROR 四级,便于过滤;时间戳用 ISO 8601(%Y-%m-%d %H:%M:%S),排序和检索都方便。
输出目标也要区分:调试信息写文件,进度信息可以上 stdout,错误一定要单独可定位。很多脚本喜欢把错误悄悄吞掉,这是大忌——哪怕只是 logger.error(...) 一句,也要让失败可见。记住一句话:日志是写给未来的你(或者未来的运维)看的,写得含糊,等于没写。
轮转:让日志文件有”天花板”
日志不可能无限增长,轮转(log rotation)就是给日志设上限的机制。最常见的两种策略:
- 按大小轮转:文件超过阈值(比如 10MB)就重命名归档,保留最近 N 份,更老的就删掉。Linux 上
logrotate是标准答案。 - 按时间轮转:每天(或每周)切一个文件,例如
app.log→app-20260813.log,适合需要按天回溯的场景。
Termux 用户没有 systemd,logrotate 通常也没装,但没关系,几十行 Python 或 Shell 就能实现一个够用的轮转。核心逻辑就三件事:检查大小、改名归档、删除超龄文件。跑在 cron 里或脚本自身启动时检查一次即可。
一个 20 行的 Python 轮转示例
1 | |
够用就好。生产环境当然优先用 logrotate,它的配置更健壮,还支持压缩(compress 选项能把历史日志压成 .gz,磁盘占用立减 90%)。
清理与监控:别忘了”最后一道闸”
轮转解决”单文件无限涨”,但归档本身也会积累。所以还需要保留策略:归档只留 N 份或 N 天,超出即删。这条规则可以和轮转放在同一个脚本里,用 find 一行搞定:
1 | |
另一个容易被忽略的点是主动监控:磁盘告警阈值(比如超过 80% 就告警)应该独立于日志本身,因为轮转失效时(比如脚本没跑)总要有人知道。我自己习惯给关键任务加一条 du -sh 的周报,几秒钟的事,能提前发现很多隐患。
总结
日志管理其实就三件事:打得规范(结构化、分级、可搜索)、转得及时(按大小或时间轮转,设上限)、清得干净(保留策略 + 监控兜底)。别等磁盘满了才想起日志,花半小时把输出规范和轮转脚本写好,之后就能一劳永逸。行动建议:先检查你机器上最大的三个日志文件,然后从今天开始,给每个新脚本加上日志轮转——相信我,半年后的你会感谢现在的自己。