原标题:Linux日志
Linux 系统日志主要分两大流派,现代发行版(包括 Debian/Ubuntu)通常两者并存:
1. /var/log(传统文本日志)
基于文件的日志目录,各服务/程序把日志写成纯文本文件,用 cat、less、tail -f 等工具直接查看。
常见文件:
/var/log/syslog(Debian/Ubuntu)或/var/log/messages(RHEL系)—— 系统级通用日志/var/log/auth.log—— 认证、sudo、SSH 登录记录/var/log/kern.log—— 内核消息/var/log/nginx/access.log、/var/log/nginx/error.log—— nginx 自己维护的日志(不经过 systemd)/var/log/dpkg.log、/var/log/apt/history.log—— 包管理记录
特点:持久化在磁盘、纯文本、可以用 grep/awk/sed 随意处理,配合 logrotate 做轮转和压缩。
2. journalctl(systemd-journald 的日志系统)
systemd 引入的结构化二进制日志,存储在 /var/log/journal/(持久化,需要该目录存在)或 /run/log/journal/(仅内存/临时,重启丢失)。
常用命令:
journalctl # 查看全部日志
journalctl -f # 实时跟踪,类似 tail -f
journalctl -b # 本次启动以来的日志
journalctl -b -1 # 上一次启动的日志
journalctl -p err # 只看 error 级别及以上
journalctl --since "1 hour ago" --until "now"
journalctl -k # 内核日志(等价 dmesg)
journalctl --disk-usage # 查看日志占用空间
journalctl --vacuum-size=500M # 清理到指定大小以内
3. journalctl -u nginx
u是按 systemd unit 过滤,只看 nginx 这个服务单元产生的日志(即 systemd 从 nginx 进程的 stdout/stderr 捕获、以及服务启停时 systemd 自身记录的状态变化)。-u是 Unit(systemd 单元)
需要注意的是:nginx 的 access.log / error.log 内容通常不会出现在 journalctl 里,因为 nginx 默认直接把日志写到 /var/log/nginx/ 下的文件,而不是走 systemd 的日志转发。journalctl -u nginx 主要看到的是:
journalctl -u nginx # nginx 服务本身的启停、reload、失败等 systemd 层面事件
journalctl -u nginx -f # 实时跟踪
journalctl -u nginx --since today
journalctl -u nginx -n 50 # 最后50条
如果想让 nginx 的访问/错误日志也进 journal,需要在 nginx 配置里把 error_log/access_log 指向 syslog:server=unix:/dev/log,或者用 error_log syslog:server=unix:/dev/log,facility=local7,tag=nginx; 这类写法,才能被 journald 收集并用 journalctl -t nginx 之类的方式查看。
两者关系速记
| /var/log | journalctl | |
|---|---|---|
| 格式 | 纯文本 | 结构化二进制 |
| 存储 | 各服务自行决定 | 统一由 journald 管理 |
| 查询能力 | 靠 grep 等文本工具 | 支持按时间/优先级/unit/boot 等结构化过滤 |
| 持久性 | 默认持久(受 logrotate 管理) | 默认可能只在内存,需配置 Storage=persistent 才落盘 |
潜在风险/坑点:
- journal 默认可能没有持久化(
/var/log/journal目录不存在时数据只在内存,重启后丢失),需要mkdir -p /var/log/journal并重启 systemd-journald 才会持久化。 - journal 二进制日志如果不设置
SystemMaxUse之类的限制,可能无限增长占满磁盘。 journalctl -u nginx容易让人误以为能看到 access/error 日志内容,实际上默认看不到,容易排查故障时找错地方。- 混用两套日志系统时,时间线对不上会增加排障难度,建议明确哪些服务走 syslog、哪些走 journal。
如果这篇文章对你有帮助,点个赞吧。


