在日常运维或自动化任务中,我们常常用Shell脚本来完成备份、清理日志、定时同步等操作。但脚本跑没跑成功?中间有没有报错?光靠肉眼盯着终端显然不现实。这时候,给脚本加上运行日志记录功能,就成了必备技能。
\n\n为什么需要记录日志
\n想象一下,你写了个每天凌晨2点自动备份数据库的脚本。某天早上发现备份没生成,但没人知道它昨晚到底执行了没有。如果脚本能把每次运行的时间、关键步骤和错误信息都记下来,查问题就方便多了。就像家里装了监控,出了事能回看录像。
\n\n最简单的日志记录方式
\n直接把脚本的输出重定向到一个日志文件里,是最基础的做法。比如:
\n./backup.sh >> /var/log/backup.log 2>&1\n这行命令的意思是:把标准输出和错误输出都追加写入 backup.log。虽然简单,但缺点是没有时间戳,看不出每条记录是什么时候发生的。
\n\n加上时间戳更清晰
\n可以在脚本里每执行一步,主动写一条带时间的日志。例如:
\n#!/bin/bash\n\nLOG_FILE="/var/log/mytask.log"\n\nlog() {\n echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE\n}\n\nlog "备份任务开始"\ncp -r /data /backup/data.bak\nif [ $? -eq 0 ]; then\n log "备份成功"\nelse\n log "备份失败"\nfi\n这样每次调用 log 函数,就会在日志里留下一行带时间的记录,谁看了都明白发生了什么。
\n\n让日志自动轮转
\n如果日志一直追加,迟早会把磁盘撑爆。可以用 logrotate 工具定期切分日志。比如配置一个 /etc/logrotate.d/mytask 文件:
\n/var/log/mytask.log {\n daily\n rotate 7\n compress\n missingok\n notifempty\n}\n意思是:每天切一次,保留最近7天的,压缩存档。这样既不会丢历史记录,又不会占用太多空间。
\n\n实战场景:监控脚本自己
\n有个小技巧,可以记录脚本是否被意外中断。比如在脚本开头写个锁文件,结束时删掉:
\nLOCK_FILE=/tmp/task.lock\n\nif [ -f $LOCK_FILE ]; then\n echo "检测到上次运行未正常结束" >> $LOG_FILE\n exit 1\nfi\n\ntouch $LOCK_FILE\n# ... 执行任务 ...\nrm -f $LOCK_FILE\n下次再跑的时候,如果发现锁文件还在,就知道上次可能崩溃了,可以及时排查。
\n\n小改进提升可读性
\n还可以给日志加点颜色(只在终端显示时生效),比如错误用红色,成功用绿色。虽然日志文件里看不到颜色,但在调试时一眼就能定位问题:
\nlog_error() {\n echo "[$(date '+%Y-%m-%d %H:%M:%S')] \033[31m$1\033[0m" | tee -a $LOG_FILE\n}\n\nlog_success() {\n echo "[$(date '+%Y-%m-%d %H:%M:%S')] \033[32m$1\033[0m" | tee -a $LOG_FILE\n}\n这里用了 tee 命令,既能输出到屏幕,又能写入文件,适合需要实时观察的场景。
","seo_title":"Shell脚本如何记录运行日志 - 实用案例分享","seo_description":"通过具体示例讲解如何在Shell脚本中添加运行日志记录功能,包括时间戳、错误追踪、日志轮转等实用技巧,适合日常运维使用。","keywords":"shell脚本,运行日志,日志记录,shell日志,脚本调试,自动化运维"}