在Linux服务器上排查问题,查看日志是第一步,但方法不对,效率直接减半。新手最容易犯的错误就是一上来就用cat命令——面对一个几百兆的日志文件,终端瞬间卡死,除了等待毫无办法。其实,高效的日志查看有章可循,一套组合拳就能搞定绝大多数场景。

最核心的思路是:实时监控用tail -f,安全浏览用less,精准定位用grep。这三者配合,足以覆盖95%以上的日常需求。

linux查看日志文件的5种常用命令 tail/cat/less【教程】

tail -f 实时跟踪新日志输出

当服务正在运行,或者错误刚刚发生时,tail -f通常是第一反应命令。它的优势在于“流式监听”:不读取整个文件,只持续监控文件末尾新增的内容,因此内存占用极低。

基本用法很简单:tail -f /var/log/syslog。默认会显示最后10行,并持续刷新新内容。

如果想看到更多上下文再开始监控,可以加上-n参数,比如tail -n 50 -f /var/log/nginx/error.log,这样会从倒数第50行开始显示并跟踪。

需要退出时,按Ctrl+C即可。这里有个小技巧:如果不小心输成了tail -F(大写F),其实也能用,而且功能更强——它能在日志文件被轮转(比如被logrotate工具切割)后,自动重新打开新文件继续跟踪,避免跟踪中断。

不过,tail -f也有其局限性。它本质上是一个“监听器”,而非“查看器”。一旦SSH连接断开,监听就会停止,而且它不支持向上翻页查看历史内容。所以,它最适合实时监控,回顾历史还得靠其他工具。

less 安全打开大日志并自由导航

当需要仔细查看一个较大的日志文件时,less是比catmore更明智的选择。它不会一次性将整个文件加载到内存,而是按需读取,因此打开几百兆的文件也很快。

更重要的是,它提供了强大的导航功能。直接运行less /var/log/auth.log进入浏览模式后,你可以:

搜索时需要注意大小写问题。默认是区分大小写的,如果希望忽略,可以在启动时加上-i参数:less -i /var/log/apache2/access.log

退出按q键。如果不小心按了v键进入了编辑模式(其实是调用了vi编辑器),别慌,直接再按q仍然可以退出,因为less本身并不会真正修改文件。

从性能角度看,对于大日志文件,less的启动速度和响应稳定性都很好。而常见的cat file | grep something写法,会先让cat读完整个文件,产生不必要的IO压力。

grep 配合 tailless 快速定位关键词

单独使用grep error /var/log/messages会输出所有匹配行,但往往会丢失关键的时间顺序和上下文信息。更有效的做法是“限定范围 + 关键词过滤”。

比如,只想查看最近200行日志里出现的异常:tail -n 200 /var/log/messages | grep -i "segmentation\|panic"。这里的-i参数表示忽略大小写。

如果想查看某次请求的完整链路,可以先用less搜索到一个唯一的request_id,然后使用grep的上下文显示功能:grep -A 3 -B 2 "req-abc123" /var/log/app.log。其中-A 3表示显示匹配行之后的3行,-B 2表示显示匹配行之前的2行。

使用grep时要注意正则表达式的陷阱。例如,搜索带冒号的时间戳grep "2024-04-01 14:"在某些Shell环境下可能需要转义冒号。更稳妥的写法是使用单引号:grep '2024-04-01 14:'

另外,对于像Ja va异常栈这种跨多行的错误信息,单纯搜索“Exception”可能会漏掉堆栈详情。这时使用grep -A 5 "Exception"(显示匹配行及之后5行)会更可靠。

cat 只适合小文件或拼接场景,慎用于日志

必须明确一点:cat命令的本意是concatenate(拼接),而不是viewer(查看器)。它只是把文件内容原样输出到标准输出。对于日志查看而言,它只有两个合理的用途:

  1. 查看行数很少的纯文本配置类日志(比如/var/log/alternatives.log)。
  2. 配合重定向或管道进行后续处理(比如合并多个文件后再过滤)。

典型的错误用法是试图用它查看二进制或特殊格式的日志,例如cat /var/log/journal/*——systemd的journal日志是二进制格式,这样操作只会输出乱码甚至导致终端卡死。正确的替代命令是journalctl,例如journalctl -u nginx.service -n 50查看nginx服务最近50行日志。

cat真正派上用场的场景,往往是需要合并多个小日志文件进行分析时,例如:cat app.log.1 app.log.2 | grep "timeout"

养成一个好习惯:在不确定文件大小时,先用wc -l(查看行数)或ls -lh(查看人类可读的文件大小)看一眼。如果只是想预览文件开头,cat big.log | head -20也比直接cat整个文件安全得多。

除了命令本身,还有两个容易被忽略的底层问题:权限和日志轮转。

/var/log/目录下的很多日志文件属主是root:syslog,普通用户直接tail -f可能会遇到“Permission denied”。这时不要习惯性地加sudo,可以先检查是否可以通过配置rsyslog将日志转发到用户有权限读取的位置,或者对于用户级服务,使用journalctl --user来查看。

另一个问题是日志轮转。被轮转压缩后的旧日志(如messages.1.gz)必须使用zcatzless来查看,直接使用cat是无效的。

本文转载于:https://www.php.cn/faq/2358173.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。