Ubuntu Server 如何查看日志

在Ubuntu Server(尤其是24.04 LTS及后续版本)中,日志系统主要基于 systemd-journald,它从Ubuntu 15.04起已成为默认且最推荐的日志管理机制。与此同时,传统的文本日志文件(/var/log/目录下)仍然存在,许多服务会同时写入journal和传统文件,形成双轨制。

理解两种日志机制的区别与互补关系,是高效排查问题的关键。

一、现代日志系统:systemd-journald 与 journalctl

核心原理

  • systemd-journald 是systemd套件的一部分,作为一个二进制、结构化日志守护进程运行。
  • 它收集来自内核、systemd服务、syslog兼容程序(rsyslog仍可选安装)、stdout/stderr等几乎所有来源的日志。
  • 日志以二进制格式存储,支持字段化查询(时间、单元、服务、优先级、进程ID、用户ID、传输方式等),避免了传统文本日志的解析开销和格式不一致问题。
  • 默认存储位置:
    • 运行时(volatile):/run/log/journal(tmpfs,重启丢失)
    • 持久化(persistent):/var/log/journal(需手动创建目录或配置启用)

在Ubuntu Server 24.04+ 默认安装中,持久化存储通常已启用(/var/log/journal 存在),但空间受限时会自动清理旧日志。

journalctl 最常用查看方式

journalctl 是 journald 的查询客户端,几乎所有生产环境日志排查都从它开始。

基础用法(按时间倒序列出,越新越靠前):

  • 查看全部日志(从最早开始,适合管道过滤) journalctl
  • 实时跟踪(类似 tail -f,最常用场景) journalctl -f
  • 只看本次启动后的日志(排查开机后问题) journalctl -b 或指定第几次启动:journalctl -b -1(上一次)
  • 只看内核日志(等价于 dmesg,但支持时间过滤) journalctl -k 或 journalctl -k -f(实时内核消息)
  • 查看特定服务日志(最实用) journalctl -u nginx.servicejournalctl -u ssh.service -f(实时跟踪SSH登录尝试)
  • 按时间范围过滤 journalctl --since "2026-02-01 09:00:00" --until "2026-02-02 18:00:00" 支持相对时间:--since "2 hours ago"、--since yesterday
  • 按优先级过滤(emerg、alert、crit、err、warning、notice、info、debug) journalctl -p err(只显示错误及以上) journalctl -p warning..emerg(范围)
  • 组合过滤(强大查询能力) journalctl -u nginx.service -u php8.3-fpm.service --since "today" -p errjournalctl _COMM=sshd(只看sshd进程) journalctl SYSLOG_IDENTIFIER=nginx(传统syslog标识)
  • 额外解释信息(推荐加 -x) journalctl -u docker.service -xe(-x 显示事件解释,如依赖失败原因)
  • 磁盘使用与清理 查看占用:journalctl --disk-usage 限制大小(永久生效):编辑 /etc/systemd/journald.conf
    text
    SystemMaxUse=500M
    SystemKeepFree=2G

    然后 sudo systemctl restart systemd-journald 一次性清理:sudo journalctl --vacuum-size=300M 或 --vacuum-time=2weeks

二、传统文本日志(/var/log/ 目录)

尽管journald已成为主流,许多服务仍通过rsyslog(或兼容实现)同时写入纯文本文件,便于grep、awk等工具处理。

常见文件位置与含义:

  • /var/log/syslog → 系统综合日志(大部分服务消息)
  • /var/log/auth.log → 认证相关(SSH登录、sudo、pam等,最常查暴力破解)
  • /var/log/kern.log → 内核日志(与 journalctl -k 内容重合)
  • /var/log/dmesg → 内核环形缓冲区快照(开机早期硬件信息)
  • /var/log/messages → 部分发行版有,Ubuntu通常用syslog替代
  • /var/log/apache2/ → Apache/Nginx日志目录(access.log / error.log)
  • /var/log/mysql/ → MySQL/PostgreSQL错误日志
  • /var/log/audit/audit.log → auditd安全审计日志(若启用)

查看方式(经典组合):

  • 实时跟踪:sudo tail -f /var/log/auth.log 或 sudo tail -n 100 /var/log/syslog
  • 搜索关键词:sudo grep -i "error\|fail\|denied" /var/log/syslog
  • 查看最近100行:sudo tail -n 100 /var/log/nginx/error.log
  • 大文件分页:sudo less +F /var/log/syslog(F键进入跟踪模式)

journald vs 传统文件对比

特性journalctl (journald)/var/log/*.log (rsyslog等)
存储格式二进制 + 结构化字段纯文本
查询能力极强(多字段组合、优先级、时间)依赖 grep/awk/sed
持久化默认可配置(通常启用)持久
重启前日志支持(-b -1 等)支持
内核日志支持(-k)部分(kern.log / dmesg)
磁盘占用控制内置 vacuum / MaxUse 配置需 logrotate
推荐优先级生产环境首选辅助 + 兼容旧脚本

三、其他常用日志查看工具

  • dmesg:查看内核环形缓冲区(重启后清空) dmesg | tail -n 50dmesg --follow(实时) dmesg -T(人类可读时间戳)
  • systemctl status:快速看服务最近几十行日志 + 状态 systemctl status nginx(包含 journal 日志片段)
  • less +Fmultitail:多文件实时跟踪(需安装)

四、排查问题时的推荐流程

  1. 先确定问题类型(服务?内核?认证?网络?)
  2. 用 journalctl -u 问题服务 -xe 或 -f 看实时/最近错误
  3. 补充时间范围 --since "1 hour ago"
  4. 若涉及内核/硬件,用 journalctl -k 或 dmesg -T
  5. 认证/登录问题必看 journalctl -u ssh 或 grep sshd /var/log/auth.log
  6. 磁盘/空间问题先查 journalctl --disk-usage 和 du -sh /var/log/*

掌握 journalctl 的过滤语法后,大多数线上问题能在几秒内定位到关键日志行,比翻找文本文件效率高数倍。

需要更细粒度的日志保留策略、安全审计或集中化管理(ELK、Loki、Graylog)时,再考虑扩展。日常运维,journalctl + 少量传统文件已足够强大。

THE END