日志常用分析命令

假设现在有以下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:002025-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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容