如何为 systemd 日志创建日志条目?

How do I create a log entry for the systemd journal?

我有一个 service,我想让它在某些情况下为 journald 守护程序创建日志。到目前为止,我还没有找到任何关于如何操作的说明。

我是否误解了 journal 的预期用途?还是我确实遗漏了什么?

如果您有服务,您将您的日志写入标准错误。 (它甚至可以用作 C++ 中名为 std::clog 的流,比 std::cerr 具有更多 "log-like" 语义。)就是这样。它是一种与 systemd、daemontools、daemontools-encore、runit、s6、perp、nosh、freedt 等一起使用的日志记录机制。

有一个 API 用于写入 systemd 日志。但是,请确保您有充分的理由将您的软件和用户锁定到 API。写入标准错误是一种行之有效的机制,几乎无处不在。它很好理解,管理员也很容易控制、调整和理解。应该是首选。

进一步阅读

  • 乔纳森·德博因·波拉德 (2015)。 "Logging"。 daemontools 系列。经常给出的答案。
  • 乔纳森·德博因·波拉德 (2001)。 “Don't use `syslog().”。 设计 Unix 守护程序时要避免的错误。经常给出的答案。
  • 洛朗·贝尔科特 (2011)。 "The Logging Chain" s6-log 程序。 s6.
  • sd-journal。 Freedesktop.org.
  • https://superuser.com/a/868519/38062
  • What is the difference between cout, cerr, clog of iostream header in c++? When to use which one?

Lennart Poettering's blog shows how this is done 与 API 如果你想要这个功能,

#include <systemd/sd-journal.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
        sd_journal_send("MESSAGE=Hello World!",
                        "MESSAGE_ID=52fb62f99e2c49d89cfbf9d6de5e3555",
                        "PRIORITY=5",
                        "HOME=%s", getenv("HOME"),
                        "TERM=%s", getenv("TERM"),
                        "PAGE_SIZE=%li", sysconf(_SC_PAGESIZE),
                        "N_CPUS=%li", sysconf(_SC_NPROCESSORS_ONLN),
                        NULL);
        return 0;
}

请注意,使用 sd_journal_send 允许您向日志添加额外的字段,而不仅仅是 MESSAGE,并且它允许您更精细地控制 PRIORITY