日志分析基础:日志级别、常用日志工具(ELK、grep)

日志分析,说白了就是故障排查的第一道防线。我接手过的故障里,有六七成都是靠日志定位的。很多人跟我说「日志太多,根本看不过来」,其实不是日志多,是你没学会怎么看。

这一节,咱们就把日志级别、grep 和 ELK 这三个核心东西捋清楚。都是实操里天天用的。

1. 日志级别 —— 故障的「红绿灯」

日志级别就是给你的日志标个严重程度。从散漫到致命,分这么几档:

级别含义生产环境建议
DEBUG开发调试信息,极其详细关掉,不然磁盘会炸
INFO正常业务流程记录保留,用来追踪链路
WARN可能有问题但还没挂必须关注,很多故障前兆
ERROR功能异常,但进程还能跑需要立刻看,但不一定致命
FATAL系统活不下去了直接报警,立刻重启

我习惯在项目初期就把日志模板定好。曾经有个线上事故,因为团队把大量 DEBUG 日志打到生产环境,导致磁盘在凌晨三点写满……从那之后,我就强制所有服务必须配 `LOG_LEVEL=INFO` 才允许上线。

避坑指南:我曾经见过有人把 ERROR 级别的日志当成「正常报错」忽略。记住:只要打了 ERROR,就必须有人工确认原因。别信「这个异常是业务预期内的」这种鬼话。预期内的异常,请用 INFO 打。

2. grep —— 最快的手动武器

你说日志文件可能几 GB,怎么查?grep。它快、简单、不需要搭建环境。

我常用的几个 grep 组合拳:

# 基本搜索
grep "OutOfMemoryError" /app/logs/error.log

# 前后看 5 行上下文(最常用的)
grep -C 5 "Connection refused" /app/logs/service.log

# 递归目录找所有日志里的关键词
grep -r "500" /app/logs/

# 统计某个错误出现的次数
grep -c "ORA-12519" /app/logs/*.log

为什么我会强调 -C 参数?因为单看一行根本不知道上下文。我曾经排查过一起诡异的 NPE,grep "NullPointerException" 命中 300 行,全是同一行代码。后来加上 -C 10 才发现,调用方传了个 null 进来,而日志只打了异常堆栈,没记入参。这教训让我现在写日志时,必须把关键参数也打出来。

小提示:用 grep -v 可以排除干扰。比如你在查超时,但接口返回里包含了大量正常心跳的日志,可以 grep -v "heartbeat" 把噪音过滤掉。

3. ELK 全家桶 —— 企业级日志分析

grep 适合单机、小场景。但如果你要跨几十台机器,跨小时段,跨应用去追踪一次用户请求,grep 就力不从心了。这时候我首选 ELK。

ELK 三件套各司其职:

组件角色我关注的参数
Elasticsearch存储 + 搜索引擎索引分片数、副本数、refresh_interval
Logstash采集、解析、转化grok 正则、filter 配置、input 插件
Kibana可视化面板Discover 查询、Dashboard 看板、KQL 语法

很多新手把 ELK 搭起来就用了,结果数据一多 Elasticsearch 就 OOM。我踩过这个坑——当时没有给 Logstash 做限流,日志生产速度 100MB/s,Logstash 扛不住直接丢事件,ES 那边看到的日志是残缺的。

正确的姿势是什么?从后往前调:先确定 ES 能承受多少写入,再让 Logstash 限流,必要时用 Redis 或 Kafka 做削峰填谷。

Kibana 的 KQL 语法我也得提一嘴,很多人还以为只能用 Lucene 语法。KQL 更人性化:

# KQL 示例(在 Kibana Discover 里用)
response:500
# 表示查找 response 字段值为 500 的文档

method:POST AND status:200
# 表示 POST 请求且状态码为 200

@timestamp >= "2025-01-01" and @timestamp <= "2025-01-02"
# 范围查询,故障回滚时经常用

我曾用 ELK 帮业务定位过「订单重复支付」的故障。几台应用服务器各自打不同的 traceId,以前 grep 得一台一台查,再拼起来。ELK 里直接用 traceId 搜索,一分钟内看到了完整的调用链路——数据库连接池耗尽的真相一目了然。

4. 日志分析整体框架

把上面这些串起来,日志分析其实就三个动作:产生 → 收集 → 分析。下面这张图帮你理清脉络:

日志分析核心流程与知识结构 日志分析知识结构 从日志级别到常用工具 日志分析 日志级别 grep 工具 ELK 平台 DEBUG / INFO / WARN ERROR / FATAL 常用参数:-C, -r, -c, -v 管道用法:grep + sort + uniq 结合 awk / sed 二次处理 ES:分片 / refresh_interval Logstash:grok / 限流 Kibana:KQL / Dashboard 避坑:日志级别设错 = 磁盘写爆;grep 不加上下文 = 漏线索;ELK 不做限流 = 数据丢失 故障排查中,日志分析是第一步,也是最关键的一步。

小结

日志分析这件事,没有什么花哨的捷径。我的经验就三条:

  • 级别要对——生产只打 INFO 及以上,WARN 和 ERROR 必须盯住;
  • grep 要熟——三五秒钟内能写出正确的查找命令,排查速度翻倍;
  • ELK 要稳——从写日志开始就设计好字段,搭平台时先压测 ES 写入能力。

我见过太多人「上了 ELK 就不管了」,结果出故障时发现日志没采集到、索引坏了、或者 ES 打满了。所以说到底,工具只是手段,你对日志的理解和重视,才是排查效率的真正来源。