《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 域套接字。
日志等级
无论哪种日志系统,它们都统一使用以下分类来区分日志内容的严重等级:
- emerg:紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。
- alert:需要立即修复,例如系统数据库损坏。
- crit:危险情况,例如硬盘错误,可能会阻碍程序的部分功能。
- err:一般错误消息。
- warning:警告。
- notice:通知。
- info:信息。
- 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 收集和存放日志过程如下图:
- 软件可以使用 syslog() 函数将日志写到 /dev/log 设备。
- systemd-journald 监听 /dev/log 设备并获取日志内容,systemd-journald 也可直接获取软件服务通过 stdout/stderr 输出的内容,或者从 /dev/kmsg 获取内核日志。
- 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