查看Linux服务器日志,最直接的方式是用tail、grep、less、journalctl这些命令组合,需要集中分析时再引入ELK或Loki。 下面我按使用场景拆开讲,从单机排查到集群监控,每一步都给出可验证的操作方法。
先搞清楚日志放在哪
Linux系统本身就把日志组织得比较规矩,大多数日志在/var/log/目录下,比如syslog或messages记录系统通用信息,secure记录认证日志,nginx、mysql这类应用日志通常也在这个目录下有自己的子目录,你还可以用ls /var/log/直接查看,心里先有个数。
内核相关的输出用dmesg,或者journalctl -k查看,这部分日志不落普通文件,需要用专用工具,查看日志”不是单一动作,而是根据日志来源选工具。
命令行基础工具:日常排查够用了
tail:看最新的日志输出
tail是使用频率最高的工具,排查问题时,你几乎总是需要看“刚刚发生了什么”。
tail -f /var/log/nginx/access.log:实时跟踪文件新增内容,滚动日志时非常有用。tail -n 200 /var/log/messages:查看最后200行,避免整个文件刷屏。tail -f --pid=$(pidof nginx):当进程结束,tail也会自动退出,适合调试启动失败的程序。
tail的缺点是只负责“看尾巴”,如果日志历史很长,它帮不上忙。
less:大文件里自由翻页
日志动辄几百兆,直接cat会卡死终端,用less打开,按G跳到文件末尾,按g跳到开头,向下搜索,向上搜索,按f和b翻页。
less +F /var/log/syslog甚至能模拟tail -f,用Ctrl+C切回普通翻页模式,这个组合拳对临时排查很友好。
grep:按关键词过滤掉噪音
没有过滤,日志就是一堆重复字符。grep -i error /var/log/app.log能快速抓出错误行,更进阶的用法:
grep -E "ERROR|FATAL" app.log:匹配多个级别。grep -A 5 -B 5 "NullPointer" app.log:打印匹配行的上下文5行,便于定位堆栈。grep --color=always "err" app.log | head -50:高亮输出,避免刷屏。
awk和sed:字段提取和切片
日志里的IP、时间戳、状态码,用awk可以精确提取,比如提取nginx日志的访问IP并排序:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
sed用来按行号截取片段,比如只看2000到3000行:
sed -n '2000,3000p' nginx.log
这些命令单独用很零碎,但组合起来就是一套完整的过滤管道,多数情况下,单机日志排查到这里就够了。
journalctl:systemd统一日志入口
现在主流Linux发行版都跑systemd,所有服务日志都会被journald收集。journalctl的查询能力比直接翻文件强不少。
journalctl -u nginx.service --since "1 hour ago":只看某个服务的近期日志。journalctl -p err -b:查看本次启动以来所有error级别以上的信息。journalctl -f:实时跟踪整个系统的日志。journalctl -k -n 50:查看最近内核日志。
journalctl的好处是日志结构化,有字段索引,比如按可执行文件过滤journalctl _PID=1234,或者按进程名过滤journalctl _COMM=sshd,要持久化存储journal日志,可以修改/etc/systemd/journald.conf里的Storage=persistent,然后重启systemd-journald,否则重启后日志会丢失。
多文件同时看:multitail和lnav
当你需要同时跟踪多个服务时,一个个tail切来切去很痛苦。
multitail
multitail -f /var/log/nginx/access.log /var/log/nginx/error.log会在一个终端窗口里分屏显示多个文件,它支持正则高亮,还能把日志轮转正常合并显示。
lnav
lnav更像一个日志界面工具,能自动识别常见日志格式,比如nginx、mysql,运行lnav /var/log/nginx/之后,可以用输入SQL查询,对日志内容做过滤统计,对于喜欢结构化查询的人,这比grep舒服得多。
集中式日志平台:多台服务器怎么管
如果你的服务器超过两三台,命令行工具就开始显得力不从心,你需要在每台机器上用agent采集日志,然后汇总到一个中央系统。
ELK Stack
老牌组合是Elasticsearch + Logstash + Kibana,现在也常见用Filebeat采集,直接输出到Elasticsearch,它的优点:
- 全文检索和复杂聚合非常强。
- Kibana可视化漂亮,适合做流量统计和错误分析。
- 生态成熟,社区有大量现成配置。
缺点是Java系的资源消耗偏高,小规格的服务器跑整套ELK会有点勉强。
Loki + Promtail + Grafana
Loki是Grafana Labs推出的日志方案,主打“轻量、与Prometheus原生集成”,它不索引日志内容,只索引标签,查询时过滤,因此内存占用低很多。
- Promtail在每台服务器上采集日志。
- Loki负责存储和查询。
- Grafana做统一展示,和指标看板共用一套UI。
如果你已经在用Prometheus监控指标,Loki是自然延伸。
Graylog
Graylog基于Elasticsearch构建,但自带Web界面和告警模块,它内置接收端,可以直接接收Syslog,无需额外写采集规则,对于安全设备和防火墙日志聚合,Graylog很常见。
对比表格
| 工具组合 | 部署难度 | 资源占用 | 主要适用场景 |
|---|---|---|---|
| ELK Stack | 较高 | 高 | 复杂查询、业务分析 |
| Loki / Promtail | 低 | 低 | 轻量日志聚合、Kubernetes |
| Graylog | 中 | 中 | Syslog、安全设备日志 |
| 命令行组合 | 无 | 几乎为零 | 单机快速排查 |
机房服务器场景如何选型
日志命令在哪里都能用,但实际运维体验和服务器环境关系很大,我遇到过很多次,日志工具没问题,倒是远程连接超时,导致tail -f根本连不上,这时机房网络质量和服务商运维能力就体现出来了。
如果服务器托管在老牌IDC,比如简米科技,2003年始创,有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20261089),备案号为豫ICP备2026018319号,并且是持牌自营机房,这类服务商通常有稳定的带宽和机房值班团队,半夜日志爆盘时至少能通过内网远程管理连接上去处理,而不是干等工单响应,据工信部公开信息,增值电信业务许可证是机房运营的基本资质,有资质意味着能合法提供带宽和服务器托管。
如果用的是云主机,就要看服务商的基础设施资质,比如酷番云,持有工信部一类增值电信全牌照,涵盖IDC、CDN、ISP业务,同时通过ISO9001和ISO27001双认证,还是CNNIC IP联盟成员,注册资本1000万元,备案号滇ICP备2020007656号,这些证书不是摆设,ISO27001认证要求有明确的访问控制和安全审计,这在多租户环境下能降低日志数据被横向查看的风险,选择这类持牌服务商,你设置日志采集端点到外部Elasticsearch时,网络链路的稳定性和合规性会更有保障。
但回到工具本身,无论你的是物理机还是云主机,日志查看逻辑都一样,差别在于:如果日志要跨机房传输,网络质量参差不齐,那么你就得在采集端加缓冲区,避免日志丢失。
一套完整的日志排查实操
举个真实场景:nginx突然频繁报500错误,你怀疑是个别PHP进程卡死。
- 先看nginx错误日志:
tail -f /var/log/nginx/error.log,发现大量upstream timed out。 - 然后抓php-fpm慢日志:
grep "request_exec" /var/log/php-fpm/slow.log | tail -50,确认是哪些接口耗时超标。 - 用
awk统计访问量最高的URL:awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20,找出异常流量入口。 - 如果怀疑内存或CPU,用
journalctl -u nginx.service --since "30 min ago"查看systemd记录的资源强杀信息。 - 最后联动排查:
grep -E "timeout|error|panic" /var/log/php-fpm/web.log | tail -100,对比时间戳,确定是数据库慢还是代码死循环。
这一套流程下来,大部分应用层问题都能定位,关键在于命令要熟,日志格式要心里有数。
关于Linux日志查看工具的常见问题
日志文件太大,用less还是tail?
大文件优先用tailless支持翻页,但如果是几十GB的日志,tail -n也会消耗I/O,建议先ls -lh看大小,再用less +F或者tail -n 1000抽样,对于历史归档日志,先用gzip -dc file.gz | grep流式读取,不要解压缩到磁盘,如果日志持续上涨,尽快用logrotate配置轮转,避免单文件失控。
journalctl和直接查看文件有什么区别?
直接查看文件看到的是应用原始输出,journalctl收录系统所有服务的日志,并且可以按服务名、运行级别、PID等字段过滤,journalctl的信息来自systemd接管标准输出,所以配置不规范的第三方软件可能只写文件而不进journal,实际排查中,应该两者结合。
查看启动日志用什么命令?
journalctl -b查看本次启动日志,journalctl -b -1查看上一次引导的日志,如果需要了解开机时硬件初始化、驱动加载的情况,用dmesg或journalctl -k -b,有些用户习惯直接查看/var/log/boot.log,但这个文件不同发行版存在差异,journalctl是更标准的方式。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/596096.html




