重定向 stdout 和 stderr,仅在 stderr 上带有时间戳

twb*_*mer 5 bash

我正在尝试为我没有编写的测试程序更好地记录日志。我希望 STDERR 输出的所有行都有时间戳,但如果可能的话,我想单独保留 STDOUT。我还想要一个文件 (all.txt) 来记录 stdout 和 stderr(带有或不带有 STDERR 时间戳),以及一个专用于 STDERR 输出的文件(errors.txt,带有时间戳)

另外,我不在乎是否有任何内容回显到终端。这是一个批处理式程序。

我确实查看了 rsyslog 并且稍后可能会出现,但这是一个我应该能够真正快速破解的解决方案......至少,如果我对输出重定向有更多的了解。我读了一堆类似的问题,但显然与这种确切情况无关。

我认为为了向 stderr 输出添加时间戳,我想使用管道和来自这个问题的技术:https : //serverfault.com/questions/310098/adding-a-timestamp-to-bash-script-log

这里最干净的解决方案是什么?请注意,我有 bash 3.2.25 上的 RHEL5 系统。

            +----stdout-------------------+
           /                               \
test.pl --+                                 +--> all.txt
           \                               /
            +----stderr | add_timestamps -+----> errors.txt
Run Code Online (Sandbox Code Playgroud)

lk-*_*lk- 5

我认为这会做你想做的:

test.pl 2>&1 >all.txt | add_timestamps | tee -a all.txt > errors.txt

  • 将 stderr 重定向到 stdout(以便我们稍后对其进行管道传输)
  • 将(原始)标准输出重定向到 all.txt
  • 管道标准输出(现在包含错误消息)到 add_timestamps
  • 使用tee附加的错误(时间戳)以all.txt
  • 最后,还将错误写入 errors.txt