原标题: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。