
1. 为什么我们需要这些日志排查工具在Linux系统运维和开发工作中日志文件就像系统的黑匣子记录了所有关键事件和错误信息。我曾处理过一个线上事故某电商平台在促销期间突然出现订单处理延迟当时通过实时分析Nginx和Java应用的日志仅用15分钟就定位到是某个微服务接口响应时间激增导致的级联故障。这种场景下熟练使用日志工具就是救火的关键。传统查看日志的方式主要有三大痛点日志文件体积庞大GB级别很常见需要实时监控最新日志要在海量信息中快速过滤关键错误这正是tail、cat、less、grep这组瑞士军刀组合的价值所在。它们各有所长tail实时追踪日志更新cat快速查看完整文件less交互式浏览大文件grep精准过滤关键信息提示生产环境中切忌直接用vim打开大日志文件可能导致内存溢出。我曾见过有人用vim打开10GB的Tomcat日志直接导致SSH会话卡死。2. tail命令的实战技巧2.1 基础用法与核心参数# 查看文件末尾10行默认 tail access.log # 实时追踪新增内容-f参数 tail -f app.log # 显示末尾100行 tail -n 100 error.log但实际生产环境远不止这么简单。上周排查一个K8s容器问题时我发现这样用更高效# 从第1000行开始显示适合大文件分段查看 tail -n 1000 huge.log | less # 同时追踪多个日志文件多服务联调时特别有用 tail -f service1.log service2.log # 持续监控并高亮关键词结合grep tail -f app.log | grep --colorauto -i exception2.2 高级组合技当处理滚动日志时如log4j的按日切割单纯用-f会丢失文件切换时的连续性。这时应该用# F参数能在文件被rotate后自动重新跟踪 tail -F app.log我曾用这个组合命令快速定位内存泄漏# 统计每分钟Full GC次数 tail -f gc.log | grep Full GC | awk {print $1} | uniq -c3. cat命令的非常规用法虽然cat本意是连接文件但日志排查中它另有妙用3.1 基础查看# 查看完整文件适合小日志 cat debug.log # 显示行号排查报错时必备 cat -n error.log | grep -A 5 NullPointer3.2 高级技巧# 快速查看多个文件的交集比如对比不同节点日志 cat server1.log server2.log | sort | uniq -d # 配合grep统计错误出现次数 cat app.log | grep -c Connection refused # 查看特定时间段的日志假设日志有时间戳 cat app.log | grep 2023-08-01 14:[0-5][0-9]注意处理大文件时慎用cat可能耗尽内存。有次我误用cat查看8GB的MySQL慢查询日志直接导致OOM killer杀死了关键进程。4. less命令的交互式魔法4.1 基础导航less production.log进入less后/error搜索error关键词n下一个匹配项N上一个G跳转文件末尾1G回到开头F进入实时追踪模式类似tail -f4.2 高级功能# 查看日志同时保留ANSI颜色比如docker日志 less -R colorful.log # 打开文件直接定位到第一个ERROR出现处 less /ERROR app.log我常用的一个复杂例子# 分析HTTP状态码分布配合正则 less access.log | grep -oP \d{3} \d | sort | uniq -c | sort -nr5. grep的精准过滤艺术5.1 基础搜索# 简单匹配 grep OutOfMemoryError java.log # 忽略大小写 grep -i timeout app.log # 显示匹配行及前后3行上下文 grep -C 3 critical system.log5.2 生产级用法# 正则匹配如追踪特定session的请求流 grep -P sessionid\w{32} access.log # 排除干扰行比如不要DEBUG日志 grep -v DEBUG app.log # 同时搜索多个关键词OR关系 grep -e Error -e Exception -e Timeout app.log # 统计每种错误类型出现次数 grep -oP \wException app.log | sort | uniq -c | sort -nr6. 组合命令的实战套路6.1 经典排查组合# 实时监控日志并过滤关键错误最常用 tail -f app.log | grep -A 10 -B 5 ERROR # 分析最近1小时内的500错误 grep $(date -d 1 hour ago %H:%M) access.log | grep 500 6.2 复杂案例解析去年处理过一个数据库连接泄漏问题我是这样排查的# 1. 定位异常时间段 grep Connection pool exhausted app.log | less # 2. 提取相关事务ID grep -oP txn-\d error.log | sort | uniq txn_ids.txt # 3. 分析这些事务的完整执行链路 grep -f txn_ids.txt app.log | less6.3 性能分析示例分析接口响应时间分布grep -oP elapsed\d access.log | awk -F {print $2} | \ sort -n | uniq -c | head -207. 避坑指南与性能优化7.1 常见陷阱编码问题处理非ASCII日志时记得加-a参数grep -a 中文错误 binary.log正则陷阱.默认不匹配换行符用-z处理多行日志grep -zP start(.|\n)*?end app.log时间格式日志时间戳格式不统一时用更宽松的正则grep -P \d{4}-\d{2}-\d{2} \d{2}:\d{2} app.log7.2 性能优化技巧当处理GB级日志时# 1. 先用grep过滤再传给其他命令减少管道数据量 grep ERROR huge.log | head -100 # 2. 使用LC_ALLC加速ASCII搜索 LC_ALLC grep error app.log # 3. 并行处理大文件需安装parallel cat big.log | parallel --pipe grep keyword8. 我的工具箱与习惯配置8.1 常用aliasalias logerrgrep -C 5 -i --colorauto error\|exception\|fail alias tftail -f alias lgless G8.2 实用函数# 按时间范围过滤日志 function logrange() { sed -n /$1/,/$2/p $3 } # 使用示例logrange 2023-08-01 10:00 2023-08-01 11:00 app.log8.3 可视化增强# 高亮关键信息需要安装ccze tail -f app.log | ccze -A经过多年实践我总结出一个高效排查流程先用tail -n 100看最近错误用grep -C 10查看错误上下文用less交互式分析特定时间段复杂分析时组合awk/sort/uniq等工具最后分享一个真实案例某次系统出现偶发性超时通过这个组合命令发现了规律grep Request timeout app.log | awk {print $1} | cut -d: -f1-2 | uniq -c结果显示每天14:30准时出现峰值最终定位到是定时任务导致的资源争用。