You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux Shell环境下如何将带时间戳的stderr错误信息写入日志文件

方案1:使用ts命令(最简洁,依赖moreutils包)

ts是专门用于给文本行添加时间戳的工具,仅需调整cmd1的stderr流向即可实现需求,原有标准输出的管道逻辑完全不变:

{ cmd1 2>&1 1>&3 | ts '[%Y-%m-%d %H:%M:%S]' >> cmd1_error.log; } 3>&1 | cmd2 | cmd3 > stdout.log

重定向逻辑说明:

  • 先将cmd1的stderr(文件描述符2)重定向到stdout(文件描述符1)的位置,再将stdout重定向到临时文件描述符3,此时管道仅接收原stderr内容,交给ts添加时间戳后写入错误日志
  • 再将临时文件描述符3的内容转回标准输出,送入后续的cmd2、cmd3管道,和原有业务逻辑完全一致

如果当前环境没有ts命令,可先安装moreutils包:Debian/Ubuntu系执行apt install moreutils,RHEL/CentOS系执行yum install moreutils。

方案2:无额外依赖,用awk实现时间戳

如果无法安装额外软件,可使用awk内置的strftime函数实现时间戳添加功能,重定向逻辑和方案1一致:

{ cmd1 2>&1 1>&3 | awk '{ print "[" strftime("%Y-%m-%d %H:%M:%S") "]", $0 }' >> cmd1_error.log; } 3>&1 | cmd2 | cmd3 > stdout.log

方案3:纯Bash实现(适配极端精简环境)

如果连awk都不可用,可使用Bash内置能力+date命令逐行添加时间戳:

{ cmd1 2>&1 1>&3 | while read -r line; do echo "[$(date +'%Y-%m-%d %H:%M:%S')] $line"; done >> cmd1_error.log; } 3>&1 | cmd2 | cmd3 > stdout.log

注意该方案性能较低,仅适合错误输出量较小的场景使用。

以上示例中错误日志默认使用追加模式>>,如果需要每次执行命令时清空旧错误日志,替换为覆盖模式>即可。

内容的提问来源于stack exchange,提问作者Cans404

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:15:02