Ubuntu 运维系列 | 第 10 天:日志管理与审计——journald、rsyslog 与日志轮转

日志是运维人员最忠实的”战友”。当服务突然崩溃、用户反馈访问变慢、系统莫名重启时,第一时间要做的不是重启服务,而是翻看日志。一套清晰、完整、可检索的日志体系,能让排障时间从”半天”缩短到”几分钟”。Ubuntu 作为主流的服务器操作系统,内置了 systemd 的 journald、传统的 rsyslog 以及 logrotate 三大日志基础设施。本文将从零讲清这三者的定位、配置方法、常用排查命令与日志轮转策略,帮助你建立一套可持续运行的日志管理与审计体系。

Ubuntu 运维 第10天

一、日志体系的三层架构

在动手配置之前,先理解 Ubuntu 日志体系的整体结构,避免”只知道命令不知道原理”的尴尬。

1. journald:systemd 的原生日志

journald 是 systemd 自带的日志服务,通过 systemd-journald.service 运行。它不依赖传统的纯文本文件,而是将日志以二进制格式存储在 /var/log/journal/ 目录下。它的优势在于:

  • 结构化存储:每条日志都带时间戳、进程、优先级、systemd unit 等元数据。
  • 自动关联:可以按服务单元(unit)筛选日志,例如只看 nginx.service 的输出。
  • 崩溃前日志不丢失:即便系统突然断电,也能保留内核与服务的最后输出。

我们可以用 journalctl 命令读取 journald 日志。下面这条命令可以查看本次开机以来的所有日志:

journalctl -b

2. rsyslog:经典的 syslog 日志服务

rsyslog 是传统 syslog 的增强实现,负责把各种来源的日志按规则写入文本文件。Ubuntu 中它作为 rsyslog.service 运行,默认把日志写入 /var/log/ 目录,比如系统消息写入 /var/log/syslog,认证相关写入 /var/log/auth.log

rsyslog 与 journald 的分工是:journald 负责”收集与短期留存”,rsyslog 负责”持久化到文本文件”并支持转发到远程服务器。两者通过一个 socket 协同,rsyslog 默认会从 journald 读取日志。

3. logrotate:日志轮转与清理

如果日志只写不删,磁盘迟早会被撑爆。logrotate 就是专门解决这个问题的工具,它通过 cron 每日运行,按照规则对日志文件进行轮转(rotate)、压缩(compress)、保留(rotate N)与清理。

这三者组成了一个完整链条:journald 收集 → rsyslog 落盘 → logrotate 轮转清理

二、journald 实战:核心命令与配置

1. 常用查询命令

journalctl 是排查问题的利器,掌握下面几个高频用法能大幅提升效率:

# 查看指定服务的日志
journalctl -u nginx.service

# 查看指定服务本次启动以来的日志
journalctl -u nginx.service -b

# 实时跟踪日志(类似 tail -f)
journalctl -f

# 按时间范围过滤
journalctl --since "2026-09-05 08:00:00" --until "2026-09-05 09:00:00"

# 按优先级过滤(0=emerg 到 7=debug)
journalctl -p err -b

# 查看内核日志
journalctl -k -b

其中 -p err 是快速定位错误的利器,先看错误级别日志,再逐步放宽到 warningnotice

2. 配置 journald 持久化

默认情况下,Ubuntu 的 journald 日志存储在内存(tmpfs)中,重启后丢失。生产环境建议开启持久化存储,让日志写入磁盘:

# 创建持久化目录
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald

持久化之后,可以通过修改 /etc/systemd/journald.conf 控制日志占用的磁盘空间:

[Journal]
Storage=persistent
SystemMaxUse=500M
SystemKeepFree=1G
SystemMaxFileSize=50M
MaxRetentionSec=2week

配置说明:

  • SystemMaxUse:日志最多占用的磁盘空间上限。
  • SystemKeepFree:至少为系统保留的剩余空间,防止日志撑满磁盘。
  • MaxRetentionSec:日志最长保留时间,超过即删除。

修改后记得重启服务生效:

sudo systemctl restart systemd-journald

三、rsyslog 实战:规则与远程转发

1. 理解 rsyslog 配置

rsyslog 的主配置文件是 /etc/rsyslog.conf,它通过 $IncludeConfig 引入 /etc/rsyslog.d/ 下的子配置。默认的日志分流规则写在 /etc/rsyslog.d/50-default.conf 中,典型的规则长这样:

auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
kern.*                          -/var/log/kern.log
mail.*                          -/var/log/mail.log

