我正在运行一个原始的 Ubuntu 16.04 服务器,我正在尝试弄清楚默认情况下日志记录是如何设置的。我可以看到和都已journald
安装rsyslog
并正在运行,但我完全不清楚日志消息是如何处理的。
大多数消息似乎都显示在/var/log/syslog
和 通过中journalctl
,但我看不到任何在/etc/systemd/journald.conf
(基本上默认情况下全部被注释掉)/etc/rsyslog.conf
或中在两者之间转发的明确配置/etc/rsyslog.d/50-default.conf
。我试图寻找官方文档,甚至是一篇博客文章来解释如何在 Ubuntu 中设置这两个,但什么也没找到。
更让我困惑的是,我logger -p local1.info Test
在主机上执行了,发现没有任何内容写入/var/log/syslog
,而消息确实出现在下journalctl
。
我的问题是:
- 在 Ubuntu 16.04 上 journald 和 rsyslog 究竟如何协同工作(默认情况下)?
为什么发送的消息logger
似乎出现在日志中,但却没有出现在系统日志中?
更新:事实证明,logger
没有按预期工作是我的一个错误,所以它与主要问题无关。
答案1
默认rsyslog
使用“imuxsock”模块,该模块提供:
通过本地 Unix 套接字接受 syslog 消息的能力。最重要的是,这是 syslog(3) 调用将 syslog 消息传递给 rsyslogd 的机制[1]。
可以rsyslog
使用名为“imjournal”的模块从 systemd-journal 导入结构化日志消息[2]。
它可以像这样加载:
module(load="imjournal")
在:
/etc/rsyslog.conf
另一方面,“systemd-journald”本身捕获所有数据:
man systemd-journald
systemd-journald 是一种收集和存储日志数据的系统服务。它根据从各种来源收到的日志信息创建和维护结构化的索引日志:
· Kernel log messages, via kmsg · Simple system log messages, via the libc syslog(3) call · Structured system log messages via the native Journal API, see sd_journal_print(4) · Standard output and standard error of system services · Audit records, via the audit subsystem
您可以rsyslogd
在仍能访问系统日志的情况下禁用它journalctl
。
$ sudo systemctl mask rsyslogd
$ sudo systemctl stop syslog.socket
$ sudo systemctl stop rsyslog.service
$ systemctl is-active rsyslog.service
inactive
$ logger -p mail.info Helllooo
$ journalctl
例如,centos 使用“imuxsock”模块捕获所有“systemd-journald”数据,rsyslog
而 opensuse 根本没有“syslog”。
要找出为什么您的消息没有到达/var/log/syslog
,您应该检查此文件:
less /etc/rsyslog.d/50-default.conf
查找*.info
,查看它们将被存储在哪里,它可能是类似的其他文件messages
。
对我来说,它同时出现在journalctl
和中syslog
。
答案2
Systemd 是用于在系统启动时启动服务的初始化系统。Journald 负责为 systemd 启动的服务生成日志。通过将 journald 与 systemd 集成,即使是最早的启动过程消息也可供 journald 使用。
Rsyslog 是一个专门用于日志处理的守护进程,与 journald 无关。它可以通过多种方式接收日志并以多种方式输出。默认情况下,它不会也从 journald 接收日志消息。为此,您必须在 /etc/rsyslog.conf 文件中写入,
$ModLoad imjournal # im -> input module
OR
load(type="imjournal")
现在,它还将接受来自 journald 的日志。但我建议您不要更改 /etc/rsyslog.conf 文件。
在 /etc/rsyslog.conf 文件的末尾,有一行写着,
$IncludeConfig /etc/rsyslog.d/*.conf
这意味着 /etc/rsyslog.d/ 文件夹中所有以 .conf 结尾的文件都应在 rsyslog 加载期间包含在内。因此,所有自定义配置都应放在这些文件中
我建议您创建一个文件 /etc/rsyslog.d/journald.conf 并将以下代码片段粘贴到其中。
以下是 imjournal rsyslog 官方页面的片段
module(load="imjournal" PersistStateInterval="100"
StateFile="/path/to/file") #load imjournal module
module(load="mmjsonparse") #load mmjsonparse module for structured logs
template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n" ) #template for messages
action(type="mmjsonparse")
action(type="omfile" file="/var/log/ceelog" template="CEETemplate")
第 1 行 - 加载 imjournal 模块以接受来自 journald 的日志
2 - 加载 mmjsonparse 模块用于解析日志
3 - 它们被构造成模板中描述的格式
4 – 它使用 mmjsonparse 模块解析这些日志。
5 – 它根据给定模板中提供的结构,使用 omfile(输出模块文件 - 输出到文件)模块将这些日志发送到文件 /var/log/ceelog。
根据您的需要对配置进行更改。