了解systemd-journald以及日志如何与RHEL 7中的Journal一起使用

时间:2020-02-23 14:40:34  来源:igfitidea点击:

在本文中,我将向我们概述systemd-journald服务,Journal Logfiles的systemd-journald logrotate功能,并简要比较systemd-journald与rsyslod。
本文的不同部分将介绍以下主题

  • 日志记录如何与日记文件和systemd-journaldlogrotate一起使用

  • journald的自动和永久存储类型之间有什么区别

  • 如何执行日记日志的日志轮换

  • Systemd-Journald和Rsyslogd

  • journald.conf中的RuntimeMaxUse和SystemMaxUse之间的区别

  • 哪个值在" RuntimeMaxUse"和" RuntimeKeepFree"之间,或者在" journald.conf"中的" SystemMaxUse"和" SystemKeepFree"之间优先

日志记录机制的类型

日志文件是包含有关系统的消息的文件,包括系统上运行的内核,服务和应用程序。
有用于不同信息的不同日志文件。
例如,有一个默认的系统日志文件,一个仅用于安全消息的日志文件和一个用于cron任务的日志文件。

现在,服务可以使用三种不同的方法来写入日志信息:

  • 直接写入:一些服务将日志信息直接写入日志文件,甚至一些重要的服务,例如Apache Web服务器和Samba文件服务器。

  • rsyslogd:rsyslogd是syslogd的增强功能,该服务负责管理集中式日志文件。
    Syslogd已经存在很长时间了。

  • journald:随着systemd的引入,日志日志服务systemd-journald也被引入。
    该服务与systemd紧密集成,允许管理员从日志中读取详细信息,同时使用systemctl status命令监视服务状态。

传统的syslogd守护程序

大多数Linux系统采用特殊的守护程序以统一的方式处理日志维护。
传统的Linux守护程序日志管理器是syslogd,通常是从名为sysklogd的软件包中安装的。
syslogd守护程序处理来自服务器和其他用户模式程序的消息。
它通常与名为klogd的守护程序配对,该守护程序通常与syslogd使用相同的软件包安装。
klogd守护程序管理内核消息的日志记录。

存在系统记录器的其他选择。
例如,syslog-ng是支持高级选项的替代品。
许多发行版使用rsyslogd,它提供了改进的过滤功能和更高的性能。

systemd-journald和rsyslogd

  • 日志记录以安全的方式提供结构和索引日志文件(称为日志)。
    因此,不仅日志文件更容易搜索,而且系统入侵者很难掩盖它们的踪迹。
    我们还可以以结构化格式维护rsyslog消息。

  • 与传统的日志记录守护程序相比,使用systemd-journald服务的另一个优点是,如果日志文件超过一定限制,它们将自动旋转。
    这减少了日志文件维护问题和复杂性。

  • journalctl实用程序用于读取日志二进制日志文件,此命令提供了几种过滤数据的方法,该方法非常强大。

默认情况下,这两个日志记录工具共存于RHEL 7系统上。

  • 带日志记录的守护程序是进行故障排除的主要工具。
    它还提供了创建结构化日志消息所需的其他数据。

  • 通过日志记录获取的数据被转发到/run/systemd/journal/syslog套接字,rsyslogd可以使用该套接字进一步处理数据。

  • 但是,rsyslog默认通过" imjournal"输入模块进行实际的集成,从而避免了上述套接字。

# grep imjournal /etc/rsyslog.conf
$ModLoad imjournal # provides access to the systemd journal
# local messages are retrieved through imjournal now.
$IMJournalStateFile imjournal.state

提示:

我们还可以使用omjournal模块从rsyslogd向journald反向传输数据

了解系统日志

systemd-journald守护程序是一项系统服务,它汇集并存储日志记录数据。
日记帐分录可能来自多个来源。
日志条目是根据服务器消息,用户模式程序消息和内核消息创建的,就像syslogd守护程序收集的消息一样。
但是,此外,日记帐分录是从所有系统服务消息创建的,例如生成的错误消息和引导时间通信。
系统日记帐服务可以存储日记帐分录,无论其大小,元数据或者格式如何。

该事件日志以二进制格式存储,可以使用" journalctl"命令进行查询。

我们可以根据日志存储类型,在/run/log/journal或者/var/log/journal下检查这些二进制日志文件,如下所示

