我有一个需要在启动时运行的程序,它在 stdout 和 stderr 上有输出,我想使用 logger 命令重定向到系统日志。我的启动脚本中的内容是:
/home/dirname/application_name -v|记录器 2>&1 &
这将 stdout 重定向到 syslog 很好,但是 stderr 来到控制台,所以我需要改进命令。
答案1
您需要在将 STDERR 和 STDOUT 的输出通过管道传输到 之前将其组合起来logger
。试试这个:
/home/dirname/application_name -v 2>&1 | logger &
例子
$ echo "hi" 2>&1 | logger &
[1] 26818
[1]+ Done echo "hi" 2>&1 | logger
$ sudo tail /var/log/messages
Apr 12 17:53:57 greeneggs saml: hi
如果在实际的 Bash shell 中谨慎使用的话,您也可以在此处使用缩写符号(不要与 Dash 混淆):
$ echo "hi" |& logger &
笔记:这相当于<cmd1> 2>&1 | <cmd2>
.同样,只有在交互地使用实际的 Bash shell 时才使用上面的内容,这将是一个很好的方法。
摘自ABSG
# |& 被添加到 Bash 4 作为 2>&1 | 的缩写。
参考
答案2
您还可以将 stdout 和 stderr 记录到 syslog 中的不同级别。
{ ( echo info; >&2 echo critical ) 2>&3 | logger -t mycoolscript; } 3>&1 1>&2 | logger -t mycoolscript -p 2
第一部分( echo info; >&2 echo critical )
模拟一个在 stdout 和 stderr 上输出的程序。
诀窍就2>&3
来自于此回答,能够将 stdout 和 stderr 输出到不同的进程。
journalctl -f
您可以使用带有 systemd 的 Linux 来观察结果。