跳至内容

日志管理

基本概述

在本章中,您将学习如何在操作系统中管理日志。

问:什么是日志?

日志:记录操作系统启动以来发生的所有事件和消息,包括启动日志、内核初始化日志、systemd 初始化日志以及应用程序启动或运行日志。日志是操作系统最基本的功能之一。管理员可以查询日志来排查现有或即将发生的问题。

在 RHEL 8.x 和 RHEL 9.x 中,日志的收集主要通过以下两个程序完成:

  • rsyslog - 一个快速收集和处理日志的程序。它是 syslog 的升级版本。这是它的官方网站
  • journald - systemd 的组件之一

rsyslog

在 Rocky Linux 8.x 或 9.x 中,/var/log/ 目录下有各种各样的日志文件。让我们来了解一下:

  • /var/log/boot.log - 记录操作系统启动过程中发生的事件。文件内容为纯文本。
  • /var/log/btmp - 记录登录错误的日志。要查看这个二进制文件,请使用 lastb 命令。
  • /var/log/cron - 记录与系统计划任务相关的日志。文件内容为纯文本。
  • /var/log/dmegs - 记录启动后内核自检的日志。文件内容为纯文本。您也可以使用 dmegs 命令进行查看。
  • /var/log/lastlog - 记录操作系统中所有用户的最后登录时间。要查看这个二进制文件,必须使用 lastlog 命令。
  • /var/log/maillog - 记录与邮件相关的日志。
  • /var/log/messages - 系统级别的日志文件,记录着操作系统的核心。文件内容为纯文本。当您的操作系统出现某些错误时,应首先查看此日志文件。
  • /var/log/secure - 记录与用户身份相关的日志,例如用户登录、su 切换、新增用户、修改用户密码等。
  • /var/log/wtmp - 记录用户的登录和退出、操作系统的启动、关机、重启事件。要查看这个二进制文件,请使用 last 命令。

对于纯文本文件,其格式通常是:

  1. 事件发生的时间
  2. 事件发生在哪个机器上
  3. 生成事件的服务或程序的名称
  4. 事件的具体描述和说明
  5. 用户和终端信息
  6. 一些关键词提示(例如 error、fail、info 等)

不同用途的日志格式差异很大,所以上述格式描述不能代表所有日志。

如果您的操作系统缺少 rsyslog,请运行以下命令:

Shell > dnf install -y rsyslog

配置文件

  • /etc/rsyslog.conf - 主要的配置文件
  • /etc/rsyslog.d/ - 附加配置文件的存储目录

/etc/rsyslog.conf 主要由以下几个部分组成:

  1. 加载模块
  2. 全局指令
  3. 规则 - 作者将在此处详细展示。

经过几十年的发展,rsyslog 目前支持三种不同的配置格式:

  1. basic (sysklogd) - 这种格式适合用单行来表示基本配置。

    mail.info /var/log/mail.log
    mail.err @@server.example.net
    
  2. advanced (RainerScript) - 高度灵活和精确的配置格式。

    mail.err action(type="omfwd" protocol="tcp" queue.type="linkedList")
    
  3. obsolete legacy (legacy) - 这种格式已被弃用。请不要继续使用。

规则

此部分默认内容如下:

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

authpriv.*                                              /var/log/secure

mail.*                                                  -/var/log/maillog

cron.*                                                  /var/log/cron

*.emerg                                                 :omusrmsg:*

uucp,news.crit                                          /var/log/spooler

local7.*                                                /var/log/boot.log

每一行规则包含两个部分:

  1. selector 字段 - 由 facilities 和 priorities 组成
  2. action 字段 - 您希望如何处理匹配到的消息

字段之间由一个或多个空格分隔。

