服务器设置和教程 · 11 2 月, 2026

Ubuntu 服务器如何查看与分析系统日志

在 Ubuntu 服务器(尤其是 20.04 及以上版本)中,系统日志主要由 systemd-journald 管理,使用 journalctl 命令查看和分析日志已成为主流方式。同时,rsyslog 仍负责将部分日志写入传统文本文件(如 /var/log/syslog),形成双轨并存的局面。

本文重点讲解生产环境中最实用、最高效的查看与分析方法,帮助你快速定位故障、监控安全事件、排查性能问题。

一、Ubuntu 日志体系快速概览

  • journald(systemd-journald):现代核心,日志以二进制格式存储在 /var/log/journal/(持久化)或 /run/log/journal/(内存中,重启丢失)。支持结构化查询、实时跟踪、按服务/时间/优先级过滤。
  • rsyslog:传统 syslog 守护进程,将日志转发到 /var/log/ 下的文本文件(如 syslog、auth.log、kern.log),便于 grep 等工具处理。
  • 关系:journald 收集所有日志,rsyslog 可从 journald 导入(默认配置下 ForwardToSyslog=yes),所以很多日志在两边都能看到。

生产环境优先使用 journalctl,因为它功能更强、查询更灵活、支持实时跟踪。

二、journalctl 核心用法(最常用命令)

  1. 查看全部日志(从旧到新) journalctl (输出很长,默认用 less 分页,按 q 退出)
  2. 实时跟踪日志(类似 tail -f) journalctl -f → 适合监控正在发生的错误或服务启动过程。
  3. 只看当前开机以来的日志 journalctl -b → 排查本次启动后的问题最常用。
  4. 查看上一次/指定 boot 的日志 journalctl -b -1(上一次) journalctl –list-boots(列出所有 boot ID) journalctl -b boot-id(指定 ID)
  5. 按服务查看日志 journalctl -u nginx.service journalctl -u mysql -f(实时跟踪 MySQL) → 运维中最常用:出问题先 journalctl -u 服务名 -n 200 -xe(最近 200 行 + 错误解释)
  6. 按时间范围过滤 journalctl –since “2026-02-01” journalctl –since “2 hours ago” –until “now” journalctl –since “today” -u ssh
  7. 按优先级(严重程度)过滤 journalctl -p err -b(只看 error 及以上) journalctl -p warning..emerg(warning 到 emergency) → 快速定位严重问题。
  8. 结合 grep 搜索关键字 journalctl -u nginx | grep -i “error|failed” journalctl –since “1 hour ago” | grep “denied”
  9. 查看内核日志(dmesg 替代) journalctl -k(只内核) journalctl -k -b(本次 boot 内核)

三、传统文本日志查看(/var/log/ 下)

虽然 journalctl 更强大,但很多运维习惯仍看文本文件:

  • /var/log/syslog:系统综合日志(大部分事件) tail -n 100 /var/log/syslog | grep ssh
  • /var/log/auth.log:认证、安全相关(登录失败、sudo 使用) grep “Failed password” /var/log/auth.log | tail -20(暴力破解尝试)
  • /var/log/kern.log:内核消息
  • /var/log/dmesg:启动时硬件/驱动信息(journalctl -k 等价)

查看技巧:

  • tail -f /var/log/syslog(实时)
  • less +F /var/log/auth.log(类似 tail -f,按 Ctrl+C 停止跟踪)

四、日志分析实用技巧与最佳实践

  1. 快速故障定位黄金组合
    • journalctl -b -p err -xe(本次 boot 错误日志 + 解释)
    • journalctl -u 嫌疑服务 -n 300 -f(最近 300 行实时跟踪)
    • journalctl –since “30 minutes ago” -p warning..(最近半小时警告以上)
  2. 日志体积管理(防止 /var 占满)
    • 查看占用:journalctl –disk-usage
    • 清理旧日志:journalctl –vacuum-time=30d(保留 30 天) journalctl –vacuum-size=2G(限制总大小 2GB)
    • 永久设置:编辑 /etc/systemd/journald.conf SystemMaxUse=4G MaxRetentionSec=90day 然后 sudo systemctl restart systemd-journald
  3. 导出日志便于分析 journalctl -u nginx -o json > nginx.json(JSON 格式,喂给 ELK 或脚本) journalctl -o short-iso(带完整时间戳)
  4. 监控暴力破解/异常登录 journalctl -u ssh | grep “Failed” 或 tail -f /var/log/auth.log | grep sshd
  5. rsyslog 状态检查 sudo systemctl status rsyslog 如果日志没写到 /var/log/,检查 /etc/rsyslog.conf 是否有 imjournal 模块启用。

五、总结:服务器日志排查心法

  • 优先 journalctl:功能全面、结构化、易过滤
  • 实时问题 → -f / -u 服务 -f
  • 历史问题 → -b / –since + -p err
  • 安全事件 → auth.log 或 journalctl _COMM=sshd
  • 磁盘告警 → 先 vacuum-time / vacuum-size 清理

熟练掌握 journalctl 后,你能把“服务器出问题了看日志”从半小时缩短到 2-5 分钟。建议把常用组合做成 alias 或小脚本,长期值守时非常省力。