如何在 syslog 中使用不同的标签记录 stdout 和 stderr?

如何在 syslog 中使用不同的标签记录 stdout 和 stderr?

我可以将stdout和重定向stderrlogger 这边走

./myprog 2>&1 | tee /dev/tty | logger

但我希望能够标签每个日志条目根据其来源分别标有“ myprog-out”和“ ”(和)。myprog-errstdoutstderr

我还希望能够在屏幕上看到 stdout 和 stderr 输出。

答案1

鉴于你有可用的功能,您可以使用流程替代像对普通文件一样单独重定向每个流:

./myprog  > >(logger -t myprog-out)  2> >(tee /dev/tty | logger -t myprog-err)

答案2

https://stackoverflow.com/questions/9112979/pipe-stdout-and-stderr-to-two-different-processes-in-shell-script

您可以用 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,以便在控制台上看到它,然后传输到记录器。

相关内容