有没有办法从脚本中将所有的标准输出和标准错误重定向到systemd日志?

8

我喜欢使用systemd的日志来查看和管理我的脚本的日志。我已经了解到,可以按消息基础从用户脚本记录到journal中。

echo 'hello' | systemd-cat -t myscript -p emerg

有没有一种方式可以将所有消息重定向到 journald,即使是由其他命令生成的消息?比如...
exec &> systemd-cat

更新:

有一些部分成功。 尝试从终端中使用Inian的建议。

~/scripts/myscript.sh 2>&1 | systemd-cat -t myscript.sh

它成功了,stdout和stderr被重定向到systemd的日志中。有趣的是,

~/scripts/myscript.sh &> | systemd-cat -t myscript.sh

在我的Bash终端中没有起作用。

我仍然需要找到一种方法,在其他程序调用我的脚本时在脚本内部完成此操作。

我尝试过了...

exec 2>&1 | systemd-cat -t myscript.sh

但它没有起作用。 更新2: 从终端输入
systemd-cat ~/scripts/myscript.sh

它能正常工作。但我仍在寻找一种从脚本内部实现此操作的方法。


这些日志是哪个应用程序生成的?是一个shell脚本还是另一个用户应用程序? - Inian
从我的个人Shell脚本中 - deanresin
your-script.sh &> | systemd-cat -t myscript 的方式运行它不起作用吗? - Inian
它没有起作用。~/scripts/test.sh &> | systemd-cat -t test.sh bash: 语法错误,附近意外的令牌 \|'` - deanresin
2
不确定错误来自哪里,也许可以尝试使用~/scripts/test.sh 2>&1 | systemd-cat -t test.sh代替&> - Inian
显示剩余3条评论
3个回答

5

systemd-cat 管道是需要与您的脚本并行运行的进程。Bash 提供了这个功能,但不适用于 POSIX sh

exec > >(systemd-cat -t myscript -p emerg) 2>&1
>(command) 这个进程替换符会启动另一个进程,并返回一个伪文件名(类似于 /dev/fd/63),你可以将其重定向。这基本上是对 mkfifo 的包装,如果你想将其移植到 POSIX sh 中,也可以使用这种方法。

2
您可以将脚本路径用作标记:-t $(realpath "$0") 您可以为stderr设置不同的优先级:2> >(... -p err) 结果为: exec > >(systemd-cat -t "$(realpath "$0")" -p info ) 2> >(systemd-cat -t "$(realpath "$0")" -p err ) - jehon

1
如果您的脚本不是一个shell脚本,而是另一种允许加载链接到-lsystemd扩展模块的编程语言,还有另一种方式。有一个库函数sd_journal_stream_fd非常精准地匹配了所需任务。直接从bash中调用它(而不是在子进程中)似乎很困难。例如,在Python中,它作为systemd.journal.stream可用。这个函数的本质是连接一个unix域流套接字并通信正在传输哪种数据(例如优先级)。在这里使用shell的困难部分是使它连接unix域套接字(而不是在子进程中连接)。
本答案的关键想法来自Freenode / libera.chat用户grawity

0

显然,由于我无法理解的原因,您无法从脚本中将所有stdout和stderr重定向到journald,因为它必须被管道传入。为了解决这个问题,我发现人们使用syslog的记录器类似的技巧。

您可以将所有代码包装到一个函数中,然后将该函数管道传递到systemd-cat中。

#!/bin/bash

mycode(){
  echo "hello world"
  echor "echo typo producing error"
}
mycode | systemd-cat -t myscript.sh

exit 0

然后搜索日志记录..

journalctl -t myscript.sh --since yesterday

我很失望,没有更直接的方法来做这件事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接