# ls -l /run/log/journal/9bf0fc6f60ce41149a0a540f52db9773/
total 57600
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:57 system@e6620ce9c60b4b9387ed5e5bb507638a-000000000014f164-000591c86adda67c.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:57 system@e6620ce9c60b4b9387ed5e5bb507638a-00000000001501fe-000591c86b188161.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:57 system@e6620ce9c60b4b9387ed5e5bb507638a-0000000000151299-000591c86b43bdd0.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:57 system@e6620ce9c60b4b9387ed5e5bb507638a-0000000000152332-000591c86b7e948f.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:57 system@e6620ce9c60b4b9387ed5e5bb507638a-00000000001533cd-000591c86ba9d162.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:57 system@e6620ce9c60b4b9387ed5e5bb507638a-0000000000154466-000591c86bd50274.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:57 system@e6620ce9c60b4b9387ed5e5bb507638a-0000000000155500-000591c86c0fdb78.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 11:58 system@e6620ce9c60b4b9387ed5e5bb507638a-0000000000156591-000591c86c3add8d.journal
-rw-r-----+ 1 root systemd-journal 6553600 Sep  5 12:10 system.journal

systemd-journald系统

这里描述了三个主要的系统化日记服务组件:

  • 守护进程:systemd日记服务由systemd-journald守护进程处理。

  • 配置文件:日志服务的配置在/etc/systemd/journald.conf文件中设置。

  • 搜索工具:用于搜索日志日志文件的程序是journalctl。

如果删除system.journal文件会怎样?

假设" systemd-journald"服务正在运行,则" system.journal"文件将是当前文件,日志记录将在任何时间直接直接写入日志。
如果偶然有人意外删除了" system.journal",那么我们将丢失所有当前"正在写入"的日志,一旦生成新日志,就会自动创建" system.journal"文件来写入日志。

如果" systemd-journald"服务未处于运行状态,那么我们将丢失日志。
即使存在" system.journal"但服务本身未运行,日志记录也不会记录日志,rsyslog也不会收集日志。

重新启动服务后,将重新生成此文件。

journald.conf支持的不同类型的存储

  • 存储类型的值由/etc/systemd/journald.conf文件控制。
    Journal下,我们可以修改存储类型。

  • 支持的值为" volatile"," persistent"," auto"和" none"

  • 默认存储类型配置为"自动"

  • 如果为volatile,则日志日志数据将仅存储在内存中,即在/run/log/journal层次结构下(如果需要创建)

  • 如果是永久性的,则数据将最好存储在磁盘上,即,在/var/log/journal层次结构之下,并在早期引导阶段回退到/run/log/journal并且如果磁盘不可写

  • 自动值将配置" journald"以将日志日志数据存储在"/var/log/journal /"目录中。

但是,该目录必须已经存在并且设置了适当的权限。
如果不存在,则日记数据将存储在易失性的/run/log/journal /目录中,并且在系统关闭时会删除这些数据。

  • none将关闭所有存储,所有接收到的日志数据将被丢弃。

对日志文件执行systemd-journald logrotate

日志日志文件的systemd-journaldlogrotate将基于以下值执行

SystemMaxUse=
SystemKeepFree=
RuntimeMaxUse=
RuntimeKeepFree=
MaxFileSec=

其中

  • RuntimeMaxUse/SystemMaxUse =控制日志最大可使用多少磁盘空间,之后将对日志文件执行systemd-journald logrotate。
    默认为分配给节点的总物理内存的10%

  • RuntimeKeepFree/SystemKeepFree =控制systemd-journald将为其他用途保留多少磁盘空间,之后将对日志文件执行systemd-journald logrotate。
    默认为分配给节点的总物理内存的15%

systemd-journald的logrotate将同时遵守这两个限制,并使用两个值中的较小者。

  • 如果文件系统几乎已满,并且在启动" systemd-journald"时违反了" SystemKeepFree ="或者" RuntimeKeepFree =",则限制将提高到实际可用的百分比。

  • 这意味着,如果在创建日记文件之前有足够的可用空间,并且随后其他原因导致文件系统填满,则" journald"将停止使用更多空间,但不会"删除"现有文件以减少文件空间。
    再次占用空间,即不执行systemd-journald logrotate

  • 另请注意,system-journald logrotate仅删除归档文件,以减少日志文件占用的空间。
    实际上,这意味着在systemd-journald logrotate完成日志日志文件的清理操作之后,仍然可能使用的空间超过了SystemMaxUse =或者RuntimeMaxUse =限制。

如果我们检查" systemd-journald"的状态,那么我们可以看到它报告了"日志已被轮换"。

# systemctl status systemd-journald
● systemd-journald.service - Journal Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static; vendor preset: disabled)
   Active: active (running) since Thu 2019-09-05 15:03:38 IST; 19h ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 29141 (systemd-journal)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-journald.service
           └─29141 /usr/lib/systemd/systemd-journald
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.