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

一、日志体系的三层架构
在动手配置之前,先理解 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 是快速定位错误的利器,先看错误级别日志,再逐步放宽到 warning、notice。
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:每天轮转一次,也可设为weekly、monthly或size 100M。rotate 14:保留 14 份历史日志,超过则删除最旧的。compress:轮转后压缩为.gz,delaycompress表示延迟一个周期再压缩。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 默认只允许 adm 或 systemd-journal 组的用户读取所有日志。把普通运维账号加入 adm 组即可:
sudo usermod -aG adm youruser
问题 3:日志时间与服务器时间不一致
日志时间戳依赖系统时区,执行 timedatectl 检查并设置时区:
timedatectl
sudo timedatectl set-timezone Asia/Shanghai
六、总结
日志管理是运维的基本功,本文覆盖了 Ubuntu 日志体系的三大支柱:
- journald 负责结构化收集与短期留存,
journalctl是排障第一工具。 - rsyslog 负责文本持久化与远程集中,规则清晰、可扩展。
- logrotate 负责轮转压缩与空间治理,让日志”只留该留的”。
三者协同,才能构建一套完整、可审计、不失控的日志体系。建议你从现在开始,为每台服务器开启 journald 持久化、为关键应用配置独立日志规则,并定期检查轮转是否生效。日志管好了,半夜被报警电话叫醒的概率会大大降低。
下期预告:第 11 天我们将进入网络的世界——《网络配置与排障——Netplan 与网络诊断工具实战》,掌握 Ubuntu 的网络配置文件、IP 管理以及 ping、traceroute、ss 等排障工具的用法,敬请期待。















暂无评论内容