Shell脚本日志核心是可查、可定位、可归档,需统一时间戳、明确级别、来源标识,标准化格式为时间[脚本名:行号]内容,封装为log_info等函数,日志走stderr或独立文件,配合logrotate轮转,敏感信息脱敏,关键操作留痕校验。

Shell脚本中做日志记录,核心不是“记下来”,而是“能查、能定位、能归档”。真正可用的日志,得有统一时间戳、明确级别、可追溯来源,还要兼顾可读性和后期处理(比如用grep、awk或ELK分析)。
日志格式必须标准化
每条日志开头固定为:[时间] [级别] [脚本名:行号] 内容。时间用date +"%Y-%m-%d %H:%M:%S"保证时区一致;级别限定为INFO/WARN/ERROR/DEBUG;脚本名用${0##*/}自动提取,行号用$LINENO辅助定位。
- 避免用
echo直接打日志——没时间、没级别、难过滤 - 封装成函数,例如
log_info "服务启动完成",内部统一格式输出 - 错误日志务必带退出码和上下文,比如
log_error "curl失败,返回码 $?"
日志输出与重定向要分离
标准输出(stdout)留给程序逻辑结果,日志必须走标准错误(stderr)或独立文件。否则管道操作(如./deploy.sh | grep "success")会把日志混进去,导致误判。
- 推荐方式:所有日志写入
/var/log/myapp/下的滚动文件,用logger命令也可接入syslog - 临时调试可用
exec 2>>/tmp/deploy.log把stderr重定向,但生产环境禁用 - 避免
2>&1粗暴合并——日志和业务输出语义不同,不该混在一起
自动轮转与清理不能靠手动
日志不轮转,磁盘迟早爆。别指望运维每天去删旧文件——脚本自己该管好自己的日志生命周期。
- 用
logrotate配置文件管理(如/etc/logrotate.d/myapp),设daily + rotate 30 + compress - 脚本内也可简单实现:检查日志大小,超10MB就mv成
app.log.1,已有.1则mv成.2,最多保留5份 - 敏感日志(含密码、token)必须过滤后再记录,可用
sed 's/password=[^& ]*/password=xxx/g'脱敏
关键操作必须留痕+校验
运维脚本常涉及重启服务、修改配置、变更数据库——这些动作光记“执行了”没用,得记“执行结果是否符合预期”。
- 执行前记录原始状态,如
log_info "当前nginx进程数: $(pgrep nginx | wc -l)" - 执行后立刻验证,比如
systemctl is-active --quiet nginx && log_info "nginx已正常运行" || log_error "nginx启动失败" - 高危操作(如rm -rf)加dry-run开关,默认只打印将要执行的命令,确认后再真实执行
log_info开始,就按生产标准写。

















