linux中记录带时间戳和上下文的错误日志,核心是用ts或stdbuf+awk为stderr加时间戳,结合${bash_source[0]}:$lineno、$?记录文件行号与退出码,并统一写入logrotate轮转的日志文件。

在 Linux 系统中记录带时间戳和详细上下文的错误日志,核心是让每条错误消息自带“什么时间、在哪一行、哪个脚本、为什么失败”这四类信息。不依赖外部服务,纯 Bash 脚本就能实现,关键是组合好重定向、内置变量和时间格式化。
给 stderr 自动加标准时间戳
最轻量可靠的方式是用 ts 命令(来自 moreutils 包)为所有错误输出统一打标:
- 先安装:
sudo apt install moreutils(Debian/Ubuntu)或sudo yum install moreutils(RHEL/CentOS,需启用 EPEL) - 在脚本开头加这行:
exec 2> >(ts '[%Y-%m-%d %H:%M:%S] ' >&2) - 之后所有发往 stderr 的内容(比如
ls /missing 2>&1)都会自动带上形如[2026-09-25 07:48:32] ls: cannot access '/missing': No such file or directory的前缀
手动补全关键上下文信息
仅靠时间戳不够定位问题,需在出错时主动记录位置和状态:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 用
${BASH_SOURCE[0]}:$LINENO获取当前脚本名和行号 - 用
$?捕获上一条命令退出码(非零即错) - 示例写法:
cp /src/file /dst/ || echo "[$(date '+%F %T')] ERROR at ${BASH_SOURCE[0]}:$LINENO (exit $?)">&2 - 这样即使不用 ts,也能确保关键错误附带完整现场信息
把错误集中写入可轮转的日志文件
避免错误散落在终端或被覆盖,应统一落地到文件并做基础管理:
- 用
exec 2>> /var/log/myscript.err.log将 stderr 追加进指定文件 - 配合 logrotate 配置按天切分、保留最近 7 天,防止日志撑爆磁盘
- 多实例并发时,在文件名中加入
$$(当前进程 PID),例如:/var/log/myscript.err.$$.log
用 stdbuf + awk 实现无依赖的时间戳方案
若无法安装 moreutils,可用系统自带工具模拟:
exec 2> >(stdbuf -oL -eL awk '{print "[" strftime("%F %T") "] ERROR:" $0}' >&2)- stdbuf 强制行缓冲,避免因 stderr 缓存导致时间错乱
- awk 中可自由定制前缀(如 WARN/INFO)、字段顺序,也方便后续用
grep ERROR快速筛选










