RHEL - systemd-journald 和 rsyslog 日志系统

OpenShift / RHEL / DevSecOps 汇总目录

RHEL 中的日志系统

两种日志系统

rsyslog 和 systemd-journald 是 RHEL 支持的两种不同的日志系统。

  • 在 RHEL 6 中使用的是 rsyslog 日志系统,由 rsyslog 读取所有放入 /dev/log 中的日志。
  • 在 RHEL 7/8/9 中使用的是 systemd-journald 日志系统,由 systemd-journald 读取所有放入 /dev/log 中的日志。另外,在 RHEL 7/8/9 中还可以继续使用 rsyslog,且 systemd-journald 可配合 rsyslog 使用,也可单独使用。

执行以下命令,验证 rsyslog 和 systemd-journald 可以接收测试日志。

$ logger test logs 					# 生产 test 日志
$ journalctl -f						# 查看有 systemd-journald  管理的日志
$ tail -f /var/log/messages			# 查看有 rsyslog 管理的日志

两种日志系统包含以下相关概念:

  • systemd-journald:一种 systemd 服务,用于收集日志数据并将其存储到日志文件中,可简称为 journald。
  • journal:被 systemd-journald 使用的一组文件的集合,在 /run/log/journal 目录下,其中包含以二进制格式存储的日志。
  • rsyslog:一个 syslog 守护进程。
  • syslog:一种用于发送/接收日志消息的标准协议。
  • /dev/log:syslog 的 Unix 域套接字。
    在这里插入图片描述

日志等级

无论哪种日志系统,它们都统一使用以下分类来区分日志内容的严重等级:

  1. emerg:紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。
  2. alert:需要立即修复,例如系统数据库损坏。
  3. crit:危险情况,例如硬盘错误,可能会阻碍程序的部分功能。
  4. err:一般错误消息。
  5. warning:警告。
  6. notice:通知。
  7. info:信息。
  8. debug:调试程序产生的信息。

systemd-journald 日志系统

systemd-journald 是 systemd 中的一个组件,它提供系统级的日志服务,它捕获系统启动日志、内核日志、系统服务日志、用户进程日志、安全相关日志,并提供更高效、更灵活的日志管理功能。

systemd-journald 设计理念是避免检查不同文件以排查问题,它是将日志以二进制格式保存。由于它不会像 rsyslog 那样保存多个单独的日志文件,因此无法通过文本编辑器直接读取日志,而需要使用 journalctl 命令来查询日志。

以下命令可以查看 systemd-journald 服务的运行状态:

$ systemctl status systemd-journald

可以使用 journalctl 命令来管理和查询 systemd-journald 收集的日志。常用命令包括:

journalctl --list-boots		# 显示系统启动记录	
journalctl -b 				# 查看上一次启动后所有日志
journalctl -k				# 查看kernel日志
journalctl -u httpd 		# 查看指定服务的日志
journalctl -p priority		# 查看指定等级的日志,debug(7), info(6), notice(5), warning(4), err(3), crit(2), alert(1),  emerg(0)
journalctl -p 3 -x			# 对错误日志进行解释说明
journalctl --since="2024-10-16 23:59:59" --until="2024-12-16 23:59:59"	# 查看指定时间范围的日志
journalctl -n 20			# 查看最新 20 行日志
journalctl -f				# 持续输出最新日志
journalctl --disk-usage		# 查看所有订阅文件占用磁盘空间

工作原理

systemd-journald 收集和存放日志过程如下图:

  1. 软件可以使用 syslog() 函数将日志写到 /dev/log 设备。
  2. systemd-journald 监听 /dev/log 设备并获取日志内容,systemd-journald 也可直接获取软件服务通过 stdout/stderr 输出的内容,或者从 /dev/kmsg 获取内核日志。
  3. systemd-journald 将日志内容保存到 journal 中。journal 日志文件格式是结构化、索引化的二进制文件,改进了搜索速度和速度,还存储了时间戳或用户 ID 等元数据信息。默认情况下,journald 生成的日志文件不是永久的,日志文件仅存储在内存中或 /run/log/journal/ 目录中的小型 ring-buffer 中。记录的数据量取决于可用内存,当您达到容量限制时,会删除最旧的条目。当需要将日志持久化到磁盘时,它会将二进制格式的日志数据写入到磁盘文件中。同时它会不断更新日志索引,以保证能够快速查询日志。
    在这里插入图片描述

配置文件

