如何在 Linux 上实时查看正在写入的日志文件?
用 less +F、tail -f 和 journalctl -f -u 在 Linux 上实时跟踪日志文件,并确认新日志行确实随着事件发生而写入。
快速开始
拿一份过期的日志去猜问题很慢。在事件发生的同时盯着文件看,你才能按顺序看到出错那一刻的确切那一行。下面三条命令覆盖了完整流程:先确认文件到底有没有在被写入,再开一条不中断的实时流,最后用 systemd 的 journal 交叉验证同一批事件。
症状
先打开日志,确认它确实在被写入
用分页器以跟随模式打开文件:它会立刻显示最后几屏内容,然后不断追加新行,一眼就能看出到底有没有内容写入。按 Ctrl+C 停止跟随后,用方向键往回翻,看故障前后的上下文;再按 F 继续跟随。把路径换成你自己的日志:Debian/Ubuntu 的系统日志在 /var/log/syslog,RHEL/Fedora 在 /var/log/messages,应用日志一般在 /var/log/<名称>/ 下。如果你一边复现问题一边等,却始终没有新行出现,说明进程可能在缓冲输出,或者日志其实写到了别的地方。
用 tail -f 实时输出新日志
这一步才是真正的解法:一条不做任何交互、只持续输出新行的实时流。单独开一个终端,或者在 tmux/screen 窗口里运行它,保持开着,然后去复现问题,这样就不会在两次手动刷新之间漏掉内容。把路径换成你真正要追的日志文件。判断成功的标志是:你触发事件后一两秒内终端就出现新行;如果终端一直是空的,先确认自己跟的是程序真正写入的那个文件(很多守护进程有自己的日志路径),另外要记住有些程序只有在退出时才把缓冲区刷出来。
再从 journal 里交叉验证同一批事件
如果这个日志属于某个 systemd 服务,就同时从 journal 里跟踪一份。journal 会带上精确的时间戳和单元信息输出同样的消息,可以确认你盯的是正确的来源,而且日志没有被丢弃或在中途被轮转掉。把单元名换成你正在排查的服务,可以用 systemctl list-units --type=service 列出候选。如果 journal 里出现了 tail -f 流中从未出现过的行,说明两者看的并不是同一个文件,你之前跟的那个文件是错的。
journalctl -f -u UNIT 可实时流式输出某个 systemd 服务的新日志,并附带时间戳和元数据。
$ journalctl -u nginx.service -f如何确认已解决
你触发事件后一两秒内终端就出现新行,并且时间戳在你看的时候不断向前推进。如果涉及 systemd 服务,journal 里会出现时间戳吻合的同样消息。
来源
- less(1) — Linux manual page依据: less pages through a file with scroll, search (/), and navigation; +F follows appended data and -N shows line numbers.
- tail(1) — Ubuntu manpage依据: Ubuntu manpage describes --follow (-f) and -F, which follows the file by name and handles rotation
- tail(1) — man7.org依据: Man page documents tail's -f option to follow a file as it grows and -n to select the number of lines
- journalctl(1) - Query the systemd journal依据: -f, --follow shows only the most recent journal entries, and continuously prints new entries as they are appended; -u filters by unit.
最后验证: 2026-09-22