我可以将stdout
和重定向stderr
到logger
这边走:
./myprog 2>&1 | tee /dev/tty | logger
但我希望能够标签每个日志条目根据其来源分别标有“ myprog-out
”和“ ”(和)。myprog-err
stdout
stderr
我还希望能够在屏幕上看到 stdout 和 stderr 输出。
答案1
答案2
您可以用 logger -t 替换 sed标签命令让它们进入系统日志文件。
以下是我对上述 URL 中的示例脚本所执行的操作:
#!/bin/bash
foo() {
echo a
echo b >&2
echo c
echo d >&2
}
{ foo 2>&1 1>&3 3>&- | logger -t 'my-err'; } 3>&1 1>&2 | logger -t 'my-stdout'
exit 0
希望这可以帮助
答案3
我正在研究下面的答案,但遇到了一个可能与其他答案相关的问题,以及不使用logger
其标签选项的问题,所以我将提交我的发现。
首先,我生成了混合标准输出和错误消息,它们之间存在一些差距:
echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2
然后我out:
在标准输出消息的前面添加了以下内容:
{ echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \
sed 's/^/out: /g';
然后,我err:
通过添加到所有记录,然后删除已添加的字符串来添加到错误流out:
(请注意,无论使用什么字符串out:
都不能启动任何未修改的错误记录):
{ { echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \
sed 's/^/out: /g'; } 2>&1 | sed -e 's/^/err: /g' -e 's/^err: out: /out: /g'
Lewis M 的回答表明,可能可以使用重定向到流 3 来避免双重替换,但这可以很好地满足上述约束;但是,缓冲意味着记录不一定按照生成的顺序记录,因此我最终得到:
stdbuf -i0 -o0 -e0 bash -c \
"{ { echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \
sed 's/^/out: /g'; } 2>&1 | sed -e 's/^/err: /g' -e 's/^err: out: /out: /g'" | \
tee /dev/tty | logger
这将在非缓冲环境中运行前一个命令,然后通过管道传输输出tee
,以便在控制台上看到它,然后传输到记录器。