Linux 怎么查看日志?tail / journalctl / /var/log
答案:应用文本日志用 tail -F 跟踪 + grep 过滤;systemd 管理的服务用 journalctl -u <服务>;系统级日志看 /var/log/syslog(Debian) 或 /var/log/messages(RHEL)。journal 是二进制,只能用 journalctl 读。
一、文本日志:tail / less / grep
tail -f /var/log/nginx/error.log # 实时跟踪末尾
tail -F /var/log/app.log # 推荐:文件被 logrotate 切走后自动重开
tail -n 200 app.log # 看最后 200 行
grep -n 'ERROR\|timeout' app.log # 关键词过滤(-n 带行号)
grep -C 3 'panic' app.log # 命中行前后各 3 行上下文
less +F app.log # less 的跟踪模式,Ctrl+C 可回滚搜索
tail -f *.log | grep --line-buffered ERR # 多文件 + 过滤排查会被轮转的活跃日志用大写
-F(等同--follow=name --retry):-f跟随文件描述符,logrotate 把文件改名新建后它还盯着旧 inode;-F按文件名重连,新日志不会漏。
二、systemd 服务日志:journalctl
journalctl -u nginx # 指定 unit 的全部日志
journalctl -u nginx -f # 实时跟踪该服务
journalctl -u nginx.service -u php-fpm.service --since today # 多服务
journalctl -xe # 最近日志 + 跳转到报错处带解释
journalctl -p err -b # 本次启动(-b)以来 error 及以上
journalctl --since "1 hour ago"
journalctl --since "2026-09-17 09:00" --until "09:30"
journalctl -k # 仅内核日志(等价 dmesg 视角)
journalctl --no-pager -o short-iso # 脚本里:不分页、带时间戳| 常用组合 | 用途 |
|---|---|
-u 服务 | 限定某个 unit |
-f | 实时 |
--since/--until | 时间窗 |
-p err/warning | 日志级别 |
-b / -b -1 | 本次 / 上次启动 |
_PID=123 | 按进程元数据过滤 |
服务"起不来"的标准动作:
systemctl status xxx末尾会显示最近几行,再journalctl -u xxx -xe --since "10 min ago"看完整堆栈。崩溃重启加-b区分是否跨了重启。
三、/var/log 常见文件
| 文件 | 内容 | 发行版 |
|---|---|---|
syslog / messages | 系统综合日志 | Debian/Ubuntu、RHEL/CentOS |
kern.log | 内核(OOM、驱动、IO 错误) | Debian;通用可 dmesg -T |
auth.log / secure | 登录、sudo、认证失败 | Debian / RHEL |
dmesg(命令) | 内核环形缓冲区,开机与硬件信息 | 通用 |
| 应用各自目录 | nginx、mysql、容器等自己的 .log | 通用 |
dmesg -T | grep -i 'killed process' # 查 OOM(-T 加人类可读时间)
journalctl -k | grep -i oom
grep 'Failed password' /var/log/auth.log # 爆破尝试四、常见坑
- journal 不能直接 cat:
/var/log/journal/...是二进制,乱码正常,必须journalctl。 - 日志被轮转后 tail 没新内容:换
-F,或确认应用写到新文件还是旧 inode。 - 磁盘被日志撑爆:
journalctl --disk-usage看占用,journalctl --vacuum-size=200M/--vacuum-time=7d清理 journal,文本日志靠 logrotate(见磁盘空间 FAQ)。 - 时间对不上:跨时区/容器用
-o short-iso或--utc,确认机器时区与时间同步。
FAQ
Q: 实时看日志? A: tail -f,会被轮转的日志用 -F 自动重连,配 grep 过滤。
Q: systemd 服务日志? A: journalctl -u 服务,加 -f 跟踪、--since 按时间、-p err 按级别、-xe 查最近报错。
Q: 系统日志在哪? A: Debian /var/log/syslog、RHEL /var/log/messages,内核用 dmesg -T 或 journalctl -k。
Q: journal 为什么 cat 乱码? A: journal 是二进制格式,只能用 journalctl 读,不能直接 cat/grep。
Q: 日志占满磁盘? A: journal 用 journalctl --vacuum-* 清理并设 SystemMaxUse;文本日志配 logrotate。
一句话总结:文本应用日志 tail -F + grep(轮转日志用大写 F),systemd 服务 journalctl -u 名 --since/-p/-f,系统日志看 /var/log/syslog|messages 与 dmesg -T;journal 是二进制只能 journalctl,日志撑盘用 vacuum/logrotate 治理。