假设现在有以下logfile.log
日志内容
2025-03-28 11:40:25.172 DEBUG 2662830 --- [pool-9-thread-11]
2025-03-28 11:40:25.172 INFO 2662830 --- [pool-9-thread-12]
2025-03-28 11:41:25.172 INFO 2662830 --- [pool-9-thread-12]
2025-03-28 11:41:25.173 INFO 2662830 --- [pool-9-thread-9]
2025-03-28 11:41:25.173 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:42:25.173 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:42:25.173 DEBUG 2662830 --- [pool-9-thread-12]
2025-03-28 11:42:25.173 DEBUG 2662830 --- [pool-9-thread-12]
2025-03-28 11:43:25.174 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:44:25.174 INFO 2662830 --- [pool-9-thread-9]
2025-03-28 11:44:25.174 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:44:25.175 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:45:25.175 DEBUG 2662830 --- [pool-9-thread-12]
2025-03-28 11:46:25.175 DEBUG 2662830 --- [pool-9-thread-12]
需求一、按时间范围截取
需求:要从日志文件中提取指定时间范围(2025-03-28 11:42:00
到 2025-03-28 11:44:59
)的日志并保存到 range.log
文件 :
方法1:使用 awk(精确到秒)
awk '$1" "$2 >= "2025-03-28 11:42:00" && $1" "$2 <= "2025-03-28 11:44:59"' logfile.log > range.log
方法2:使用 sed(适合时间有序的日志)
sed -n '/2025-03-28 11:42:00/,/2025-03-28 11:44:59/p' logfile.log > range.log
方法3:包含毫秒的精确匹配(推荐)
awk '$1" "$2 >= "2025-03-28 11:42:00" && $1" "$2 < "2025-03-28 11:45:00"' logfile.log > range.log
验证结果
查看提取的日志行数
wc -l range.log
查看时间范围
head -1 range.log | awk '{print $1, $2}'
tail -1 range.log | awk '{print $1, $2}'
需求二、按时间行号截取
要从日志文件中提取第5行到第10行的数据并保存到新文件,可以使用以下方法:
方法1:使用sed
sed -n '5,10p' logfile.log > range.log
方法2:使用awk
awk 'NR>=5 && NR<=10' logfile.log > range.log
方法3:使用head和tail组合
head -10 logfile.log | tail -6 > range.log
验证结果
查看提取的行数(应该是6行)
wc -l range.log
查看提取的内容
cat range.log
执行后range.log将包含:
2025-03-28 11:41:25.173 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:42:25.173 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:42:25.173 DEBUG 2662830 --- [pool-9-thread-12]
2025-03-28 11:42:25.173 DEBUG 2662830 --- [pool-9-thread-12]
2025-03-28 11:43:25.174 DEBUG 2662830 --- [pool-9-thread-9]
2025-03-28 11:44:25.174 INFO 2662830 --- [pool-9-thread-9]
注意事项
- 行号计数从1开始
- 包含起始行(第5行)和结束行(第10行)
- 如果文件行数不足10行,命令会自动截断到文件末尾
其他
基础统计信息
# 总日志行数
wc -l logfile.log
# 日志级别分布
awk '{count[$3]++} END {for(level in count) print level, count[level]}' logfile.log
DEBUG 10
INFO 4
各线程日志数量统计
awk -F'[][]' '{print $2}' logfile.log | sort | uniq -c
5 pool-9-thread-9
7 pool-9-thread-11
4 pool-9-thread-12
按分钟统计日志量
# 每分钟日志数量
awk '{print substr($2,1,5)}' logfile.log | sort | uniq -c
2 11:40
4 11:41
3 11:42
1 11:43
3 11:44
2 11:45
1 11:46
高级分析命令
# 1. 找出INFO级别的日志及其线程
grep ' INFO ' logfile.log | awk '{print $6, $0}'
# 2. 统计每分钟各线程的日志量
awk '{min=substr($2,1,5); thread=$6; count[min][thread]++}
END {for(m in count) for(t in count[m]) print m, t, count[m][t]}' logfile.log
# 3. 找出相邻日志时间差>1秒的记录
awk 'prev{split(prev,p); split($0,a);
"date -d \""a[1]" "a[2]"\" +%s.%N" | getline t2;
"date -d \""p[1]" "p[2]"\" +%s.%N" | getline t1;
if(t2-t1>1) print p[0],t2-t1,$0;}{prev=$0}' logfile.log
异常检测
# 检测连续ERROR日志(示例,当前日志无ERROR)
awk '/ERROR/{if(++err_count>=3) print "ALERT:",$0; next}{err_count=0}' logfile.log
# 检测线程卡顿(相同线程连续日志时间差>1秒)
awk -F'[][]' 'prev_thread==$2 && prev_time{
"date -d \""$1"\" +%s.%N" | getline curr;
if(curr-prev_time>1) print "STALL:",prev_thread,curr-prev_time,$0;
prev_time=curr}{split($1,a," "); prev_thread=$2; "date -d \""a[1]" "a[2]"\" +%s.%N" | getline prev_time}' logfile.log
可视化建议
# 生成时序图表数据(可用Excel可视化)
awk '{print $2, $6}' logfile.log > timeline.dat
# 线程活动频率图表
awk '{print $6}' logfile.log | sort | uniq -c > thread_activity.dat