tail -f 更稳妥,因 -f 跟 inode,日志轮转后仍读旧文件;-f 跟文件名并自动重试。正确写法:tail -n 50 -f app.log 或 tail -50f app.log;-n 必须在 -f 前。

用 tail -f 或更稳妥的 tail -F,别用 tail -f 单独搭配日志轮转场景。
为什么 tail -f 会“突然不输出新日志”
因为 tail -f 跟的是文件描述符(inode),不是文件名。一旦日志被 logrotate 切割(比如 app.log 变成 app.log.1,再新建空的 app.log),原描述符就指向了旧文件,tail -f 还在读那个已不再写入的旧文件,自然卡住不动。
- 现象:日志明明还在追加,但终端没刷新,
Ctrl+C后重跑tail -f app.log才看到新内容 - 本质是跟踪机制差异:
-f= 跟 inode;-F= 跟文件名 + 自动重试 - 线上服务、Nginx、Java 应用等默认开启日志轮转,必须优先考虑
-F
tail -n 和 tail -f 组合怎么写才对
想看最后 50 行并持续跟踪,命令顺序和参数位置有影响:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 正确写法:
tail -n 50 -f app.log或简写为tail -50f app.log(注意-50f是连写的) - 错误写法:
tail -f -n 50 app.log—— 多数 shell 会报错或忽略-n -
-n必须在-f前,或合并成-Nf形式;-f是“启动跟踪”的开关,得让tail先知道要显示多少行,再进入监听状态 - 如果只想看新增内容、不关心历史,直接
tail -f app.log就够了,默认只输出最后 10 行+后续追加
多文件监控和静默输出的实用细节
同时盯多个日志时,默认会打印 ==> app.log 这类分隔头,干扰快速扫读:
- 去掉文件名头:
tail -q -f app.log nginx.log - 加
-q后,所有输出就是纯日志流,没有标识,适合管道进grep或重定向 - 但要注意:一旦出错(比如某个文件权限不足),
-q也会屏蔽错误提示,排查时先去掉-q看报错 - 若日志更新频率低(如每分钟一条),可加
-s 2降低轮询开销:tail -s 2 -F app.log
真正容易被忽略的是 -F 的重试行为——它不是“立刻切换”,而是按秒级间隔检查文件是否存在。如果轮转后新文件创建有延迟(比如应用重启慢),tail -F 可能短暂卡住几秒,这不是 bug,是设计使然。遇到这种间隙,别急着换工具,等两秒再看。