通过修改 /etc/systemd/journald.conf 文件可以对 systemd-journald 的行为进行配置。主要的配置项有:

  • Storage= 指定日志的存储方式,支持以下几种:
    volatile: 仅存储在内存中 (/run/log/journal)
    persistent: 优先存储在磁盘上 (/var/log/journal),如果不可用则回退到内存
    auto: 如果 /var/log/journal 目录存在则使用 persistent,否则使用 volatile
    none: 关闭所有存储,仅转发日志
  • ForwardToSyslog= 配置是否将接收到的日志消息转发给传统的 syslog 守护进程,默认值为"no"。 如果设为"yes",但是没有任何进程监听对应的套接字,那么这种转发是无意义的。 此选项可以被内核引导选项 “systemd.journald.forward_to_syslog=” 覆盖。
  • ForwardToKMsg= 表示是否将接收到的日志消息转发给内核日志缓冲区(kmsg),默认值为"no"。 此选项可以被内核引导选项 “systemd.journald.forward_to_kmsg=” 覆盖。
  • ForwardToConsole= 表示是否将接收到的日志消息转发给系统控制台,默认值为"no"。 如果设为"yes",那么可以通过下面的 TTYPath= 指定转发目标。 此选项可以被内核引导选项 “systemd.journald.forward_to_console=” 覆盖。
  • ForwardToWall= 表示是否将接收到的日志消息作为警告信息发送给所有已登录用户,默认值为"yes"。
  • MaxLevelStore= 设置记录到日志存储中的最高日志等级,默认值为"debug"。
  • MaxLevelSyslog= 设置转发给传统的 syslog 守护进程的最高日志等级,默认值为"debug"。
  • MaxLevelKMsg= 设置转发给内核日志缓冲区(kmsg)的最高日志等级,默认值为"notice"。
  • MaxLevelConsole= 设置转发给系统控制台的最高日志等级,默认值为"info"。
  • MaxLevelWall= 设置作为警告信息发送给所有已登录用户的最高日志等级,默认值为"emerg";

systemd-journald 与 rsyslog 的关系

默认情况,在 RHEL7/8/9 中 systemd-journald 与 rsyslog 两个日志体系是共存的,且 rsyslog 通过 imjournal 模块从 journal 中获取到日志。这种方法只有当日志消息存储到 journal 文件中时才能使用。因此如果在 journald.conf 中设置了 “Storage=none”,该方法将不起作用。

另一种集成方法是 systemd-journald 将获取的日志转发到 /run/systemd/journal/syslog 套接字,然后 rsyslog 使用该套接字进一步处理接收到的日志数据。这种方法由 journald.conf 中的 ForwardToSyslog=yes 选项控制,并且需要 rsyslog 结合 imuxsock 模块使用。

在这里插入图片描述

rsyslog 日志系统

rsyslog 用于收集、过滤、转换和存储系统的日志。rsyslog 全称为 “Rocket-fast syslog”,它是传统 syslog 的增强版本,支持多线程、模块化设计、结构化日志、加密传输等高级特性。

在 RHEL 7/8/9 中,rsyslog 缺省是通过 imjournal 模块从 journal 获得日志的。rsyslog 使用 omfile 模块将日志保存在 /var/log 目录下对应文件中,此外还可以使用 omfwd 模块将 rsyslog 收到的日志通过 TCP/UDP 转发到远程服务器,从而可实现日志集中管理。

/var/log 中包含各种日志文件,其中主要有:

  • /var/log/boot.log:录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息
  • /var/log/cron:用来记录crontab这个服务执行任务计划产生的日志
  • /var/log/dmesg:系统启动时的内核消息,包含了硬件检测、设备初始化、驱动加载等信息
  • /var/log/messages :记录Linux操作系统常见的系统和服务错误信息
  • /var/log/secure :Linux系统安全日志,记录用户和工作组变坏情况、用户登陆认证情况
  • /var/log/sa/saXX:系统监控数据

可以执行以下命令查看 rsyslog 服务状态和校验配置文件 /etc/rsyslog.conf 的有效性。

$ systemctl status rsyslog						# 查看 rsyslog 服务状态

$ lsof /var/log/messages						# 查看访问 /var/log/messages 文件的进程
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
rsyslogd 1037 root    6w   REG  253,0   623339 134400414 /var/log/messages
 
$ rsyslogd -f /etc/rsyslog.conf -N 1			# 验证 rsyslog 的配置文件 rsyslog.conf

参考

https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html
https://access.redhat.com/articles/7075842
https://access.redhat.com/articles/4058681
https://access.redhat.com/solutions/2140041
https://access.redhat.com/solutions/5979081
https://access.redhat.com/articles/4058681
https://sean10.github.io/2018/08/02/rsyslog-journald%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F%E7%BB%93%E6%9E%84/
https://wdd.js.org/posts/2022/10/linux-journal/
https://www.redhat.com/en/blog/rsyslog-systemd-journald-linux-logs
https://www.redhat.com/en/blog/setting-logrotate
https://www.redhat.com/en/blog/log-aggregation-rsyslog
https://blog.youkuaiyun.com/jikunbupt/article/details/102697062
https://eisenhao.cn:8443/2021/08/24/SyslogSelfDiagnosisAndCommonProblems/
https://serverfault.com/questions/959982/is-rsyslog-redundant-on-when-using-journald
https://bbs.archlinux.org/viewtopic.php?id=193879

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值