本文介绍 TencentOS Server 上的日志管理机制,包括 systemd-journald 和 rsyslog 的配置与使用,帮助您高效管理系统和应用日志。
系统日志文件
系统中的日志主要在
/var/log/ 目录下,包括以下文件:/var/log/messages:包含系统的大部分消息和错误信息,包括内核消息、系统启动信息、系统服务启动和停止信息等。该文件通常是系统管理员进行故障排除和监控的主要来源。/var/log/secure:包含系统的身份验证和安全相关的日志信息,包括用户登录和注销信息、sudo 命令使用信息、SSH 连接信息等。该文件通常是系统管理员进行安全审计和监控的主要来源。/var/log/audit/audit.log:记录系统中的安全审计信息。该文件通常由 auditd 守护进程生成和维护,可以帮助系统管理员监控系统中的安全事件和活动。/var/log/dnf.log:记录系统中使用 DNF 包管理器进行软件包安装、更新和卸载等操作的详细信息。/var/log/boot.log:包含系统启动期间的日志信息,包括启动脚本的输出信息、服务启动和停止信息等。该文件通常是系统管理员进行启动故障排除和监控的主要来源。/var/log/lastlog:记录系统中所有用户最后一次登录的信息。/var/log/wtmp:记录系统中所有用户的登录和注销信息,包括用户名、登录时间、注销时间、登录来源、登录 IP 地址等。journald 服务
journald 是 systemd 的日志服务,负责收集和存储系统日志。您可以使用
journalctl 命令查看系统日志。查看系统日志
查看系统中的全部日志:
journalctl
该命令将显示所有系统日志,包括内核日志、服务日志和系统启动日志等。
查看指定服务的日志,请将
<service-name> 替换为您需要查看的服务名称:journalctl -u <service-name>
查看指定时间段内的日志。将日期和时间替换为您要查询的时间段:
journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 00:00:00"
查看内核日志:
journalctl -k
当前系统中 journald 默认只会保存当次启动的日志,存储位置在
/run/log/journal/ 下。如果需要记录所有的启动日志,可以手动创建 /var/log/journal 目录,创建后 journald 服务会把启动日志存储到这里。创建日志持久化存储目录并重启系统:
mkdir -p /var/log/journal/reboot
再次重启后,执行以下命令查看所有启动记录:
journalctl --list-boots
输出结果如下,其中
IDX 列为启动序号,负数表示历史启动记录,0 表示当前启动:IDX BOOT ID FIRST ENTRY LAST ENTRY-1 506feea161494cff925010ea7599ab5d Fri 2023-05-26 15:57:28 CST Fri 2023-05-26 16:00:10 CST0 59f4624ce2d94299be2afd80d3650c1a Fri 2023-05-26 16:00:18 CST Fri 2023-05-26 16:03:20 CST
管理系统日志
您可以使用
journalctl 命令管理系统日志,包括清除日志和导出日志等操作。清除系统中的所有日志:
journalctl --vacuum-time=1s
该命令通过设置极短的保留时间(1 秒),将所有早于该时间的日志清除。
清除指定时间段内的日志。将日期和时间替换为您要清除的时间段:
journalctl --vacuum-time=1s --since "2024-01-01 00:00:00" --until "2024-01-02 00:00:00"
将所有日志输出到指定文件,此处名为
log.txt 的文件中:journalctl > log.txt
将特定服务的日志输出到文件。将
<service-name> 替换为您需要导出的服务名称:journalctl -u <service-name> > service-log.txt
该命令会将指定服务的日志写入
service-log.txt 文件中。rsyslog 的安装和配置
rsyslog 简介
rsyslog(Reliable System Logging)是一个强大的系统日志处理引擎,它提供了一套完整的工具集,可以轻松传输、后处理和存储各种来源的系统与应用日志。rsyslog 对 Syslog 协议进行了改良与扩展,包括更高的可靠性、性能以及强大的插件架构。
安装 rsyslog
在 TencentOS Server 中,rsyslog 通常已经预装。如果需要手动安装,可以使用包管理器
dnf 进行安装。执行以下命令更新软件包索引并安装 rsyslog:dnf install rsyslog #安装rsyslog组件dnf update rsyslog #更新rsyslog组件
配置 rsyslog
rsyslog 的配置文件通常位于
/etc/rsyslog.conf。在该文件中可以定义日志消息的来源、格式和目的地,例如配置 rsyslog 从特定的 Unix 套接字读取日志、从 journald 读取日志或者将日志消息发送到远程服务器。rsyslog 的配置文件使用了一种特殊的语法,其中包括模块、模板和规则。以下是一个简单的配置示例,您可以通过
vim /etc/rsyslog.conf来修改:# 加载模块module(load="imuxsock") # 提供 Unix 套接字支持module(load="imklog") # 提供内核日志支持# 提供 UDP syslog 接收module(load="imudp")input(type="imudp" port="514")# 提供 TCP syslog 接收module(load="imtcp")input(type="imtcp" port="514")# 指定日志文件的位置auth,authpriv.* /var/log/auth.log*.*;auth,authpriv.none -/var/log/syslogdaemon.* -/var/log/daemon.logkern.* -/var/log/kern.log
修改配置文件后,需要重启 rsyslog 服务使配置生效。
systemctl restart rsyslog
警告:
修改配置文件前,建议备份原有配置文件(如
cp /etc/rsyslog.conf /etc/rsyslog.conf.bak),以便在配置异常时快速恢复。重启 rsyslog 服务会短暂中断日志采集,请确认对业务无影响后再执行。rsyslog 的基本使用
rsyslog 安装并配置完成后,将自动开始运行并处理日志消息。使用
systemctl 命令可以管理 rsyslog 服务,包括启动、停止和重启服务。systemctl start rsyslogsystemctl stop rsyslogsystemctl restart rsyslog
设置 rsyslog 随系统默认启动,执行以下命令:
systemctl enable rsyslog
同时可以执行以下命令查看 rsyslog 服务状态,确保服务正常:
systemctl status rsyslog
配置日志转发规则
rsyslog 的强大之处体现在其便捷的日志文件转发功能,您可以通过 rsyslog 的配置文件,方便地发送本机日志文件至远程服务器,或者接收来自远程服务器的日志信息。
转发本机日志消息
通过配置
vim /etc/rsyslog.conf 文件,可将本机所有日志消息通过 rsyslog 转发到其他服务器。在配置文件中添加以下内容:*.* @@192.168.1.1:514
在该示例中,
*.* 表示所有设施和所有优先级的日志消息,@@ 表示使用 TCP 连接,192.168.1.11:514 是远程服务器的 IP 地址和端口。其中端口需与远程服务器 rsyslog 配置中监听的端口保持一致。修改配置文件后,请重启 rsyslog 服务使更改生效。systemctl restart rsyslog
接收远程日志消息
通过配置
vim /etc/rsyslog.conf 文件,加载特定模块并打开特定端口,接收来自其他服务器的日志消息。在配置文件中添加以下内容:# 提供 UDP syslog 接收module(load="imudp")input(type="imudp" port="514")# 提供 TCP syslog 接收module(load="imtcp")input(type="imtcp" port="514")
在该示例中,rsyslog 打开了 TCP 和 UDP 接收模块,接收来自其他服务器的 syslog 消息。修改配置文件后,请重启 rsyslog 服务使更改生效。
systemctl restart rsyslog
结合使用 rsyslog 和 journal
rsyslog 和 journal 都是用于处理和管理系统日志的工具,但它们在设计和实现上存在差异。rsyslog 使用的是传统的文本文件格式,可以直接阅读和处理,而 journal 使用的是二进制格式,需要通过特定的工具进行处理。此外,rsyslog 更加注重网络日志收集,而 journal 则更加注重本地日志的结构化和索引。
在 rsyslog 中使用 journal
通过加载
imjournal 模块,rsyslog 可直接从 systemd journal 获取日志数据,替代传统的 Unix 域套接字(如 /dev/log)输入方式。该机制使 rsyslog 能够直接访问 journal 的原生结构化元数据(如 _PID、_COMM、SYSTEMD_UNIT 等),从而实现对系统日志的高效采集与结构化处理。在 rsyslog 的配置文件
vim /etc/rsyslog.conf 中,添加以下配置加载 imjournal 模块(在 TencentOS Server 中,通常已默认配置):module(load="imjournal" StateFile="imjournal.state")
在 journal 中使用 rsyslog
通过配置
systemd-journald 的 ForwardToSyslog=yes 选项,可将 Journal 日志实时转发至 rsyslog。启用该功能后,journald 会通过 Unix 域套接字(通常为 /run/systemd/journal/syslog)将日志消息推送给 rsyslog,使其能够以传统 syslog 协议格式接收并处理系统日志,从而实现与现有 syslog 基础设施的兼容及集中式日志管理。在 journal 的配置文件
vim /etc/systemd/journald.conf 中,添加或修改以下配置启用 ForwardToSyslog 选项(默认选项为 no):ForwardToSyslog=yes
然后重启 systemd-journald 服务以使更改生效。
systemctl restart systemd-journald
说明:
一般情况下,如果需要将 journal 的日志消息转发至 rsyslog,建议同时打开 rsyslog 的
imjournal 模块和 journald 的 ForwardToSyslog 选项,确保所有的日志消息都能正确地被 rsyslog 捕获。配置示例:转发 journal 日志到远程服务器
结合使用 rsyslog 和 journal 可以充分利用两者的优点。Journald 凭借其二进制存储与结构化索引特性,显著提升本地日志的检索效率与分析便捷性;rsyslog 则依托网络传输能力,实现日志向远程服务器的可靠转发,满足集中化日志管理需求。此外,rsyslog 对传统 Syslog 协议的完整兼容,确保对遗留应用及老旧设备的支持。
例如,配置
vim /etc/rsyslog.conf 文件,将本机所有 journal 日志消息通过 rsyslog 转发到其他服务器。在配置文件中添加以下内容(以192.168.1.1 为例):*.* @@192.168.1.1:514
常见问题和解决方案
rsyslog 常见问题
rsyslog 服务无法启动
当 rsyslog 服务启动失败时,建议排查以下问题:
配置语法校验:执行
rsyslogd -N1 进行配置文件预校验,若执行后无报错输出(仅返回校验完成提示),则代表配置文件语法合规;若存在语法错误,命令会精准返回错误行号与异常类型,可直接定位修正。文件权限核查:若配置校验通过但服务仍无法启动,建议核查 rsyslog 进程对日志输出目录、日志文件及状态缓存目录的读写权限,确保运行 rsyslog 的服务账号(通常为 syslog 或 root)对目标路径拥有合法的访问权限,避免因权限不足导致进程初始化失败。
rsyslog 不接收远程日志
当 rsyslog 无法接收远程日志时,建议排查以下问题:
网络连通性校验:检查系统防火墙规则,确认 rsyslog 监听端口(默认为514,UDP/TCP)未被 iptables、firewalld 等防火墙组件拦截,确保远程日志流量可正常抵达服务端。
服务配置核查:打开 rsyslog 配置文件,确认已显式加载 imudp 或 imtcp 输入模块,且对应的 UDP/TCP 监听服务已完成启用配置,避免因未开启远程监听能力导致外部日志无法接入。
journal 常见问题
journal 日志丢失
若发现 systemd-journald 日志出现丢失现象,可能由以下原因导致,建议针对性优化配置:
存储空间限制:当日志量激增触及默认存储上限时,旧日志会被自动轮转删除。可通过编辑 /etc/systemd/journald.conf,调整 SystemMaxUse 参数(如设置为 500M 或 1G),明确限定 Journal 可占用的最大磁盘空间,平衡存储需求与磁盘压力。
持久化存储缺失:默认情况下,部分发行版的 Journald 仅将日志存储在易失性的内存文件系统(/run/log/journal)中,系统意外崩溃或重启会导致日志彻底丢失。需在配置文件中将 Storage 选项显式设置为 persistent,强制 Journald 在 /var/log/journal 目录下建立持久化存储,确保日志在断电或崩溃后依然可追溯。
注意:修改
/etc/systemd/journald.conf 后,需执行 systemctl restart systemd-journald 重启服务以应用新策略。
journal 日志过大
当 systemd-journald 日志占用空间过大时,建议采取以下策略:
1. 手动执行空间回收:利用 journalctl 工具立即释放磁盘资源。可通过
--vacuum-size 参数按容量阈值清理(如保留最近 500MB),或通过 --vacuum-time 参数按时间窗口清理(如仅保留最近两周数据),快速缓解存储压力。2. 配置自动轮转机制:编辑
/etc/systemd/journald.conf 配置文件,配置 SystemMaxUse 以限制日志集的最大磁盘占用上限,同时配置SystemKeepFree 以确保文件系统始终保留指定的最小空闲空间。注意:修改
/etc/systemd/journald.conf 后,需执行 systemctl restart systemd-journald 重启服务以应用新策略。日志转储
随着系统运行时间的增长,日志文件会持续增大,可能占用大量磁盘空间甚至导致磁盘写满。通过配置日志转储(logrotate),可以自动对日志文件进行轮换、压缩和清理,避免日志文件无限增长,确保系统磁盘空间可回收和日志的可追溯性。
安装 logrotate
logrotate 是一个 Linux 系统中常用的日志转储工具,可以自动对日志文件进行轮换、压缩和删除。执行以下命令安装 logrotate:
dnf install logrotate
配置 logrotate
logrotate 的配置文件通常位于
/etc/logrotate.conf 和 /etc/logrotate.d/ 目录下,可以通过编辑这些文件来配置日志转储的规则。系统中目前的
/etc/logrotate.conf 配置内容如下:weeklyrotate 4createdateextinclude /etc/logrotate.d
该配置文件的各项参数说明如下:
参数 | 说明 |
weekly | 日志转储的时间为每周 |
rotate 4 | 最多存在 4 个备份文件 |
create | 每次转储时都创建新的文件 |
dateext | 使用日期作为转储文件的前缀 |
include /etc/logrotate.d | 包含 /etc/logrotate.d 目录下其他的配置文件 |
此外,还可以通过以下参数设置日志转储的周期和保留策略:
daily:每天转储日志文件。weekly:每周转储日志文件。monthly:每月转储日志文件。rotate N:保留 N 个日志副本,N 是一个整数。其中,
include /etc/logrotate.d 指令会将该目录下的所有配置文件与主配置文件 /etc/logrotate.conf 合并执行。这意味着主配置文件中定义的全局规则适用于所有日志文件,而 /etc/logrotate.d/ 目录下的独立配置文件可以为特定服务或应用定义专属的转储规则。当软件包组件安装时,部分有日志的包也会默认安装其日志转储的配置文件。执行以下命令查看
/etc/logrotate.d 目录下的配置文件:ls /etc/logrotate.d
输出结果如下,可以看到系统中已安装的日志转储配置文件列表:
btmp chrony dnf httpd iptraf-ng iscsiuiolog libvirtd libvirtd.qemu mariadb numad openstack-trove psacct rabbitmq-server wtmp
以下面一个配置文件为例,详细说明 logrotate 配置文件中的基本规则:
/var/log/myapp.log {rotate 7dailymissingoknotifemptycompressdelaycompresspostrotate/usr/bin/systemctl restart myapp.service > /dev/null 2>&1 || trueendscript}
上述配置文件中,定义了对
/var/log/myapp.log 文件进行日志转储的规则,具体说明如下:rotate 7:保留 7 个旧的日志文件,超过 7 个则自动删除。daily:每天执行一次日志转储。missingok:如果日志文件不存在,则忽略错误。notifempty:如果日志文件为空,则不进行转储。compress:使用 gzip 压缩旧的日志文件。delaycompress:在下一次转储时压缩旧的日志文件。postrotate:在转储完成后执行的命令,例如重启服务等。endscript:postrotate 命令的结束标记。手动执行 logrotate
可以使用以下命令手动执行 logrotate,按照配置文件中的规则对所有日志文件进行转储:
logrotate -f /etc/logrotate.conf
自动执行 logrotate
logrotate 服务会在系统启动时自动启动,并按照配置文件中的规则定期执行日志转储操作。
执行以下命令检查 logrotate 服务的状态:
systemctl status logrotate.service
如果 logrotate 服务未启动,执行以下命令启动该服务:
systemctl start logrotate.service
在修改配置文件后,需要重新启动 logrotate 服务才能使新的配置生效。执行以下命令重启服务:
systemctl restart logrotate.service
通过 logrotate 转储 rsyslog 日志
结合使用 rsyslog 和 logrotate 可以带来更高效的日志管理。rsyslog 在接收、处理与存储日志方面具有丰富的功能与高性能,而 logrotate 带来灵活的日志轮换策略以避免资源浪费。通过调整配置,可以实现日志从生成、收集、处理到存储与轮换的全程自动管理,以满足日志保留、审计、故障排查等需求。
配置 logrotate
要配置日志轮换,需要对 logrotate 进行设置。在
/etc/logrotate.d/ 目录下,可以为指定的日志设置 logrotate 配置文件。例如,为 rsyslog 创建名为
rsyslog 的配置文件,执行以下命令:touch /etc/logrotate.d/rsyslog
用文本编辑器打开刚刚创建的文件,添加以下配置内容:
/var/log/cron/var/log/maillog/var/log/messages/var/log/secure/var/log/spooler{dailyrotate 7create}
该配置表示每天转储
/var/log 目录下的这些日志文件,保留最近 7 天的日志副本。设置旋转周期与保留策略
上述日志转储的周期和保留策略参数已在配置 logrotate 部分进行说明。您可以根据实际需求,在
/etc/logrotate.conf 或 /etc/logrotate.d/ 目录下的配置文件中设置相应的转储周期和保留策略。至此,完成 logrotate 转储 rsyslog 系统日志的基本配置。