Ubuntu 服务器查看与分析系统日志指南
Ubuntu Server(24.04 LTS / 26.04 LTS)默认采用 systemd-journald 作为核心日志系统,同时保留 rsyslog 作为传统 syslog 实现,提供向后兼容和文本文件输出。 这种双轨制设计让日志既有结构化查询能力(journalctl),又有熟悉的纯文本文件(/var/log/*)。
1. 日志系统架构快速概览
- journald(systemd-journald.service): 二进制存储(高效、结构化、可查询)、默认 volatile(/run/log/journal,重启丢失),生产推荐 persistent(/var/log/journal) 优点:时间/服务/优先级/字段精确过滤、JSON 输出、跨 boot 查看
- rsyslog(rsyslog.service): 接收 journald 日志(通过 imjournal 模块),按规则写入 /var/log/syslog、auth.log 等文本文件 优点:传统 tail -f、grep 友好、易转发到远程服务器或 SIEM
- 关系:journald → rsyslog → /var/log 文件(大多数发行版默认配置)
查看当前状态:
Bash
systemctl status systemd-journald
systemctl status rsyslog2. 推荐生产配置:启用持久化 journal
默认 volatile 模式下,重启丢失日志。生产服务器强烈建议持久化。
Bash
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
# 或直接编辑配置文件
sudo systemctl edit systemd-journald
# 添加内容:
[Journal]
Storage=persistent
SystemMaxUse=4G # 最大占用(根据磁盘调整,建议 1–10G)
SystemMaxFileSize=500M
MaxRetentionSec=4weeks # 或按时间保留
Compress=yes
SyncIntervalSec=1m # 同步频率,平衡性能与可靠性重启服务生效:
Bash
sudo systemctl restart systemd-journald检查是否持久化:
Bash
ls /var/log/journal # 有子目录(machine-id)即成功3. journalctl 核心查看方式(最强大工具)
| 场景 | 命令示例 | 说明与技巧 |
|---|---|---|
| 查看所有日志(从旧到新) | journalctl | 默认分页,按 q 退出;空格翻页,↑↓ 滚动 |
| 最新日志优先(逆序) | journalctl -r | 类似 tail,常用于快速看最近问题 |
| 实时跟踪(= tail -f) | journalctl -f | 生产最常用,按 Ctrl+C 退出 |
| 当前 boot 日志 | journalctl -b 或 journalctl -b 0 | -b 等价于 -b 0(本次启动) |
| 上次 boot 日志 | journalctl -b -1 | -2、-3… 更早的启动;先 journalctl –list-boots 看所有 boot ID |
| 指定时间范围 | journalctl –since “2026-02-20 09:00” –until “2026-02-25 18:00” | 支持 yesterday、1 hour ago、2026-02-25 10:00:00 等自然时间 |
| 某个服务日志 | journalctl -u nginx -u php8.3-fpm 或 journalctl -u ssh | 多服务用多个 -u;-u ssh.service 可省略 .service |
| 优先级过滤(错误 & 以上) | journalctl -p err -b 或 journalctl -p 3 | 优先级:emerg(0)、alert(1)、crit(2)、err(3)、warning(4)、notice(5)、info(6)、debug(7) |
| 只看内核日志 | journalctl -k 或 dmesg -T | -k = –dmesg;-T 加人类可读时间戳 |
| 实时 + 服务 + 优先级 | journalctl -u nginx -f -p warning | 组合使用最实用 |
| JSON 结构化输出(给脚本/SIEM) | journalctl -o json-pretty -n 100 或 `journalctl -o json | jq` |
常用组合拳(生产最常敲):
Bash
# 最近 100 行错误日志
journalctl -p err -n 100 -r
# nginx 服务最近 1 小时警告以上 + 实时跟踪
journalctl -u nginx --since "1 hour ago" -p warning -f
# 查找特定关键词(忽略大小写)
journalctl | grep -i -E "error|fail|denied|crash"
# 认证失败(暴力破解排查)
journalctl -u ssh --since "yesterday" | grep -i "failed password"
# 查看 journald 自身状态与错误
journalctl -u systemd-journald4. 传统文本日志(rsyslog 输出文件)
即使启用 journald,rsyslog 仍会生成经典文件,便于 tail/grep/脚本。
常见位置:
- /var/log/syslog:系统综合日志(最全)
- /var/log/auth.log:认证、sudo、SSH、cron 等安全事件
- /var/log/kern.log:内核消息
- /var/log/dmesg:启动时内核环形缓冲(dmesg 命令同源)
- /var/log/messages:部分系统消息(Ubuntu 常与 syslog 合并)
- 应用日志:/var/log/nginx/、/var/log/apache2/、/var/log/mysql/ 等
实时监控:
Bash
tail -f /var/log/syslog
tail -f /var/log/auth.log | grep -i fail
multitail /var/log/syslog /var/log/auth.log # 多文件同时 tail(需安装 multitail)5. 日志分析与高级技巧
- 关键词暴力搜索:Bash
journalctl --since "2 days ago" | grep -i -C 5 "segfault|oom|killed" - 统计出现次数(快速定位高频错误):Bash
journalctl -b | grep -o -i "error" | wc -l journalctl -u nginx | awk '{print $5}' | sort | uniq -c | sort -nr | head -20 # IP 访问统计示例 - 导出日志(给同事/存档):Bash
journalctl -u nginx --since "2026-02-20" > nginx-logs-20260220.txt journalctl -o json --since "yesterday" | gzip > journal-$(date +%F).json.gz - 清理与空间管理:Bash
journalctl --disk-usage # 查看占用 sudo journalctl --vacuum-time=4weeks # 保留 4 周 sudo journalctl --vacuum-size=2G # 限制总大小 2GB
6. 生产最佳实践建议
- 始终启用 persistent journal + 合理限额(4G–10G 常见)
- 服务日志优先用 journalctl -u 服务名 -f -p warning
- 安全事件固定监控 /var/log/auth.log + journalctl -u ssh
- 结合 fail2ban、logwatch 或 needrestart 自动化告警
- 大规模环境:rsyslog 转发到中央服务器(ELK、Loki、Graylog、Splunk)
- 避免直接编辑 /var/log/journal 文件夹,手动清理用 journalctl 命令
掌握 journalctl 后,排查问题从“翻文件”变成“精准查询”,效率提升数倍。