Ubuntu 服务器查看与分析系统日志指南

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 rsyslog

2. 推荐生产配置:启用持久化 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 jsonjq`

常用组合拳(生产最常敲):

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-journald

4. 传统文本日志(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 后,排查问题从“翻文件”变成“精准查询”,效率提升数倍。

Telegram
Telegram服务器销售@IDCSELL