LINUX SHELL 抓取错误日志脚本

背景

任何程序运行起来免不了产生很多日志,其中错误日志需要最为关心的。在某些时候会将错误日志和正常日志分开,但我们的系统却没有这么做。更麻烦的是,每个小时存储一个日志文件,所以每次为了查找当天是否有错误信息需要打开N个文件,而且不能用grep因为需要把整个堆栈抓取下来。

SHELL

本人对shell完全是初学,磕磕碰碰写了个脚本。主要逻辑是判断ERROR的日志级别的那一行开始记录,直到碰到下一个INFO或者DEBUG的日志级别行。

[html]  view plain copy
  1. #!/bin/bash  
  2.   
  3. isInErrorBlock=false  
  4.   
  5. strArray=()  
  6. count=1  
  7.   
  8.   
  9. while read line  
  10.   
  11. do  
  12.   
  13.   #echo "Line $count:"  
  14.   
  15.   arrayIdx=$count%10  
  16.    strArray[$count]="$line"  
  17.     
  18.   
  19.    idx=$(expr match "${strArray[$count]}" ".*ERROR")  
  20.   
  21.    if [ $idx -le 0 ];  
  22.    then  
  23.     idx=$(expr match "${strArray[$count]}" ".*Exception*")  
  24.    fi  
  25.   
  26.       
  27.    idx2=$(expr match "${strArray[$count]}" ".*DEBUG")  
  28.    idx3=$(expr match "${strArray[$count]}" ".*INFO")  
  29.   
  30.   
  31.    if [ $idx -gt 0 ] ;  
  32.    then  
  33.     if ! $isInErrorBlock;  
  34.     then          
  35.         echo 'print out previous lines'  
  36.         isInErrorBlock=true  
  37.         echo ${strArray[$count]}  
  38.   
  39.     fi  
  40.    else  
  41.     if [ $idx2 -gt 0 ] || [ $idx3 -gt 0 ] ;  
  42.           
  43.     then  
  44.         isInErrorBlock=false  
  45.     else  
  46.         if $isInErrorBlock;  
  47.         then  
  48.         echo ${strArray[$count]}   
  49.         fi  
  50.   
  51.     fi  
  52.    fi  
  53.    count=$[ $count+1 ]  
  54. done  
  55.   
  56. #echo "finish\n"  
  57.   
  58. exit 0  

效果

基本达到了要求,对于每个目录 cat *log | sh find_error.sh 能够将整个堆栈单独输出到一个文件。但是效率很慢,不知道如何才能提高SHELL的运行效率。
更多 0

你可能感兴趣的:(Linux)