Facility 描述
auth 记录与系统安全、用户认证和权限管理相关的事件
authpriv 记录更敏感的安全事件(例如 sudo 操作)。"priv" 等同于 private(私有)
cron 记录与计划任务相关的事件
daemon 记录系统守护进程的运行日志,涵盖服务启动、运行状态和错误信息
ftp 记录与 FTP 服务(例如 vsftpdproftpd)相关的操作日志,包括连接、文件传输和错误信息
kern 记录 Linux 内核运行时产生的日志,涵盖硬件驱动、内核模块和系统异常等核心事件
lpr 记录打印服务的运行日志,涵盖打印任务提交、队列管理和错误信息
mail 记录邮件服务(例如 Postfix 和 Sendmail)的日志信息,包括邮件发送、接收、队列处理和错误事件
news 很少使用
security auth 相同
syslog 记录 syslog 服务生成的日志
user 记录由用户空间应用程序或用户生成的日志信息
uucp 记录 Unix-to-Unix Copy Protocol (UUCP) 相关的操作日志,包括文件传输、远程命令执行和其他场景
local0 保留
local1 保留
.... 保留
local7 保留

* 代表所有 facilities。您也可以使用 ,; 来组合单行配置中的 facilities。, 表示逻辑或;; 表示规则分隔符。

auth,authpriv.*  /var/log/auth.log

# Equivalent to

auth.*   /var/log/auth.log
authpriv.*  /var/log/auth.log
kern.err;mail.alert  /var/log/critical.log
Connector 描述
. 记录比关键词优先级更高的日志。例如,cron.info 表示它将记录 cron 中日志优先级大于 info 的记录
.= 只记录与关键字优先级相等的日志。例如,*.=emerg 表示它将记录所有应用程序中优先级等于 emerg 的日志
.! 表示排除或不等于

优先级从低到高排序:

Name 描述
debug 一般的调试信息
信息 基本的通知信息
notice 一般性的、具有一定重要性的信息
警告 警告信息,这类信息不会影响操作系统或服务的正常运行
err 错误信息,可能会影响操作系统和服务的正常运行
crit 比 "err" 更严重的关键状态
alert 警报状态,比 "crit" 更严重,需要系统管理员立即处理
emerg 紧急状态,操作系统无法正常使用

* 代表所有日志优先级。

日志优先级越低,记录的内容越详细,问题越轻微。日志优先级越高,记录的内容越少,问题越严重。

"action" 指的是将日志保存到何处或发送到何处

  • /var/log/secure - 将日志保存到本地文件
  • @192.168.100.20:22 - 远程机器
  • :omusrmsg:root,frank,jack - 指定在线用户的列表。* 代表所有用户。"omusrmsg" 指的是 "output module for user messages"(用户消息输出模块)。
  • /dev/tty12 - 指定的终端设备
  • - - 在写入文件时禁用缓冲机制

日志轮循

日志轮循 - 日志轮循解决了由于日志文件不断增长而导致的存储占用和性能下降的问题。具体功能包括:

  • 轮循 - 根据特定规则(例如时间或文件大小)自动存档当前日志文件,并创建一个新的空日志文件用于记录,以防止日志文件过大。
  • 压缩 - 压缩存档的旧日志以节省磁盘空间。
  • 删除 - 根据相关策略保留相关的日志文件,并删除过期的旧日志。

我们通常使用 logrotate 工具来轮循日志。

轮循日志文件时的命名规则

  • dateext 参数 - 使用日期作为日志轮循的文件后缀。例如,在第一次日志轮循时,旧的日志文件 "secure" 将变为 "secure-20250424",并且 logrotate 会创建一个新的 "secure" 文件。
  • dateetx 参数 - 在日志轮循后使用轮循数字作为文件后缀。例如,当第一次日志轮循发生时,旧的日志文件 "secure" 将变为 "secure.1",并且 logrotate 会创建一个新的 "secure" 文件。

/etc/logrotate.conf 和 /etc/logrotate.d/

Shell > grep -v -E "^#|^$" /etc/logrotate.conf
weekly
rotate 4
create
dateext
include /etc/logrotate.d

Shell > ls -l /etc/logrotate.d/
-rw-r--r--  1 root root 130 Feb  7  2023 btmp
-rw-r--r--. 1 root root 160 Dec  5  2023 chrony
-rw-r--r--. 1 root root  88 Apr 12  2021 dnf
-rw-r--r--  1 root root  93 Mar 11 17:29 firewalld
-rw-r--r--. 1 root root 162 Apr 16 19:49 kvm_stat
-rw-r--r--  1 root root 289 Dec 18 01:38 sssd
-rw-r--r--  1 root root 226 Nov  5 15:43 syslog
-rw-r--r--  1 root root 145 Feb 19  2018 wtmp