规则的格式是 facility.priority 目标facility 表示日志来源类别(auth、kern、mail、daemon 等),priority 表示最低记录级别。目标可以是文件、远程服务器、命名管道等。文件名前的 - 表示写入时不做磁盘同步(异步写,性能更好)。

2. 自定义规则:把 nginx 日志单独存一份

假设你想让 nginx 的错误日志也写入一份独立文件,可以在 /etc/rsyslog.d/ 下新建配置文件:

# /etc/rsyslog.d/30-nginx.conf
local7.*                        /var/log/nginx-custom.log

然后重启 rsyslog 并让 nginx 把错误日志发到 syslog 的 local7 facility:

sudo systemctl restart rsyslog

nginx 配置侧则使用:

error_log syslog:server=unix:/dev/log,facility=local7,tag=nginx;

这样 nginx 错误日志就会统一进入 rsyslog 体系,便于后续轮转与集中管理。

3. 远程日志转发

对于多台服务器,建议将日志集中到一台日志服务器上。配置 rsyslog 作为发送端:

# 发送到远程服务器 10.0.0.10 的 514 端口(UDP)
*.* @10.0.0.10:514
# 使用 TCP 传输(更可靠)
*.* @@10.0.0.10:514

@ 表示 UDP,@@ 表示 TCP。生产环境推荐 TCP,避免日志在传输中丢失。接收端则需要取消 /etc/rsyslog.conf 中相关模块的注释,开启监听。

四、logrotate 实战:让磁盘永远够用

1. 理解轮转规则

logrotate 的全局配置在 /etc/logrotate.conf,各服务的独立配置放在 /etc/logrotate.d/ 目录。以 nginx 为例,/etc/logrotate.d/nginx 通常是这样的:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

各参数含义:

  • daily:每天轮转一次,也可设为 weeklymonthlysize 100M
  • rotate 14:保留 14 份历史日志,超过则删除最旧的。
  • compress:轮转后压缩为 .gzdelaycompress 表示延迟一个周期再压缩。
  • notifempty:空日志不轮转。
  • create 0640 www-data adm:轮转后以指定权限和属主新建空日志文件。
  • postrotate/endscript:轮转后执行的脚本,这里向 nginx 发送 USR1 信号使其重新打开日志文件。

2. 手动测试与强制轮转

配置修改后,先做一次”干跑”(debug)确认没有语法错误,不会真正轮转:

sudo logrotate -d /etc/logrotate.conf

确认无误后,可以强制轮转一次看效果:

sudo logrotate -f /etc/logrotate.conf

3. 为自定义应用添加轮转

假如你的应用日志在 /var/log/myapp/app.log,可以新建 /etc/logrotate.d/myapp

/var/log/myapp/*.log {
    weekly
    rotate 8
    compress
    missingok
    notifempty
    copytruncate
}

copytruncate 通过复制后截断原文件的方式轮转,适合没有”重新打开日志文件”能力的应用,避免因移动文件导致日志句柄失效。

五、常见问题与排查思路

问题 1:磁盘被日志写满怎么办?

先用 df -h 确认占用,再用 du -sh /var/log/* 找到最大的文件:

df -h
sudo du -sh /var/log/* | sort -h | tail -n 10

如果 journald 占用过大,可执行 sudo journalctl --vacuum-size=200M 立即清理;如果是某个应用日志失控,先停掉写入再分析原因,必要时调低日志级别。

问题 2:journalctl 提示权限不足

journalctl 默认只允许 admsystemd-journal 组的用户读取所有日志。把普通运维账号加入 adm 组即可:

sudo usermod -aG adm youruser

问题 3:日志时间与服务器时间不一致

日志时间戳依赖系统时区,执行 timedatectl 检查并设置时区:

timedatectl
sudo timedatectl set-timezone Asia/Shanghai

六、总结

日志管理是运维的基本功,本文覆盖了 Ubuntu 日志体系的三大支柱:

  1. journald 负责结构化收集与短期留存,journalctl 是排障第一工具。
  2. rsyslog 负责文本持久化与远程集中,规则清晰、可扩展。
  3. logrotate 负责轮转压缩与空间治理,让日志”只留该留的”。

三者协同,才能构建一套完整、可审计、不失控的日志体系。建议你从现在开始,为每台服务器开启 journald 持久化、为关键应用配置独立日志规则,并定期检查轮转是否生效。日志管好了,半夜被报警电话叫醒的概率会大大降低。

下期预告:第 11 天我们将进入网络的世界——《网络配置与排障——Netplan 与网络诊断工具实战》,掌握 Ubuntu 的网络配置文件、IP 管理以及 ping、traceroute、ss 等排障工具的用法,敬请期待。

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容