如何查看日志中的错误消息

如何查看日志中的错误消息

我创建了一个程序,故意产生被零除错误。

如果我在命令行中运行它,它将返回:“浮点异常”

但如果我将其作为systemd服务运行,我就看不到此错误消息。

在我的systemd脚本中我添加了:

StandardError=journal

但使用时却看不到错误信息journalctl。如何将此错误消息添加到使用 看到的日志中journalctl

答案1

要使用以下命令获取运行服务的所有错误journalctl

$ journalctl -p 3 -xb

其中-p 3means priority err-x提供额外的消息信息,并-b表示自上次启动以来

答案2

默认情况下,systemd 单元的 stdout 和 stderr 会发送到 syslog。因此您可以在文件/var/log/messages/var/log/dmesg.

要更改它,您可以使用以下命令:

sudo journalctl -u [yourunit]

其中 [yourunit] 是 systemd .service 名称。例如,要查看来自 yourapp.service 的消息,

sudo journalctl --unit=yourapp

然后使用命令重新启动journalctl

sudo systemctl restart systemd-journald

如果这对您不起作用,请将StandardOutput=syslog+console和添加StandardError=syslog+console到您的 systemd 脚本中并重新启动 systemctl。之后,您可以使用journalctl 访问设备的输出。

答案3

正如 JdeBP 试图暗示的那样,当您从 shell 运行程序并且它被信号 SIGFPE 杀死时,特定消息“浮点异常”将由您打印。从技术上讲你的程序可以如果你这样写的话,捕获信号并打印错误 - 但这对于 SIGKILL 不起作用。

你需要一些父进程使用wait()或类似的方法来读取程序的退出状态并记录它。服务经理systemd就是这样的家长。它的信息看起来并不相同,但它应该当您查看日志中的服务日志时,会有类似的内容。可能会提到SIGFPE

此外,如果您已systemd-coredump启用,它应该会记录 的崩溃消息SIGFPE,因为此信号的默认操作是生成核心转储。这些崩溃消息应该被标记,以便它们在查询服务的消息时显示。我喜欢systemd-coredump并确保在我的 Debian 系统上启用它,尽管目前安装它会删除 Ubuntu 上的崩溃报告程序 Apport。在开发时,有些人可能更喜欢直接处理核心文件而不是使用systemd-coredump,尽管核心转储不会弄乱您的目录是件好事,而且它们会在一段时间后被清理(释放磁盘空间)。

相关内容