Ubuntu 16.04 上 rsyslog 和 journald 的关系

Ubuntu 16.04 上 rsyslog 和 journald 的关系

我正在运行一个原始的 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

我的问题是:

  1. 在 Ubuntu 16.04 上 journald 和 rsyslog 究竟如何协同工作(默认情况下)?
  2. 为什么发送的消息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。

根据您的需要对配置进行更改。

相关内容