searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

理解systemd-journald

2023-11-28 08:56:44
109
0

日志机制类型

日志文件是那些包含系统信息的文件,包括内核,服务以及运行在系统上的应用。不同的日志文件包含不同的信息,例如默认的系统日志文件messages,包含安全信息的日志文件secure,定制任务的日志文件cron。

目前共有三种不同的方式被日志服务使用进行日志信息的写入:

  • direct write:   有些服务将日志信息直接写入日志文件。
  • rsyslogd:         rsyslogd是syslogd的增强版进行日志文件的集中管理。,
  • journald:         随着systemd的引入,  journald日志服务systemd-journald也被引入,允许管理员从journal中读取详细信息。

传统syslogd守护进程

大部分 Linux系统以统一的方式通过一个特殊的守护进程去进行日志维护,这个传统的Linux守护进程就是 syslogd, 其来自一个称作syslogd的包。syslogd 守护进程处理服务器和用户模式程序之间的信息。它常常和klogd 守护进程成对出现,他们俩来自同一个软件包syslogd。Klogd负责管理内核信息。很多发行版使用rsyslogd,它是syslogd的加强版。提供了增强的日志过滤能力和更高的性能。

systemd-journald 和 rsyslogd对比

  • Journald 以一种安全方式提供结构化和可以索引的日志文件。因此不仅更容易搜索,而且对于系统入侵者很难掩盖他们的踪迹。你也可以通过结构化格式维护rsyslogd信息。
  • systemd-journald服务相较于传统日志daemon的另一个优势在于如果日志文件超过某一阈值可以自动rotate。这将减少日志的维护事宜和复杂性。
  • journalctl工具被用来读取二进制日志文件并且这个命令相当强大可以提供多种方式的日志过滤。

默认这两种日志工具同时存在于centos7和RHEL7系统中。

  • journald守护进程是主要的troubleshooting工具,它也提供了额外创建结构化日志数据的能力。
  • 被journald获取到的数据会被转发到/run/systemd/journal/syslog socket 接口,这个数据后续可能会被rsyslogd进一步处理。
  • 然而 rsyslog 通过imjournal输入模块做了实际的整合,因此避免前面提到的socket。

了解systemd journald

 systemd-journald 守护进程是一个系统服务,它将日志数据整合到一起并进行存储。Journal中的条目可能来自多个来源,包括服务器消息,用户层程序消息,syslogd收集的内核消息等。另外,journal条目也来自系统的服务信息,例如生成的错误信息或者启动时的信息。The systemd journal服务可以存储各种 journal 条目,而不管其大小,metadata或者格式。这些事件journal以二进制的形式存储并可以通过 journalctl 命令进行查询。

探索systemd-journald系统

三个主要的systemd journal 服务组件如下:

  • Daemon:systemd日志服务由  systemd-journald守护进程处理
  • Configuration file: journal 服务的配置文件/etc/systemd/journald.conf 
  • Search utility:journal 日志文件的搜索工具 journalctl.

如果删除system.journal文件会发生什么事情

假设 systemd-journald服务正在运行,任何时候journald都会将日志直接写入 system.journal文件。如果有人不小心将 system.journal 删除,将会丢失所有正在被写入的日志直到新日志产生,system.journal 文件将会自动生成用来写入日志。

如果systemd-journald 没有处于运行状态,你将丢失所有的日志。 即使 system.journal存在,由于 systemd-journald服务本身没有运行因此不会有日志通过journald被记录下来同时日志也不会被rsyslog收集。

这个文件将会被重新生成,当重启systemd-journald服务时。

不同的存储类型配置 

存储类型是在/etc/systemd/journald.conf 配置文件中配置的.,在 [Journal] 部分可以修改存储类型。支持的配置值包括 "volatile", "persistent", "auto" 和 "none"。

默认storage 类型为 "auto"

如果设置为 "volatile",journal的日志数据仅被保存在内存中,如/run/log/journal

如果设置为 "persistent",,数据将会保存在磁盘,如/var/log/journal,如果磁盘不可写入,早期启动日志将会退回到  /run/log/journal。

"auto" 会在 /var/log/journal/ 目录下存储journal日志。然而/var/log/journal/ 目录必须已经存在且有合适的权限值,如果目录不存在,journal数据将被保存在 /run/log/journal/ 目录,当系统被关闭的时候数据将被擦除。

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

查询systemd-journald的日志

systemd-journald 服务不会像rsyslog那样将日志保存在不同的日志文件中。为了避免因为issues问题检查不同的日志, systemd-journald以二进制的形式保存事件和信息,这些文件使用普通文件编辑器无法读取,可以通过 journalctl 命令进行查询。

展示所有的时间信息(类似于/var/log/messages):

 journalctl 展示最近的20条信息:

[server]$ journalctl -n 20

 

输出正在被写入journal的新日志条目:

[server]$ journalctl -f 

 

展示上次启动的内核消息日志:

[server]$ journalctl -k

 

基于critical priority进行信息查询:

[server]$ journalctl -p crit 

 

查询特定用户的所有信息:

[server]$ id sadminuid=1000(sadmin) gid=1000(sadmin) groups=1000(sadmin)

[server]$journalctl _UID=1000

 

查询今天的日志信息:

[server]$ journalctl --since today

 

查询特定unit的日志:

[server]$ journalctl -u sshd

 

检查过去一小时关于httpd服务的相关日志:

[server]$ journalctl -u httpd –since "1 hour ago"

 

0条评论
0 / 1000
s****n
3文章数
0粉丝数
s****n
3 文章 | 0 粉丝