shell脚本日志需按级别(info/warn/error)、模块(下载/解析等)、生命周期(运行/归档/清理)和上下文(时间/pid/脚本名/错误码)四层分层管理,实现精准定位与高效运维。

Shell脚本运行日志记录不是简单加个echo或重定向就完事,关键在于分层——把不同性质、不同重要程度的日志分开记录,才能在出问题时快速定位,不被噪音淹没。
按级别分层:INFO、WARN、ERROR各归其位
混在一起的日志等于没日志。建议统一用前缀标识级别,例如[INFO]、[WARN]、[ERROR],再通过不同文件或不同颜色(终端)区分。
-
INFO:记录正常流程节点,如“开始处理用户列表”“备份完成”,写入
app.log -
WARN:非致命但需关注,如配置项缺失、超时重试成功,写入
warn.log并可设定时扫描告警 -
ERROR:命令失败、返回码非0、关键变量为空,必须写入
error.log,同时触发邮件/钉钉通知
按模块分层:脚本功能解耦,日志也解耦
一个复杂脚本常包含下载、解析、入库、通知等环节。每个模块应有独立日志流,避免交叉干扰。
- 用函数封装模块,每个函数开头定义局部日志路径,如
LOG_DOWNLOAD="/var/log/myapp/download.log" - 调用
log_info "下载完成: $url"时,自动写入对应模块日志,不污染主日志 - 主脚本汇总各模块最后状态,写入
summary.log,含时间戳、总耗时、各模块exit code
按生命周期分层:运行中、归档、清理三阶段管理
日志不是越攒越多就好,要设计自动生命周期策略。
- 运行中:使用
date +'%Y%m%d_%H%M%S'生成唯一临时日志名,防止并发覆盖 - 归档:每日0点将当日日志打包压缩,如
myapp_20240520.tar.gz,存入/var/log/myapp/archive/ - 清理:保留最近30天的压缩包,超出的自动
rm -f;原始日志只留7天,避免磁盘打满
带上下文的结构化记录:让每条日志自己会说话
光写“失败了”没用,得说明谁、在哪、为什么、当时环境如何。
- 每条日志开头固定输出:
$(date '+%Y-%m-%d %H:%M:%S') [$$] [$(basename $0)](时间、PID、脚本名) - 错误日志追加
last_command="..."和last_exit_code=$?,必要时set -o pipefail确保管道错误被捕获 - 敏感信息如密码、token做掩码处理,用
sed 's/password=[^& ]*/password=***/g'过滤后再记录
分层不是增加复杂度,而是把混乱变成秩序。从级别、模块、生命周期、上下文四个维度切一刀,日志就从“看了也白看”变成“一眼定乾坤”。











