在Ubuntu 16.04上rsyslog和journald的关系
我正在运行什么是一个普通的Ubuntu 16.04服务器,而我正试图了解默认情况下如何设置日志记录。 我可以看到journald
和journald
都已安装并运行,但我并不清楚如何处理日志消息。
大多数消息似乎都出现在/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
发送的消息似乎最终会出现在日志中,而不是在syslog中?
更新:原来logger
没有按预期工作是我的错误,因此它与主要问题无关。
默认情况下,rsyslog使用“imuxsock”模块,该模块提供:
能够通过本地Unix套接字接受syslog消息。 最重要的是,这是syslog(3)调用将syslog消息传递给rsyslogd [1]的机制 。
rsyslog可以使用名为“imjournal” [2]的模块从systemd-journal导入结构化日志消息。
它可以加载像:
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
您仍然可以使用journalctl
访问系统日志时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”模块通过rsyslog捕获所有“systemd-journald”数据,而opensuse根本没有“syslog”。
要找出您的消息没有以/var/log/syslog
结尾的原因,您应该检查以下文件:
less /etc/rsyslog.d/50-default.conf
查找*.info
,查看它们的存储位置,它可能是其他文件,如messages
。
对我而言,它出现在journalctl
和syslog
。
Systemd是一个init系统,用于在系统启动时启动服务。 Journald负责为systemd启动的服务创建日志。 通过将journald与systemd集成,即使是最早的引导过程消息也可用于journald。
Rsyslog是一个专门用于日志处理的守护进程,与journald无关。 它可以通过多种方式登录并以多种方式输出。 默认情况下,它不会启用来自journald的日志消息。 为此,您必须在/etc/rsyslog.conf文件中写入,
$ModLoad imjournal # im -> input module OR load(type="imjournal")
现在,它也将接受来自日记的日志。 但我建议您不要更改/etc/rsyslog.conf文件。
在/etc/rsyslog.conf文件的末尾,有一行写的,
$IncludeConfig /etc/rsyslog.d/*.conf
这意味着在rsyslog加载过程中,应该包含/etc/rsyslog.d/文件夹中所有文件末尾的文件。 因此,您的所有自定义配置都应该包含在这些文件中
我建议你创建一个文件/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。
根据需要在配置中进行更改。