rsyslog
rsyslog 是 syslog 的一种实现,它比 syslog-ng 提供了许多优势。它可以配置为从 systemd 的 journal 接收日志条目,以便在快速写入磁盘或通过网络发送之前对其进行处理或过滤。
安装
启动服务
您可以在安装后 启动/启用 rsyslog.service
。
配置主机名
Rsyslog 使用 glibc 例程 gethostname()
或 gethostbyname()
来确定本地计算机的主机名。如果您不使用 BIND 或 NIS,则 gethostname()
或 gethostbyname()
例程会检查 /etc/hosts
的内容以获取完全限定域名 (FQDN)。
您可以通过运行 hostname --fqdn
来检查本地计算机当前配置的 FQDN 是什么。hostname --short
的输出将由 rsyslog 在写入日志消息时使用。如果您希望日志中包含完整的主机名,则需要在文件开头添加 $PreserveFQDN on
(在使用任何写入文件的指令之前)。这是因为 rsyslog 会读取其配置文件并即时应用,然后再读取后面的行。
/etc/hosts
文件包含多行,这些行将 FQDN 映射到 IP 地址,并将别名映射到 FQDN。请参阅下面的 /etc/hosts
文件示例
/etc/hosts
#<ip-address> <hostname.domain.org> <hostname> #<ip-address> <actual FQDN> <aliases> 127.0.0.1 localhost.localdomain somehost.localdomain localhost somehost ::1 localhost.localdomain somehost.localdomain localhost somehost
localhost.localdomain
是 IP 地址后面的第一项,因此 gethostbyname()
函数将返回 localhost.localdomain 作为本地计算机的 FQDN。然后 /var/log/messages
文件将使用 localhost 作为主机名。
要使用 somehost 作为主机名。将 somehost.localdomain 移动到第一项
/etc/hosts
#<ip-address> <hostname.domain.org> <hostname> #<ip-address> <actual FQDN> <aliases> 127.0.0.1 somehost.localdomain localhost.localdomain localhost somehost ::1 somehost.localdomain localhost.localdomain localhost somehost
配置
rsyslog 在 /etc/rsyslog.conf
中配置。有关可用配置选项的更多信息,请参阅 官方文档。
默认情况下,所有 syslog 消息都由 systemd 的 journal 处理。为了在 rsyslog 中收集系统日志,您必须启用 #journald 的 syslog-forward 功能 或使用 rsyslog 的 #imjournal 模块从 systemd journald 导入日志来收集日志。
imjournal
如果您希望 rsyslog 从 systemd 拉取消息,请加载 imjournal 模块
/etc/rsyslog.conf
$ModLoad imjournal
有关更多信息,请参阅 关于 imjournal 输入模块的文档。
journald 的 syslog-forward 功能
/etc/systemd/journald.conf
ForwardToSyslog=yes
rsyslogAUR 不会创建其工作目录 /var/spool/rsyslog
,该目录由配置文件中的 $WorkDirectory
变量定义。您可能需要手动创建它或更改其目标位置。
可以在 /etc/rsyslog.conf
中微调日志输出。守护程序使用 Facility levels(参见下文)来确定将内容放入何处。例如
/etc/rsyslog.conf
# The authpriv file has restricted access. authpriv.* /var/log/secure
声明所有属于 authpriv facility 的消息都记录到 /var/log/secure
。
另一个示例,它类似于旧 auth.log
的 syslog-ng 的行为
/etc/rsyslog.conf
auth.* -/var/log/auth
有关更多信息,请参阅 Systemd/Journal#Journald 与 syslog 结合使用。
Facility levels
Facility Number | Keyword | Facility Description |
---|---|---|
0 | kern | 内核消息 |
1 | user | 用户级别消息 |
2 | 邮件系统 | |
3 | daemon | 系统守护进程 |
4 | auth | 安全/授权消息 |
5 | syslog | 由 syslogd 内部生成的消息 |
6 | lpr | 行式打印机子系统 |
7 | news | 网络新闻子系统 |
8 | uucp | UUCP 子系统 |
9 | clock daemon | |
10 | authpriv | 安全/授权消息 |
11 | ftp | FTP 守护进程 |
12 | - | NTP 子系统 |
13 | - | log audit |
14 | - | log alert |
15 | cron | clock daemon |
16 | local0 | 本地使用 0 (local0) |
17 | local1 | 本地使用 1 (local1) |
18 | local2 | 本地使用 2 (local2) |
19 | local3 | 本地使用 3 (local3) |
20 | local4 | 本地使用 4 (local4) |
21 | local5 | 本地使用 5 (local5) |
22 | local6 | 本地使用 6 (local6) |
23 | local7 | 本地使用 7 (local7) |
Severity levels
如 RFC 5424 中定义,共有八个严重级别
代码 | 严重性 | Keyword | 描述 | 通用描述 |
---|---|---|---|---|
0 | Emergency | emerg (panic) | 系统不可用。 | 一种“panic”情况,通常影响多个应用/服务器/站点。在此级别,通常会通知所有值班技术人员。 |
1 | Alert | alert | 必须立即采取行动。 | 应立即纠正,因此通知可以解决问题的员工。例如,主 ISP 连接丢失。 |
2 | Critical | crit | 严重情况。 | 应立即纠正,但表明主系统出现故障,例如备用 ISP 连接丢失。 |
3 | Error | err (error) | 错误情况。 | 非紧急故障,这些应转发给开发人员或管理员;每个项目都必须在给定的时间内解决。 |
4 | Warning | warning (warn) | 警告情况。 | 警告消息,不是错误,但表明如果不采取措施将发生错误,例如文件系统已满 85% - 每个项目都必须在给定的时间内解决。 |
5 | Notice | notice | 正常但重要的条件。 | 不寻常但不是错误情况的事件 - 可能会在电子邮件中总结给开发人员或管理员,以发现潜在问题 - 无需立即采取行动。 |
6 | Informational | info | 信息性消息。 | 正常操作消息 - 可以收集用于报告、测量吞吐量等 - 无需采取行动。 |
7 | Debug | debug | 调试级别消息。 | 对开发人员调试应用程序有用的信息,在操作期间无用。 |
示例
journald 与 rsyslog 用于内核消息
由于 systemd 的 syslog 组件 journald 在正常操作期间不会将其日志刷新到磁盘,因此当机器异常关闭(断电、内核锁死等)时,这些日志将丢失。在内核锁死的情况下,拥有一些内核日志对于调试可能很重要。在 journald 获得刷新内核日志的配置选项之前,rsyslog 可以与 journald 结合使用。
需求概要
- journald 必须仍然获取所有日志消息。
- rsyslog 必须仅记录内核消息,所有其他日志均由 journald 处理。
- 内核日志必须单独记录到
/var/log/kernel.log
。 - 使用 systemd 启动服务。
安装和配置步骤
- 安装 rsyslogAUR。
- 编辑
/etc/logrotate.d/rsyslog
并将/var/log/kernel.log
添加到日志列表中。如果没有此修改,内核日志将无限增长。 - 编辑
/etc/rsyslog.conf
并注释掉除$ModLoad imklog
之外的所有内容。如果首选心跳(重复确认日志处于活动状态),则$ModLoad immark
也应保持未注释状态。 - 将下一行添加到同一配置文件
kern.* /var/log/kernel.log;RSYSLOG_TraditionalFileFormat
kern.*
部分捕获所有源自内核的消息。此处使用;RSYSLOG_TraditionalFileFormat
是为了使用不太详细的日期格式。默认情况下,使用类似于2013-03-09T19:29:33.103897+01:00
的日期格式。由于内核日志已经包含精度(printk 时间),并且实际日志时间无关紧要,因此可能首选类似于Mar 9 19:29:13
的格式。
- 由于 rsyslog 应与 systemd 完全分离运行,因此请删除与 systemd 共享套接字的选项
# sed 's/^Sockets=/#&/' /usr/lib/systemd/system/rsyslog.service > /etc/systemd/system/rsyslog.service
- 接下来,通过启动并启用
rsyslog.service
,使 rsyslog 在启动时启动并在本次会话中启动它。
/proc/kmsg
读取。这意味着后续从该文件(用户或 syslog 守护程序)的读取将不再从该文件读取“旧”日志。journald 不受影响,因为它从允许多个读取器的 /dev/kmsg
读取。