1. Shell脚本日志记录的重要性与现状
在运维和自动化领域,Shell脚本就像是我们日常工作的"瑞士军刀"。但很多脚本在运行后就像"黑盒子"——你知道它执行了,但不知道具体发生了什么。特别是在生产环境中,当脚本执行失败时,如果没有详细的日志记录,排查问题就像大海捞针。
我见过太多这样的场景:一个定时执行的备份脚本突然失败,但因为没有足够的日志信息,运维团队不得不花费数小时甚至数天来重现和定位问题。更糟糕的是,有些关键业务脚本在运行中出现部分失败(比如处理100个文件只成功了99个),但由于缺乏细粒度的日志记录,这种问题可能长期不被发现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日志记录优化的核心原则
2.1 日志分级:从DEBUG到FATAL
一个良好的日志系统应该像医院的急诊分级制度:
- DEBUG:开发调试用,记录每个步骤的详细信息
- INFO:常规运行信息,记录关键里程碑
- WARN:需要注意但不影响继续运行的情况
- ERROR:操作失败但脚本仍可继续
- FATAL:致命错误,必须立即终止
bash复制log() {
local level=$1
local message=$2
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
case $level in
DEBUG) echo "[$timestamp] [DEBUG] $message" ;;
INFO) echo "[$timestamp] [INFO] $message" ;;
WARN) echo "[$timestamp] [WARN] $message" >&2 ;;
ERROR) echo "[$timestamp] [ERROR] $message" >&2 ;;
FATAL) echo "[$timestamp] [FATAL] $message" >&2
exit 1 ;;
esac
}
2.2 日志内容的最佳实践
好的日志应该像侦探的记事本——包含足够的信息来重建现场:
- 时间戳:精确到秒(关键问题可能需要毫秒级)
- 执行环境:主机名、用户名、脚本路径
- 关键参数:脚本接收的输入参数
- 操作对象:正在处理的文件、数据库记录等
- 执行结果:成功/失败及原因
bash复制log "INFO" "Starting backup process on $(hostname) as $USER"
log "INFO" "Script arguments: $@"
log "INFO" "Processing file: $filename"
3. 高级日志技术实现
3.1 日志轮转与归档
日志文件就像房间——不整理就会变得一团糟。我们需要:
- 按大小或时间分割日志
- 压缩旧日志节省空间
- 自动清理过期日志
bash复制setup_log_rotation() {
local log_file=$1
local max_size_mb=10
