我喜欢使用 systemd 的日志来查看和管理我自己的脚本日志的想法。 我已经意识到您可以根据每条消息从我的用户脚本登录到日记。
echo 'hello' | systemd-cat -t myscript -p emerg
有没有办法将所有消息重定向到日志,甚至是由其他命令生成的消息? 喜欢。。
exec &> systemd-cat
更新:
一些部分成功。从终端尝试了伊尼安的建议。
~/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
工程。 但我仍在寻找一种从脚本中做到这一点的方法。
systemd-cat
管道是一个需要与脚本同时运行的进程。 Bash 为此提供了一个设施,尽管它不能移植到 POSIX sh
.
exec > >(systemd-cat -t myscript -p emerg) 2>&1
>(command)
进程替换将启动另一个进程并返回一个伪文件名(类似于 /dev/fd/63
),您可以重定向到该伪文件名。 这基本上是mkfifo
黑客的包装器,如果您想将其移植到 POSIX sh
.
如果您的脚本碰巧不是shell脚本,而是允许加载链接到-lsystemd
的扩展模块的其他编程语言,还有另一种方法。有一个库函数sd_journal_stream_fd
可以非常精确地匹配手头的任务。从bash本身(而不是一些孩子)中称呼它似乎充其量是困难的。例如,在Python中,它可以作为systemd.journal.stream
。这个函数本质上是连接一个 unix 域流套接字并传达正在传输的数据类型(例如优先级)。这里使用 shell 的困难部分是让它连接 unix 域套接字(而不是在子域中连接)。
这个答案的关键思想是由Freenode/libera.chat用户grawity
给出的。
显然,出于超出我的原因,您不能真正将所有 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
我很失望没有更直接的方法可以做到这一点。