rsyslog 和 journald 在 Ubuntu 16.04 上的关系

mot*_*tns 26 server logging rsyslog 16.04 systemd-journald

我正在运行什么是 vanilla Ubuntu 16.04 服务器,并且我正在尝试了解默认情况下如何设置日志记录。我可以看到journaldrsyslog都已安装并正在运行,但我完全不清楚日志消息是如何处理的。

大多数消息似乎都出现在/var/log/syslog和 via 中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. journald 和 rsyslog 在 Ubuntu 16.04(默认情况下)上究竟如何协同工作?
  2. 为什么从logger表面上发送的消息最终会出现在日志中,而不会出现在系统日志中?

更新:结果logger没有按预期工作是我的一个错误,所以它与主要问题无关。

Rav*_*ina 21

默认rsyslog使用“imuxsock”模块,该模块提供:

通过本地 Unix 套接字接受系统日志消息的能力。最重要的是,这是 syslog(3) 调用将 syslog 消息传送到 rsyslogd [1] 的机制

可以rsyslog使用名为 "imjournal" [2]的模块从 systemd-journal 导入结构化日志消息。

它可以像这样加载:

module(load="imjournal") 
Run Code Online (Sandbox Code Playgroud)

在:

/etc/rsyslog.conf
Run Code Online (Sandbox Code Playgroud)

另一方面,“systemd-journald”本身捕获所有数据:

man systemd-journald
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您可以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
Run Code Online (Sandbox Code Playgroud)

例如,centos 使用“imuxsock”模块来捕获所有“systemd-journald”数据,rsyslog而 opensuse 根本没有“syslog”。


要找出您的消息没有以 结尾的原因/var/log/syslog,您应该检查此文件:

less /etc/rsyslog.d/50-default.conf
Run Code Online (Sandbox Code Playgroud)

查找*.info,查看它们将存储在哪里,它可能是其他文件,例如messages.

对我来说,它同时出现在journalctl和 中syslog


luv*_*eet 9

Systemd 是一个 init 系统,用于在系统启动时启动服务。Journald 负责为 systemd 启动的服务制作日志。通过将 journald 与 systemd 集成,即使是最早的启动过程消息也可用于 journald。

Rsyslog 是专门为日志处理而制作的守护进程,与 journald 无关。它可以通过多种方式登录并以多种方式输出。默认情况下未启用它也从 journald 获取日志消息。为此,您必须在 /etc/rsyslog.conf 文件中写入,

$ModLoad imjournal # im -> input module
OR
load(type="imjournal")
Run Code Online (Sandbox Code Playgroud)

现在,它也将接受来自journald 的日志。但我建议您不要更改 /etc/rsyslog.conf 文件。

在 /etc/rsyslog.conf 文件的末尾,写了一行,

$IncludeConfig /etc/rsyslog.d/*.conf
Run Code Online (Sandbox Code Playgroud)

这意味着在 rsyslog 加载期间应该包含 /etc/rsyslog.d/ 文件夹中所有带有 .conf 的文件。所以,你所有的自定义配置都应该放在这些文件中

我建议您创建一个文件 /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")
Run Code Online (Sandbox Code Playgroud)

第 1 行 - 它加载 imjournal 模块以接受来自 journald 的日志

2 - 加载 mmjsonparse 模块,用于解析日志

3 - 它们被构造成模板中描述的格式

4 - 它使用 mmjsonparse 模块解析这些日志。

5 - 根据给定模板中提供的结构,使用 omfile(输出模块文件 - 输出到文件)模块将这些日志发送到一个文件,即 /var/log/ceelog。

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