Linux Shell脚本中优雅输出函数执行日志的核心是:带时间戳和函数名的log函数输出到stderr、自动捕获调用上下文、通过LOG_LEVEL分级控制、轻量级日志轮转。

在 Linux Shell 脚本中优雅输出函数执行日志,核心是让日志可读、可追溯、不干扰正常输出,并支持分级与时间标记。不需要复杂框架,几行清晰逻辑就能做到。
带时间戳和函数名的通用日志函数
定义一个轻量 log 函数,自动注入当前时间、调用位置(函数名)和日志等级:
log() {
local level="${1:-INFO}"
local msg="${2:-}"
printf "[%s] [%s] %s\n" "$(date '+%H:%M:%S')" "$level" "$msg" >&2
}
使用时直接传入级别和内容,例如:
log INFO "start processing user data"log DEBUG "input value: $input"log ERROR "failed to read config file"
所有日志统一输出到 stderr,避免污染 stdout,方便管道或重定向时分离日志流。
自动捕获函数上下文(文件+行号+函数名)
更进一步,可借助 Bash 内置变量自动记录调用点:
log_trace() {
local level="${1:-TRACE}"
local msg="${2:-}"
printf "[%s] [%s] [%s:%d in %s] %s\n" \
"$(date '+%H:%M:%S')" "$level" "${BASH_SOURCE[1]##*/}" "${BASH_LINENO[0]}" "${FUNCNAME[1]}" "$msg" >&2
}
这样调用 log_trace DEBUG "value=$x" 会输出类似:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
[14:22:05] [DEBUG] [main.sh:42 in fetch_user] value=1001
对调试多层函数调用非常有用,无需手动写文件名和行号。
按需启用/禁用日志与分级控制
通过环境变量开关日志,避免上线后冗余输出:
- 设
LOG_LEVEL=DEBUG全量输出;设LOG_LEVEL=ERROR只显示错误 - 在 log 函数中加判断:
[[ "${LOG_LEVEL:-INFO}" == "DEBUG" ]] || [[ "$level" == "ERROR" ]] || return - 支持静默模式:
LOG_QUIET=1时跳过所有非 ERROR 日志
这种分级机制让脚本在开发、测试、生产环境中灵活切换输出粒度。
日志自动归档与轮转(轻量版)
长期运行的脚本需要防止单个日志文件无限膨胀。可用简单策略实现行数轮转:
- 日志写入固定文件(如
"${0%.sh}.log") - 每次写入前检查行数,超限(如 1000 行)则用
tail -n 500保留最新记录 - 或配合
logrotate系统工具,用配置文件管理归档周期与压缩
不依赖外部服务,纯 Bash 即可完成基础生命周期管理。

















