日志不是随便打的:输出规范与轮转清理实战

写作注释:本文由 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.logapp-20260813.log,适合需要按天回溯的场景。

Termux 用户没有 systemd,logrotate 通常也没装,但没关系,几十行 Python 或 Shell 就能实现一个够用的轮转。核心逻辑就三件事:检查大小、改名归档、删除超龄文件。跑在 cron 里或脚本自身启动时检查一次即可。

一个 20 行的 Python 轮转示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os, glob, shutil
from pathlib import Path

LOG = Path.home() / "app.log"
MAX_SIZE = 10 * 1024 * 1024 # 10MB 触发轮转
KEEP = 5 # 保留最近 5 份归档

def rotate():
if LOG.stat().st_size < MAX_SIZE:
return
for i in range(KEEP, 0, -1): # 旧的先挪开
old = LOG.with_suffix(f".log.{i}")
if old.exists():
(LOG.with_suffix(f".log.{i+1}")).unlink(missing_ok=True)
shutil.move(old, LOG.with_suffix(f".log.{i+1}"))
shutil.move(LOG, LOG.with_suffix(".log.1"))
LOG.touch()

够用就好。生产环境当然优先用 logrotate,它的配置更健壮,还支持压缩(compress 选项能把历史日志压成 .gz,磁盘占用立减 90%)。

清理与监控:别忘了”最后一道闸”

轮转解决”单文件无限涨”,但归档本身也会积累。所以还需要保留策略:归档只留 N 份或 N 天,超出即删。这条规则可以和轮转放在同一个脚本里,用 find 一行搞定:

1
find ~/logs -name "*.log.*" -mtime +30 -delete

另一个容易被忽略的点是主动监控:磁盘告警阈值(比如超过 80% 就告警)应该独立于日志本身,因为轮转失效时(比如脚本没跑)总要有人知道。我自己习惯给关键任务加一条 du -sh 的周报,几秒钟的事,能提前发现很多隐患。

总结

日志管理其实就三件事:打得规范(结构化、分级、可搜索)、转得及时(按大小或时间轮转,设上限)、清得干净(保留策略 + 监控兜底)。别等磁盘满了才想起日志,花半小时把输出规范和轮转脚本写好,之后就能一劳永逸。行动建议:先检查你机器上最大的三个日志文件,然后从今天开始,给每个新脚本加上日志轮转——相信我,半年后的你会感谢现在的自己。


日志不是随便打的:输出规范与轮转清理实战
https://wumingmr.github.io/2026/08/13/日志不是随便打的:输出规范与轮转清理实战/
作者
无名
发布于
2026年8月13日
许可协议