日志分析是系统运维、安全监控和问题排查的核心工作,通过高效命令快速定位问题、提取关键信息至关重要,以下是日志分析中常用的命令及其实际应用场景,结合Linux环境进行详细说明。

基础过滤与查看命令
-
grep:最常用的文本过滤工具,支持正则表达式,用于匹配包含特定关键词的行。
- 基础用法:
grep "error" /var/log/nginx/error.log
(查找包含“error”的行)。 - 进阶选项:
-i
:忽略大小写,如grep -i "WARNING" app.log
。-v
:反向匹配,如grep -v "INFO" system.log
(排除INFO级别日志)。-c
:统计匹配行数,如grep -c "failed" auth.log
。-A 3 -B 3
:显示匹配行前后3行上下文,便于定位问题根源,如grep -A 5 -B 5 "timeout" service.log
。
- 基础用法:
-
cat与more/less:用于查看文件内容,但更适合小文件。
cat /var/log/syslog
:直接输出全部内容,适合小日志文件。less /var/log/app.log
:分页查看,支持上下滚动、关键词搜索(输入),适合大文件交互式浏览。
-
tail:实时监控日志末尾内容,是排查实时问题的利器。
tail -f /var/log/mysql/error.log
:实时追加显示新日志,Ctrl+C退出。tail -n 100 access.log
:显示文件最后100行,结合-f
可实时跟踪最新100行变化。
高级搜索与统计命令
-
awk:强大的文本处理工具,按列提取和计算数据。
(图片来源网络,侵删)- 提取特定列:
awk '{print $1, $4}' access.log
(打印日志的第1、4列,如IP和请求时间)。 - 按条件统计:
awk '$7 == "404" {count++} END {print "404错误次数:", count}' access.log
(统计404错误次数)。 - 自定义分隔符:
awk -F"|" '{print $2}' custom.log
(以“|”为分隔符提取第二字段)。
- 提取特定列:
-
sed:流编辑器,用于文本替换、删除或插入。
- 替换文本:
sed 's/old_ip/new_ip/g' config.log
(全局替换“old_ip”为“new_ip”)。 - 删除匹配行:
sed '/^#/d' config.log
(删除以“#”开头的注释行)。 - 提取特定行:
sed -n '10,20p' app.log
(打印第10至20行)。
- 替换文本:
-
sort:对文本行排序,常与uniq结合使用。
- 基础排序:
sort access.log | uniq -c
(按行排序后统计重复次数,可分析高频访问IP)。 - 数值排序:
sort -n numbers.log
(对数字按大小排序,如响应时间统计)。 - 去重:
sort -u access.log | head -10
(排序后去重,显示前10条唯一访问记录)。
- 基础排序:
日志聚合与时间范围过滤
-
date结合grep:按时间范围过滤日志。
- 示例:
grep "$(date '+%Y-%m-%d') 10:00" app.log
(筛选当天10:00的日志)。 - 更精确范围:
sed -n '/2023-10-01 10:00/,/2023-10-01 11:00/p' app.log
(提取指定时间段日志)。
- 示例:
-
jq:处理JSON格式日志(如ELK栈、应用日志)。
(图片来源网络,侵删)- 提取字段:
jq '.timestamp, .level' app.json.log
(输出时间戳和日志级别)。 - 过滤条件:
jq 'select(.level == "ERROR")' app.json.log
(筛选ERROR级别的JSON日志)。
- 提取字段:
日志分析常用命令组合示例
以下表格总结了常见场景的命令组合:
场景 | 命令示例 | 说明 |
---|---|---|
统计高频错误关键词 | grep "ERROR" app.log | awk '{print $5}' | sort | uniq -c | sort -nr |
提取错误关键词并按频率降序排序 |
分析Top 10访问IP | awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10 |
统计访问量最高的前10个IP地址 |
过滤特定时间段的日志 | sed -n '/2023-10-01 09:00/,/2023-10-01 10:00/p' app.log |
提取2023年10月1日9:00-10:00的日志段 |
合并多个日志文件 | cat log1.log log2.log > combined.log |
将多个日志文件合并为一个大文件 |
FAQs
Q1: 如何快速定位日志中的慢查询SQL?
A1: 假设MySQL慢查询日志格式为# Time: 2023-10-01 10:00:00
, 可通过以下命令提取:
grep "Query_time" slow.log | awk '{print $2}' | sort -n | tail -5
该命令提取查询时间字段,按数值排序后显示最慢的5条SQL的执行时间,若需完整SQL语句,可使用:
grep -A 20 "Query_time: [0-9.]\{5,\}" slow.log
(显示查询时间超过5秒的SQL及其上下文)。
Q2: 日志文件过大时,如何高效分析而不卡顿?
A2: 可采用以下方法优化:
- 分块处理:使用
split -l 1000000 large.log part_
将大文件分割为每行100万的小文件,再逐个分析。 - 内存映射工具:
less
或vim
大文件时,使用vim -R large.log
(只读模式)避免加载到内存。 - 专用工具:对于结构化日志,使用
ripgrep
(rg
)替代grep,其速度更快且支持正则表达式,rg "error" -n /var/log/app.log
。 - 采样分析:
awk 'NR % 10 == 0' large.log
(每10行取1行)快速预览日志分布情况。