在 Ubuntu 18.04 上,安装了 journald 和 rsyslog。两者的用途相同,即收集并存储日志消息。因此,我们在这里有两个程序执行相同的工作。
我发现 journald 只将日志消息保存在自己的日志文件中,可以使用命令查询journalctl
。没有写入可读文件。此外,journal 将始终收集 systemd 启动的所有服务的日志输出,这些服务应该始终是所有服务,因为最终 systemd 会启动所有进程,即使是从 init 脚本等较旧的方案启动。
Rsyslog 还通过一些套接字接收日志消息,这些套接字的工作方式与 syslog 过去 50 年的工作方式类似。应用程序必须将其消息发送到该套接字,然后 rsyslog 才会接收它们。不确定 journald 实际上是如何接收任何内容的。然后 rsyslog 根据其配置将这些接收到的消息转发到不同的可读文件中。
在 Ubuntu 中,两者都已安装但似乎没有联系。至少 rsyslog 不会加载“imjournal”模块,它可以使用该模块从 journald“读取”日志消息。我不明白 rsyslog 如何(主动)读取任何内容,我认为它只是(被动)接收消息。但它无论如何都没有使用它。
文件 /var/log/syslog 包含的内容与 大致相同,只是文件中缺少 的journalctl
输出。但我还没有对所有内容进行比较。sudo
那么这是如何工作的呢?谁将日志消息发送到哪里,谁接收它们,它们被转发到哪里?如果两个目的地都已填满,每个应用程序是否都必须分别向 syslog 和 journald 发送消息?如果它们是互连的,为什么没有重复的消息?它们是否再次被过滤掉了?哪个位置更完整,如果我想要完整的画面,我应该在哪里查看?
如果在 Ubuntu 的新版本中这些方面有所改变,我也会感兴趣,因为我明年要将旧服务器切换至 20.04。
编辑:以下是有关该主题的更多资源:
- [Rsyslog 和 Journal 的交互 (Red Hat 系统管理员指南)](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-viewing_and_managing_log_files#s1-interaction_of_rsyslog_and_journal
- imjournal(rsyslog 文档)
- rsyslog 日志集成,rsyslog 作者的视频演示
- syslog 系统调用
- 与 systemd 共存(rsyslog 文档)
所有这些信息让我有点困惑。似乎 journal 首先从系统调用接收所有 syslog 数据(我的 /dev/log 指向 /run/systemd/journal/dev-log),然后 rsyslog 通过一个套接字从 journal 中获取数据,该套接字看起来像 journal 出现之前使用的套接字(可能是 /run/systemd/journal/syslog,如果看到 systemd 则隐式使用)。然后 rsyslog 可以执行其所有高级日志处理(包括写入遗留的 /var/log 文件)。如果我不需要任何这些魔法,我可能会禁用 rsyslog。但我对此完全不确定!
答案1
消息存储位置
journald 消息存储
当需要清理旧消息时journald
(我每个月都会清理一次),您可以看到存储消息的文件:
Deleted archived journal /var/log/journal/1ff17e6df1874fb3b2a75e669fa978f1/[email protected]~ (32.0M).
Deleted archived journal /var/log/journal/1ff17e6df1874fb3b2a75e669fa978f1/[email protected]~ (8.0M).
正如您所见,文件名非常长且难以理解。
系统日志消息存储
syslog
消息保存在更传统的文件名格式中:
$ ll /var/log/syslog*
-rw-r----- 1 syslog adm 2161 Nov 29 04:47 /var/log/syslog
-rw-r----- 1 syslog adm 159700 Nov 29 04:32 /var/log/syslog.1
-rw-r----- 1 syslog adm 24466 Nov 28 04:27 /var/log/syslog.2.gz
-rw-r----- 1 syslog adm 23489 Nov 27 04:30 /var/log/syslog.3.gz
-rw-r----- 1 syslog adm 28087 Nov 26 04:28 /var/log/syslog.4.gz
-rw-r----- 1 syslog adm 28300 Nov 25 04:30 /var/log/syslog.5.gz
-rw-r----- 1 syslog adm 27445 Nov 24 05:36 /var/log/syslog.6.gz
-rw-r----- 1 syslog adm 27460 Nov 23 08:25 /var/log/syslog.7.gz
以 结尾的文件名.gz
包含压缩数据,以节省磁盘空间。
记录的消息不一样
快速测试表明,这两个消息记录系统并不完全相同。我们将使用命令将一条消息放入系统中logger
,然后搜索并显示它之前的五行。
$ logger $0 "ygoe to two logs?"
$ cat /var/log/syslog | grep ygoe -a5 Nov 27 20:53:35 alien upowerd[2032]: message repeated 3 times: [ (upowerd:2032): UPower-Linux-WARNING **: treating change event as add on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.2/0003:046D:C52B.017E/0003:046D:101A.017F/power_supply/hidpp_battery_63] Nov 27 20:54:23 alien upowerd[2032]: (upowerd:2032): UPower-Linux-WARNING **: treating change event as add on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.2/0003:046D:C52B.017E/0003:046D:2010.0180/power_supply/hidpp_battery_64 Nov 27 20:59:25 alien wpa_supplicant[1591]: wlp60s0: WPA: Group rekeying completed with ae:20:2e:cc:94:50 [GTK=CCMP] Nov 27 21:00:02 alien CRON[24890]: (root) CMD (/usr/bin/updatedb) Nov 27 21:07:48 alien upowerd[2032]: (upowerd:2032): UPower-Linux-WARNING **: treating change event as add on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.2/0003:046D:C52B.017E/0003:046D:2010.0180/power_supply/hidpp_battery_64 Nov 27 21:08:22 alien rick: bash ygoe to two logs?
$ journalctl -xe | grep ygoe -a5 Nov 27 20:59:25 alien wpa_supplicant[1591]: wlp60s0: WPA: Group rekeying completed with ae:20:2e:cc:94:50 [GTK=CCMP] Nov 27 21:00:01 alien CRON[24881]: pam_unix(cron:session): session opened for user root by (uid=0) Nov 27 21:00:01 alien CRON[24890]: (root) CMD (/usr/bin/updatedb) Nov 27 21:00:04 alien CRON[24881]: pam_unix(cron:session): session closed for user root Nov 27 21:07:48 alien upowerd[2032]: (upowerd:2032): UPower-Linux-WARNING **: treating change event as add on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.2/0003:046D:C52B.017E/0003:046D:2010.0180/power_supply/hidpp_battery_64 Nov 27 21:08:22 alien rick[8000]: bash ygoe to two logs?
如您所见,journalctl
提供了比 更多的详情syslog
。此外journalctl
:
- 让您更好地控制搜索。
- 提供更快的多启动日志访问(一旦启用它:Ubuntu 16.04+ 重启后如何查找以前的启动日志?)
- 控制日志大小的更多选项:Systemd 日志(`journalctl`)太大且速度慢
然而几年前开发人员之间就重复journald
问题存在争论,现在我却找不到链接。syslog
答案2
日志守护进程收集除内核消息之外的所有消息,并通过套接字将它们转发到 rsyslog /run/systemd/journal/syslog
。内核消息由 rsyslog 直接读取。
引用编写与 systemd 良好协作的 syslog 守护进程
systemd 将所有日志流集中在日志守护进程中。通过 /dev/log、通过本机协议、通过所有服务的 STDOUT/STDERR 以及通过内核传入的消息均在日志守护进程中接收。然后,日志守护进程将它们存储到磁盘或 RAM 中(取决于 journald.conf 中 Storage= 选项的配置),并可选择将它们转发到控制台、内核日志缓冲区或经典的 BSD syslog 守护进程
引用套接字的处理
如果 rsyslog 在 systemd 下运行并且
/run/systemd/journal/syslog
存在,(并且用户没有明确设置SysSock.Use="off"
)那么默认的监听器套接字名称将被覆盖/run/systemd/journal/syslog
。