一、当脚本成为"哑巴":那些年我们追查的日志谜案
(场景描述:清晨六点的服务器告警) 某天凌晨收到生产环境告警,发现定时备份脚本异常退出。打开日志文件却只有"Starting backup process..."的记录,就像侦探小说缺少了关键章节。这种场景对运维人员来说再熟悉不过——Bash脚本运行时突然"失声",错误信息仿佛掉进了黑洞。
二、基础加固:打造全方位日志捕捉网
(技术栈:Bash原生重定向)
#!/bin/bash
# 全量日志捕获方案
LOG_FILE="/var/log/myapp/$(date +%Y%m%d).log"
exec > >(tee -a "$LOG_FILE") 2>&1 # 魔法开始的地方
echo "业务处理开始..."
rm -rf /tmp/cache/* # 故意制造错误
python data_processor.py # 可能出错的Python调用
# 显式退出状态记录
echo "[$(date)] 脚本退出状态码: $?"
技术解剖:
exec > >(tee -a "$LOG_FILE") 2>&1
实现标准输出和错误的同时捕获- 管道符号
>
的嵌套使用保持实时写入 tee
命令实现屏幕与文件的双重输出
三、进阶方案:构建智能错误处理中枢
(关联技术:trap捕获与syslog集成)
#!/bin/bash
# 增强版错误追踪系统
declare -g ERROR_FLAG=0
LOG_TAG="BackupScript[$$]" # 带进程ID的日志标签
# 定义错误陷阱函数
trap 'error_handler $LINENO' ERR
error_handler() {
local line=$1
ERROR_FLAG=1
logger -t "$LOG_TAG" "[EMERG] 在$line行捕获错误: $BASH_COMMAND"
echo "[$(date +%T)] 错误代码 $? 发生在第${line}行" >> "$LOG_FILE"
# 此处可添加邮件通知等扩展功能
}
# 关键业务代码
validate_config() {
[[ -f "/etc/myapp.conf" ]] || return 1
}
main_process() {
validate_config || return $?
# 其他业务逻辑...
}
# 执行入口
main_process
(( ERROR_FLAG )) && logger -t "$LOG_TAG" "脚本异常终止"
技术亮点:
trap
机制实现实时错误拦截logger
命令对接系统日志服务- 动态错误位置追踪
- 进程标识符增强可追溯性
四、高阶组合:构建企业级日志生态系统
(技术融合:日志分级与轮转策略)
#!/bin/bash
# 企业级日志管理系统
LOG_DIR="/var/log/myapp"
mkdir -p "$LOG_DIR"
chmod 750 "$LOG_DIR"
# 日志分级函数
log() {
local level=$1 msg=$2
case $level in
DEBUG) [[ $DEBUG_MODE ]] || return ;;
ERROR) echo -e "\033[31m[ERROR]\033[0m $msg" ;;
*) echo "[$level] $msg" ;;
esac
logger -p user.$level -t "AppScript" "$msg"
}
# 日志轮转检查
check_log_rotation() {
local logfile="$LOG_DIR/app.log"
[[ $(stat -c %s "$logfile") -gt 52428800 ]] && \
mv "$logfile" "$LOG_DIR/app_$(date +%s).log"
}
# 示例使用
DEBUG_MODE=true
log DEBUG "启动配置文件解析"
check_log_rotation
log INFO "业务处理阶段开始..."
配套logrotate配置:
/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root adm
}
五、技术全景图:方案选型指南
应用场景矩阵:
- 基础方案:简单命令行工具、个人开发环境
- 进阶方案:生产环境关键脚本、需要审计的场景
- 高阶方案:分布式系统、合规性要求严格的金融系统
技术参数对比表:
特性 | 基础方案 | 进阶方案 | 高阶方案 |
---|---|---|---|
实时性 | ★★★ | ★★★★ | ★★★★★ |
可追溯性 | ★★ | ★★★★ | ★★★★★ |
系统资源消耗 | 低 | 中 | 较高 |
维护复杂度 | 简单 | 中等 | 复杂 |
六、避坑指南:血泪换来的经验结晶
- 权限陷阱:日志目录的写权限要早于脚本执行检查
- 缓冲区谜题:使用
sync
命令或unbuffer
工具解决日志延迟 - 信号干扰:正确处理SIGTERM等终止信号
- 编码规范:统一使用UTC时间戳避免时区混乱
- 安全红线:日志中禁止记录敏感信息
七、未来之路:智能化日志演进方向
- 机器学习异常检测
- 实时日志流分析
- 基于Prometheus的监控集成
- 容器环境日志适配