日志分析基础:日志级别、日志格式、常用日志分析工具

日志这东西,说白了就是系统的「黑匣子」。

我刚开始做运维那会儿,遇到线上故障就慌。后来发现,90%的问题都藏在日志里。你只要会看日志,问题就解决了一半。

这一节,咱们聊聊日志分析的基础。别小看它,这是定位问题的基本功。

一、日志级别:从「DEBUG」到「FATAL」

日志级别,就是给日志贴个标签。告诉你看日志的人——这条消息有多严重。

常见的日志级别,从低到高是这样的:

级别 含义 什么时候用
TRACE 跟踪 最细粒度的信息,一般开发调试用
DEBUG 调试 开发阶段打印变量、流程信息
INFO 信息 正常运行的关键节点,比如服务启动、请求完成
WARN 警告 可能有问题,但不影响当前运行
ERROR 错误 发生了异常,但系统还能继续跑
FATAL 致命 系统扛不住了,即将崩溃
我的习惯:生产环境一般开到 INFO 级别。DEBUG 日志量太大,容易把磁盘撑爆。我曾经见过一个项目,DEBUG 日志一天写了 200GB,直接把磁盘打满了。

为什么要区分级别?

你想想看,线上出故障了,你肯定先看 ERROR 和 FATAL。如果一上来就看 DEBUG,那信息量太大了,根本找不到重点。

二、日志格式:别让日志变成「天书」

日志格式,就是日志的「长相」。好的日志格式,一眼就能看出关键信息。

我个人比较推荐的标准格式:

[时间] [线程] [级别] [类名] - [消息内容]

举个例子:

[2024-03-15 14:30:22.123] [http-nio-8080-exec-1] [ERROR] [com.example.OrderService] - 订单创建失败,订单号:ORD20240315001,原因:库存不足

这条日志里,你能看到什么?

  • 时间:14:30:22.123,精确到毫秒
  • 线程:http-nio-8080-exec-1,知道是哪个请求线程
  • 级别:ERROR,说明是错误
  • 类名:OrderService,知道是哪个模块出的问题
  • 消息:订单创建失败,原因都写清楚了
注意:日志里不要打印敏感信息,比如密码、身份证号。我曾经见过一个项目,日志里直接打印了用户的银行卡号,这是严重的安全事故。

三、常用日志分析工具:grep、awk、sed

日志文件动辄几百MB,甚至几个GB。你不可能用编辑器打开慢慢看。这时候,Linux 三剑客就派上用场了。

1. grep:最快的「搜索器」

grep 就是用来找关键字的。它的核心用法就一个:从日志里找出包含某个关键词的行。

常用场景:

# 查找所有 ERROR 日志
grep "ERROR" app.log

# 查找包含 "订单创建失败" 的日志
grep "订单创建失败" app.log

# 忽略大小写查找
grep -i "error" app.log

# 显示匹配行的前后5行(上下文)
grep -C 5 "NullPointerException" app.log

# 递归查找目录下所有日志
grep -r "超时" /var/log/app/

我排查问题时,第一步永远是 grep。先找到异常的关键词,缩小范围。

2. awk:强大的「格式化器」

awk 擅长处理「有规律」的文本。比如日志格式固定,你想提取某一列。

常用场景:

# 假设日志格式:时间 级别 消息
# 提取所有 ERROR 级别的时间
awk '/ERROR/ {print $1}' app.log

# 统计每个级别的日志数量
awk '{count[$2]++} END {for (level in count) print level, count[level]}' app.log

# 按分隔符切割(比如用逗号分隔)
awk -F',' '{print $1, $3}' data.log
实战案例:有一次线上接口响应慢,我用 awk 统计了每个接口的平均响应时间,发现某个接口平均耗时 5 秒。顺着这个线索,找到了一个慢 SQL 查询。

3. sed:灵活的「编辑器」

sed 用来做文本替换和删除。它不会直接修改原文件,除非你加 -i 参数。

常用场景:

# 替换日志中的 IP 地址(脱敏)
sed 's/192\.168\.1\.\d+/***.***.***.***/g' app.log

# 删除所有 DEBUG 级别的日志
sed '/DEBUG/d' app.log

# 只保留第 100 到 200 行
sed -n '100,200p' app.log
避坑指南:我曾经用 sed -i 直接修改了生产环境的日志文件,结果把关键证据给改了。后来我学乖了,永远先备份,或者用重定向输出到新文件。

四、三剑客组合拳:实战演练

单独用 grep、awk、sed 已经很厉害了。但把它们组合起来,才是真正的「大杀器」。

举个例子:

需求:从 app.log 中找出所有 ERROR 级别的日志,提取出时间、类名和错误消息,然后按时间排序。

grep "ERROR" app.log | awk '{print $1, $4, $NF}' | sort

这条命令干了三件事:

  1. grep 先过滤出 ERROR 行
  2. awk 提取第1列(时间)、第4列(类名)、最后一列(错误消息)
  3. sort 按时间排序

你看,一行命令就把问题定位清楚了。

五、知识体系图

下面这张图,帮你理清日志分析的核心逻辑:

日志分析知识体系 日志级别 TRACE / DEBUG INFO / WARN ERROR / FATAL (从低到高) 日志格式 时间 / 线程 级别 / 类名 消息内容 (标准格式) 分析工具 grep(搜索) awk(格式化) sed(编辑) (三剑客) 核心思路:先看级别 → 再看格式 → 最后用工具分析 定位问题 = 缩小范围 + 提取关键信息

嗯,这张图把日志分析的三个核心要素串起来了。你记住这个思路,以后遇到问题就不会慌了。

日志分析,说白了就是「找不同」。找到异常的那条日志,你就成功了一半。剩下的,就是顺着线索往下挖。

可可精品资料库