一、当脚本成为"哑巴":那些年我们追查的日志谜案

(场景描述:清晨六点的服务器告警) 某天凌晨收到生产环境告警,发现定时备份脚本异常退出。打开日志文件却只有"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
}

五、技术全景图:方案选型指南

应用场景矩阵

  • 基础方案:简单命令行工具、个人开发环境
  • 进阶方案:生产环境关键脚本、需要审计的场景
  • 高阶方案:分布式系统、合规性要求严格的金融系统

技术参数对比表

特性 基础方案 进阶方案 高阶方案
实时性 ★★★ ★★★★ ★★★★★
可追溯性 ★★ ★★★★ ★★★★★
系统资源消耗 较高
维护复杂度 简单 中等 复杂

六、避坑指南:血泪换来的经验结晶

  1. 权限陷阱:日志目录的写权限要早于脚本执行检查
  2. 缓冲区谜题:使用sync命令或unbuffer工具解决日志延迟
  3. 信号干扰:正确处理SIGTERM等终止信号
  4. 编码规范:统一使用UTC时间戳避免时区混乱
  5. 安全红线:日志中禁止记录敏感信息

七、未来之路:智能化日志演进方向

  • 机器学习异常检测
  • 实时日志流分析
  • 基于Prometheus的监控集成
  • 容器环境日志适配