/etc/logrotate.conf - 日志轮循的全局配置文件。如果配置项或参数重叠,则最后读取的配置项或参数生效。读取顺序:

  1. 从上到下读取 /etc/logrotate.conf 文件内容
  2. 使用 "include" 关键字包含的文件

常见的配置项或参数有:

items 描述
daily 定义日志轮循的周期(天)
weekly 定义日志轮循的周期(周)
monthly 定义日志轮循的周期(月)
rotate <NUMBER> 日志轮循后保存的文件数量
compress 日志轮循后对旧日志进行压缩
create <MODE> <OWNER> <GROUP> 日志轮循后,定义新日志文件的所有者、组和权限
mail <E-MAIL ADDRESS> 日志轮循后,将输出内容通过电子邮件发送到指定的电子邮件地址
missingok 如果日志文件不存在,则忽略日志中的警告信息
notifempty 如果日志文件内容为空,则不进行日志轮循
minsize <SIZE> 日志轮循的文件大小条件,即只有当满足此条件时才进行日志轮循
dateext 使用日期作为日志轮循的文件后缀

如果您从仓库安装软件,软件的维护者已经定义了应用程序的日志轮循,用户通常不需要修改。如果您通过编译源代码安装应用程序,则需要考虑并手动配置日志轮循。

logrotate 命令

用法是 logrotate [OPTION...] <configfile>

  • -v - 显示日志轮循的过程
  • -f - 强制进行日志轮循,无论是否满足轮循条件
Shell > logrotate -v /etc/logrotate.conf
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file btmp
reading config file chrony
reading config file dnf
reading config file firewalld
reading config file kvm_stat
reading config file sssd
reading config file syslog
reading config file wtmp
Reading state from file: /var/lib/logrotate/logrotate.status
Allocating hash table for state file, size 64 entries
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state
Creating new state

Handling 8 logs

