systemd-journald.service 中文手册

译者:金步国


版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。


手册索引 . 指令索引systemd-231

名称

systemd-journald.service, systemd-journald.socket, systemd-journald-dev-log.socket, systemd-journald-audit.socket, systemd-journald — 日志服务

大纲

systemd-journald.service

systemd-journald.socket

systemd-journald-dev-log.socket

systemd-journald-audit.socket

/usr/lib/systemd/systemd-journald

描述

systemd-journald 是一个收集并存储各类日志数据的系统服务。 它创建并维护一个带有索引的、结构化的日志数据库, 并可以收集来自各种不同渠道的日志:

  • 通过 kmsg 收集内核日志

  • 通过libc的 syslog(3) 接口收集系统日志

  • 通过本地日志接口 sd_journal_print(4) 收集结构化的系统日志

  • 捕获系统服务的标准输出(STDOUT)与标准错误(STDERR)

  • 通过审计子系统收集审计记录

日志守护进程会以安全且不可伪造的方式自动收集每条日志的元数据。参见 systemd.journal-fields(7) 以了解究竟收集了哪些元数据。

收集到的大部分日志数据都是文本数据, 但同样也可以收集二进制数据。 所有存储在日志中的对象总上限为16ZB(16*1024*1024TB)。

因为日志默认存储在 /run/log/journal/ 目录中,而 /run/ 位于内存中,其中的数据会在系统重启后丢失。 所以,要想永久保存日志数据, /var/log/journal/ 目录必须存在且对 systemd-journald 进程可写:

mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal

详见 journald.conf(5) 以了解如何配置此日志服务。

信号

SIGUSR1

要求将 /run/ 中的日志数据刷写到 /var/ 中(若存在且可写入), 并等待其完成,以确保被永久保存。这通常是挂载 /var/ 之后的必要动作, 否则 /run 中的日志数据永远也不会被刷写到 /var 中(无论配置文件怎样设置)。 journalctl --flush 命令就是使用这个信号的典型例子。 详见 journalctl(1) 手册。

SIGUSR2

要求立即滚动日志,并等待其完成。 journalctl --rotate 命令就是使用这个信号的典型例子。

SIGRTMIN+1

要求将所有缓存中的日志刷写到磁盘上,并等待其完成。 journalctl --sync 命令就是使用这个信号的典型例子。

内核引导选项

一些 journald.conf 中的配置参数可以被内核引导选项覆盖, 具体说来就是:

systemd.journald.forward_to_syslog=, systemd.journald.forward_to_kmsg=, systemd.journald.forward_to_console=, systemd.journald.forward_to_wall=

允许/禁止将收集到的日志: 转发到传统的 syslog 守护进程, 转发到内核日志缓冲区, 转发到系统控制台, 作为wall警告信息转发给所有已登录的用户

详见 journald.conf(5) 手册。

访问控制

日志文件默认属于root用户及 "systemd-journal" 组,权限为"640", 也就是仅对root用户可读写、仅对 "systemd-journal" 组可读。 若想允许某用户读取日志,可将其加入到 "systemd-journal" 组中。

默认情况下,每个已登录用户都在 /var/log/journal/ 中拥有自己专属的日志文件, 但是这些专属日志文件的属主依然是root用户。 这样做的目的在于:在禁止用户修改日志的同时, 又可以通过文件系统的访问控制列表(ACL)赋予用户对日志的只读权限。

还可以通过文件系统的访问控制列表(ACL) 将日志的访问权限赋予特定的用户、组。 例如,下面的命令就赋予了 "wheel" 与 "adm" 组的所有用户读取日志的权限:

# setfacl -Rnm g:wheel:rx,d:g:wheel:rx,g:adm:rx,d:g:adm:rx /var/log/journal/

注意,此命令不但更新了 /var/log/journal/ 目录中已有日志文件的访问控制列表(ACL), 而且对未来创建的日志文件也有效。

文件

/etc/systemd/journald.conf

配置 systemd-journald 守护进程的行为,详见 journald.conf(5) 手册。

/run/log/journal/machine-id/*.journal, /run/log/journal/machine-id/*.journal~, /var/log/journal/machine-id/*.journal, /var/log/journal/machine-id/*.journal~

systemd-journald 将日志文件存放在 /run/log/journal/machine-id//var/log/journal/machine-id/ 目录中,并用 ".journal" 作为日志文件的后缀名。 如果守护进程未能干净的退出或者日志文件未能通过正确性检查, 那么当前日志文件的后缀名将会被重命名为 ".journal~" , 同时 systemd-journald 将会从一个全新的日志文件开始记录。 仅在下列两种情况下,才会使用 /run 目录记录日志文件: (1)当 /var/log/journal 目录不可用时; (2)在 journald.conf(5) 配置文件中明确设置了 Storage=volatile 时。

/dev/kmsg, /dev/log, /run/systemd/journal/dev-log, /run/systemd/journal/socket, /run/systemd/journal/stdout

systemd-journald 除了监听上述文件, 还通过 netlink 监听审计系统事件。

参见

systemd(1), journalctl(1), journald.conf(5), systemd.journal-fields(7), sd-journal(3), systemd-coredump(8), setfacl(1), sd_journal_print(4), pydoc systemd.journal