第十三篇:《系统日志管理与故障排查:journalctl、rsyslog、logrotate》 日志是系统的“黑匣子”。当服务器出现故障时日志往往是第一手线索。但在实践中日志管理面临两个典型困境日志太多找不到关键信息或者日志太大把磁盘写满。本文系统讲解 Linux 日志体系的三层架构systemd-journald内核与系统日志、rsyslog日志分流与转发和 logrotate日志轮转与压缩。掌握这套体系你既能高效检索日志又能避免“日志写满磁盘”的经典事故。一、systemd-journald系统日志的“中央收集站”systemd-journald 是 systemd 体系下的日志服务它收集来自内核、系统服务、应用程序的日志并将其存储为结构化二进制格式而非纯文本。这使得日志查询速度极快且支持丰富的过滤条件。1.1 查看日志journalctl 核心用法journalctl 是与 journald 交互的命令行工具是排查系统问题的第一站。查看所有日志按时间顺序最新在最后 journalctl实时跟踪日志类似 tail -fjournalctl-f查看特定服务Unit的日志journalctl-unginx journalctl-udocker按时间过滤# 从 10 分钟前开始显示journalctl--since10 minutes ago# 显示今天 14:00 到 15:00 之间的日志journalctl--since2025-01-15 14:00:00--until2025-01-15 15:00:00# 显示今天的日志journalctl--sincetoday按优先级过滤0emerg, 1alert, 2crit, 3err, 4warning, 5notice, 6info, 7debug# 只显示错误级别及以上0-3journalctl-perr# 显示警告级别及以上0-4journalctl-pwarning查看内核日志等价于 dmesgjournalctl-k查看上次启动以来的日志可用于分析系统重启原因bashjournalctl-b-11.2 日志持久化配置默认情况下journald 将日志存储在 /run/log/journal/内存文件系统重启后丢失。要持久化存储需创建目录并调整配置# 创建持久化日志目录sudomkdir-p/var/log/journalsudosystemctl restart systemd-journald# 验证持久化已启用ls-la/var/log/journal/ 配置日志大小限制/etc/systemd/journald.conf ini[Journal]# 日志最大占用磁盘空间默认 10% 分区大小最大 4GBSystemMaxUse8G# 单日志文件最大大小SystemMaxFileSize500M# 保留的日志文件数量MaxRetentionSec30day# 压缩日志节省空间Compressyes修改后重启服务sudo systemctl restart systemd-journald。1.3 journalctl 实战定位 OOM 问题当系统发生 OOM内存溢出时journalctl 是查找原因的第一选择# 搜索 OOM 相关日志journalctl-k|grep-iout of memory-A10# 查看重启前的日志分析崩溃原因journalctl-b-1|grep-ioom二、rsyslog日志的分流与转发systemd-journald 是“采集端”而 rsyslog 是“处理端”。它负责将日志按规则写入不同文件、转发到远程服务器、或进行格式转换。2.1 核心配置文件结构/etc/rsyslog.conf主配置文件/etc/rsyslog.d/自定义配置目录推荐在此添加规则一个典型的 rsyslog.conf 包含text加载模块module(load“imuxsock”) # 从 systemd-journald 接收本地日志module(load“imklog”) # 接收内核日志全局规则.info;mail.none;authpriv.none;cron.none /var/log/messagesauthpriv./var/log/securemail.* /var/log/maillogcron.* /var/log/cron*.emerg *2.2 常用日志文件及其用途2.3 日志分流示例自定义规则在 /etc/rsyslog.d/nginx.conf 中创建独立规则将 Nginx 日志写入单独文件text仅当 Nginx 服务产生日志时写入特定文件if $programname ‘nginx’ then /var/log/nginx/nginx.log stop2.4 远程日志转发集中日志收集将日志发送到远程日志服务器如 ELK 或 Loki 的前端收集器text在 /etc/rsyslog.d/remote.conf 中配置.192.168.1.100:514 # TCP 转发或使用 UDP一个 .192.168.1.100:514三、logrotate防止“日志写满磁盘”的最后防线日志文件如果不做轮转rotate会无限增长最终占满磁盘。logrotate 是 Linux 上管理日志轮转的标准工具。3.1 核心配置文件/etc/logrotate.conf全局配置/etc/logrotate.d/各服务的独立配置一个典型的 Nginx logrotate 配置/etc/logrotate.d/nginxtext/var/log/nginx/.log {daily # 每天轮转missingok # 若日志文件不存在不报错rotate 7 # 保留最近 7 个轮转文件compress # 压缩旧日志.gzdelaycompress # 延迟压缩保留最近一个未压缩便于查看notifempty # 日志为空则不轮转create 0640 nginx nginx # 创建新日志文件的权限与属主postrotate[ -f /var/run/nginx.pid ] kill -USR1cat /var/run/nginx.pidendscript}3.2 手动测试 logrotate# 强制运行一次 logrotate-f 强制sudologrotate-f/etc/logrotate.d/nginx# 调试模式查看会做什么但不实际执行sudologrotate-d/etc/logrotate.d/nginx3.3 logrotate 的常见问题四、实战案例磁盘突然写满定位“未释放的已删除文件”现象df -h 显示 /var 分区使用率 100%但 du -sh /var/* 计算出的总和远小于分区使用量。排查步骤检查是否有被删除但仍被进程打开的文件lsofL1L1 显示所有已删除(deleted)但仍被进程打开的文件。输出中 SIZE 列显示文件大小PID 列显示哪个进程持有该文件句柄。确认是哪个日志文件例如 nginx.log 被删除了但 nginx 还在持续写入。处理方式方案一重启该服务让进程释放文件句柄简单直接生产需评估影响。方案二清空该文件描述符不推荐操作风险较高/proc/PID/fd/FD_NUMBER五、日志分析的最佳实践统一时区确保所有服务器使用 UTC 或同一时区便于关联分析。结构化日志应用日志尽量输出 JSON 格式便于后续接入 ELK/Loki 进行检索。日志级别控制生产环境使用 INFO 或 WARNING避免 DEBUG 海量日志。保留周期根据磁盘容量和合规要求设定保留周期如 30 天或 90 天。集中收集在多服务器环境中务必配置远程日志转发避免逐个登录查看。六、小结journalctl 是 systemd 时代查看日志的标准工具支持按时间、服务、优先级高效过滤。rsyslog 负责日志分流、转发和格式转换建议将不同服务的日志写入独立文件。logrotate 是防止磁盘写满的关键机制确保配置了合理的轮转周期如 daily rotate 7。当磁盘被“幽灵日志”占满时用 lsof L1 定位被删除但未释放的文件句柄。