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.conftext
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 +F 或 multitail:多文件实时跟踪(需安装)
四、排查问题时的推荐流程
- 先确定问题类型(服务?内核?认证?网络?)
- 用 journalctl -u 问题服务 -xe 或 -f 看实时/最近错误
- 补充时间范围 --since "1 hour ago"
- 若涉及内核/硬件,用 journalctl -k 或 dmesg -T
- 认证/登录问题必看 journalctl -u ssh 或 grep sshd /var/log/auth.log
- 磁盘/空间问题先查 journalctl --disk-usage 和 du -sh /var/log/*
掌握 journalctl 的过滤语法后,大多数线上问题能在几秒内定位到关键日志行,比翻找文本文件效率高数倍。
需要更细粒度的日志保留策略、安全审计或集中化管理(ELK、Loki、Graylog)时,再考虑扩展。日常运维,journalctl + 少量传统文件已足够强大。
版权声明:
作者:后浪云
链接:https://idc.net/help/442437/
文章版权归作者所有,未经允许请勿转载。
THE END