rotating pattern: /var/log/btmp  monthly (1 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/btmp
  Now: 2025-04-24 12:35
  Last rotated at 2025-04-04 12:08
  log does not need rotating (log has been rotated at 2025-4-4 12:8, that is not month ago yet)

rotating pattern: /var/log/chrony/*.log  weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/chrony/*.log
  log /var/log/chrony/*.log does not exist -- skipping
not running postrotate script, since no logs were rotated

rotating pattern: /var/log/hawkey.log  weekly (4 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/hawkey.log
  Now: 2025-04-24 12:35
  Last rotated at 2025-04-19 09:11
  log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet)

rotating pattern: /var/log/firewalld  weekly (4 rotations)
empty log files are rotated, only log files >= 1048576 bytes are rotated, old logs are removed
considering log /var/log/firewalld
  Now: 2025-04-24 12:35
  Last rotated at 2024-05-20 13:00
  log does not need rotating ('minsize' directive is used and the log size is smaller than the minsize value)

rotating pattern: /var/log/kvm_stat.csv  10485760 bytes (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/kvm_stat.csv
  log /var/log/kvm_stat.csv does not exist -- skipping

rotating pattern: /var/log/sssd/*.log  weekly (2 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/sssd/sssd_implicit_files.log
  Now: 2025-04-24 12:35
  Last rotated at 2024-05-26 12:42
  log does not need rotating (log is empty)
considering log /var/log/sssd/sssd_kcm.log
  Now: 2025-04-24 12:35
  Last rotated at 2025-02-08 13:49
  log does not need rotating (log is empty)
considering log /var/log/sssd/sssd.log
  Now: 2025-04-24 12:35
  Last rotated at 2024-05-26 12:42
  log does not need rotating (log is empty)
considering log /var/log/sssd/sssd_nss.log
  Now: 2025-04-24 12:35
  Last rotated at 2024-05-26 12:42
  log does not need rotating (log is empty)
not running postrotate script, since no logs were rotated

rotating pattern: /var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
 weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/cron
  Now: 2025-04-24 12:35
  Last rotated at 2025-04-19 09:11
  log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet)
considering log /var/log/maillog
  Now: 2025-04-24 12:35
  Last rotated at 2025-04-19 09:11
  log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet)
considering log /var/log/messages
  Now: 2025-04-24 12:35
  Last rotated at 2025-04-19 09:11
  log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet)
considering log /var/log/secure
  Now: 2025-04-24 12:35
  Last rotated at 2025-04-19 09:11
  log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet)
considering log /var/log/spooler
  Now: 2025-04-24 12:35
  Last rotated at 2025-04-19 09:11
  log does not need rotating (log has been rotated at 2025-4-19 9:11, that is not week ago yet)
not running postrotate script, since no logs were rotated

rotating pattern: /var/log/wtmp  monthly (1 rotations)
empty log files are rotated, only log files >= 1048576 bytes are rotated, old logs are removed
considering log /var/log/wtmp
  Now: 2025-04-24 12:35
  Last rotated at 2024-05-20 13:00
  log does not need rotating ('minsize' directive is used and the log size is smaller than the minsize value)

journald

systemd 是一个用于初始化的应用程序,它接管了许多系统组件。在 systemd 中使用 journald 来接管日志的内容。

journaldsystemd 中负责接管日志的守护进程。您需要使用 journalctl 命令来读取日志。

请注意,journald 默认情况下不启用日志持久化,这意味着它只保留和记录自启动以来的所有日志。操作系统重启后,历史日志会被删除。所有临时保存的日志文件默认位于 /run/log/journal/ 目录下。

Shell > tree -hugp /run/log/journal/638c6d5d2b674f77be56174469099106/
/run/log/journal/638c6d5d2b674f77be56174469099106/
└── [-rw-r----- root     systemd-journal  8.0M]  system.journal

0 directories, 1 file

这个临时文件是二进制的,您必须使用 journalctl 命令来解析它。

journald 可以记录:

  • 启动日志
  • 内核日志
  • 应用程序日志

journald 根据 **优先级** 和 **Facility** 来标记日志。

  • Priority - 标记日志的重要性。与 rsyslog 类似,优先级越高,记录的信息越少,问题越严重。优先级越低,记录的信息越多,问题越轻微。按优先级从低到高排序:

    Numerical code priority keywords
    7 Debug debug
    6 Informational 信息
    5 Notice notice
    4 警告 警告
    3 Error err
    2 Critical crit
    1 Alert alert
    0 Emergency emerg
  • Facility - 该表显示了 facility。

    Numerical code facility
    0 kern
    1 user
    2 mail
    3 daemon
    4 auth
    5 syslog
    6 lpr
    7 news
    8 uucp
    9
    10 authpriv
    11 ftp
    12
    13
    14
    15 cron
    16 local0
    17 local1
    18 local2
    19 local3
    20 local4
    21 local5
    22 local6
    23 local7

journalctl 命令

用法是 journalctl [OPTIONS...] [MATCHES...]

以下是选项的无序列表:

  • -u - 指定 'unit';您可以在单个命令中使用此选项多次。例如:journalctl -u crond.service -u sshd.service
  • --system - 显示来自系统服务和内核的消息
  • --user - 显示来自当前用户服务的消息
  • -k - 显示当前启动的内核消息日志
  • --since=DATA-S - 显示不早于指定日期的条目。日期格式为 "YYYY-MM-DD HH:MM:SS"。例如:journalctl --since="2025-04-24 14:00:30
  • --until=DATA-U - 显示不晚于指定日期的条目。日期格式为 "YYYY-MM-DD HH:MM:SS"。例如:journalctl --since="2025-04-01 05:00:10" --until="2025-04-05 18:00:30"
  • --list-boots - 显示已记录启动的简短信息
  • -n N - 控制输出条目数量。如果未指定 "N",则默认为 10。
  • -p PRIORITY - 指定优先级或优先级范围。如果您指定单个日志优先级关键字,将显示该优先级及高于该优先级的条目。例如,journalctl -p 3journalctl -p err 等同于 journalctl -p 0..3journalctl -p emerg..err
  • -b - 查询自当前启动 ID 开始的日志。请勿将启动 ID 与内核启动的索引号混淆。
  • -f - 动态查询日志,类似于 tail -f 命令
  • -x - 在可用时添加消息解释
  • -e - 跳转到日志的末尾页面,通常与 -x 选项一起使用
  • -r - 反向显示日志。
  • --disk-usage - 显示日志文件占用的磁盘空间
  • --rotate - 请求立即轮循 journal 文件
  • --vacuum-size=BYTES - 将日志文件减小到指定大小。它会逐渐删除旧的日志内容,直到满足指定的 P 文件大小。支持的大小后缀有 K, M, G, T。
  • --vacuum-time=TIME - 可以通过指定一个时间点来删除旧的日志记录,即它会删除比该时间点更早的日志记录。支持的时间后缀有 s, m, h, days, months, weeks, years。
  • --vacuum-files=INT - 指定要保留的日志文件数量。
  • -N - 列出当前使用的所有字段名称。用户可以使用 "FIELD=VALUE" 的方式匹配相关内容。例如:journalctl _SYSTEMD_UNIT=sshd.service
  • -g-grep=PATTERN - 通过模式匹配日志内容,支持正则表达式。如果 PATTERN 是全小写,默认情况下匹配日志内容时不区分大小写。您可以通过 --case-sensitive 选项调整区分大小写。
  • --case-sensitive=[BOOLEAN] - 调整是否区分大小写。
  • -o--output=STRING - 更改 journalctl 的输出模式。STRING 可以是 short, short-precise, short-iso, short-iso-precise, short-full, short-monotonic, short-unix, verbose, export, json, json-pretty, json-sse, cat, 和 with-unit。
  • -q--quiet - 静默输出
  • --sync - 将未写入的 journal 消息同步到磁盘

/etc/systemd/journald.conf

Shell > cat /etc/systemd/journald.conf
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K

使用 "[ ]" 包裹标题,与其他 systemd 组件的配置文件类似,标题下方是具体的键值对。键值对中 **等号两侧没有空格**。有关完整的配置手册页,请参阅 man 5 journald.conf

  • Storage= - 控制 journald 数据存储的位置。默认值为 auto。

    • volatile - 将日志数据存储在内存中,即存储在 /run/log/journal/ 目录的临时文件中。
    • persistent - 将日志数据存储在 /var/log/journal/ 目录下。您需要手动创建此目录。如果此目录不可写,日志数据将写入 /run/log/journal/ 目录。
    • auto - 类似于 persistent。
    • none - 不保存任何日志,但这不会影响转发到其他 "target" 的日志。
  • Compress= - 是否启用压缩功能。默认值为 yes。

  • Seal= - 是否使用 FSS (Forward Secure Sealing) 来保护日志条目免受恶意篡改。默认值为 yes。
  • SplitMode= - 定义日志文件分割的依据。必须在满足条件(Storage=persistent)之前执行,才能生效。默认值为 uid。
  • SyncIntervalSec= - 定义将内存中的日志数据同步到磁盘的时间间隔。请注意!这仅适用于 err、warning、notice、info 和 debug 日志优先级。其他日志优先级会立即同步到磁盘。默认值为 5m。
  • RateLimitIntervalSec= - 定义日志生成频率的时间间隔。默认值为 30s。
  • RateLimitBurst= - 在给定的时间间隔内生成日志的最大条目数。默认值为 10000。如果日志条目在给定的时间间隔内超过 10000 条,它将删除多余的日志,并且在下一个时间间隔之前不会生成新的日志条目。
  • SystemMaxUse= - 控制 /var/log/journal/ 目录下所有日志文件的总大小。
  • SystemKeepFree= - 控制 /var/log/journal/ 目录下保留多少磁盘空间。以 1024 为基数,后缀包括 K, M, G, T, P, E。
  • SystemMaxFileSize= - 限制 /var/log/journal/ 目录下单个文件的大小。如果大小超过指定大小,将发生日志轮循。
  • SystemMaxFiles= - 指定 /var/log/journal/ 目录下保留多少个日志文件。当超过定义的数量时,将删除最旧的日志。
  • RuntimeMaxUse= - 控制 /run/log/journal/ 目录下日志数据的总大小。
  • RuntimeKeepFree= - 控制 /run/log/journal/ 目录下保留多少空间。
  • RuntimeMaxFileSize= - 控制 /run/log/journal/ 目录下单个日志文件的大小。当日志达到指定大小时,将发生日志轮循。
  • RuntimeMaxFiles= - 需要保留 /run/log/journal/ 目录下多少个日志文件。
  • MaxRetentionSec= - 定义日志文件的保留时间;如果超过定义的时长,则删除旧日志文件。值为 0 表示该功能关闭。值后缀有 year, month, week, day,h,m。
  • MaxFileSec= - 基于时间的日志轮循。由于已存在基于文件大小的轮循(SystemMaxFileSizeRuntimeMaxFileSize),通常不需要基于时间的日志轮循。将其设置为 0 以禁用此功能。
  • ForwardToSyslog= - 是否将收集到的日志消息转发到传统的 syslog 守护进程。默认值为 no。
  • ForwardToKMsg= - 是否将接收到的日志消息转发到 kmsg。默认值为 no。
  • ForwardToConsole= - 是否将接收到的日志消息转发到系统控制台。默认值为 no。如果设置为 yes,还需要配置 TTYPath
  • ForwardToWall= - 是否将接收到的日志消息作为警告发送给所有已登录用户。默认值为 yes。
  • TTYPath= - 指定控制台的路径。需要 ForwardToConsole=yes。默认值为 /dev/console。
  • MaxLevelStore= - 设置写入日志文件的最大日志级别。默认值为 debug。
  • MaxLevelSyslog= - 设置转发到传统 syslog 守护进程的最大日志级别。默认值为 debug。
  • MaxLevelKMsg= - 设置转发到 kmsg 的最大日志级别。默认值为 notice。
  • MaxLevelConsole= - 设置转发到系统控制台的最大日志级别。默认值为 info。
  • MaxLevelWall= - 设置发送给所有已登录用户消息的最大日志级别。默认值为 emerg
  • LineMax= - 将日志流转换为日志记录时,每条日志记录允许的最大长度(字节)。以 1024 为基数,后缀可以是 K, M, G, 或 T。默认值为 48K。

其他说明

如果您不更改 /etc/systemd/journald.conf 中的任何配置,rsyslogjournald 可以共存而不相互影响。

Shell > cat /etc/rsyslog.conf
...
#### MODULES ####

module(load="imuxsock"    # provides support for local system logging (e.g. via logger command)
       SysSock.Use="off") # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.
module(load="imjournal"             # provides access to the systemd journal
       UsePid="system" # PID nummber is retrieved as the ID of the process the journal entry originates from
       StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark") # provides --MARK-- message capability
...

journald 会将获取到的日志数据转发到套接字 /run/systemd/journal/syslog,以便传统日志服务(rsyslog, syslog-ng)使用。然而,从配置文件中我们可以得知,rsyslog 并不是通过套接字从 journald 收集日志,而是通过输入模块 (imjournal) 集成的。

问:操作系统是否不能使用 journald 进行日志记录?

可以。默认情况下,rsyslogjournald 可以在操作系统中共存而不相互影响。对于一些性能导向的使用场景(例如数据吞吐量和内存消耗),共存可能不是最佳选择。您可以让 rsyslog 只在套接字模式下运行,这有助于提高性能并以纯文本格式记录所有日志。但是,如果您需要结构化日志,此更改则不适用。相关步骤如下:

Shell > vim /etc/rsyslog.config
...
module(load="imuxsock"
      SysSock.Use="on")
# module(load="imjournal" 
# UsePid="system" 
# StateFile="imjournal.state")
module(load="imklog")
...

Shell > vim /etc/systemd/journald.conf
[Journal]
Storage=none
...
ForwardToSyslog=yes
...

Shell > reboot

作者:李天赐

贡献者:Ganna Zhyrnova, Steven Spencer