歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> LINUXSHELL抓取錯誤日志腳本

LINUXSHELL抓取錯誤日志腳本

日期:2017/3/1 13:37:22   编辑:SHELL編程

背景

任何程序運行起來免不了產生很多日志,其中錯誤日志需要最為關心的。在某些時候會將錯誤日志和正常日志分開,但我們的系統卻沒有這麼做。更麻煩的是,每個小時存儲一個日志文件,所以每次為了查找當天是否有錯誤信息需要打開N個文件,而且不能用grep因為需要把整個堆棧抓取下來。

SHELL

本人對shell完全是初學,磕磕碰碰寫了個腳本。主要邏輯是判斷ERROR的日志級別的那一行開始記錄,直到碰到下一個INFO或者DEBUG的日志級別行。
[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. #!/bin/bash
  2. isInErrorBlock=false
  3. strArray=()
  4. count=1
  5. while read line
  6. do
  7. #echo "Line $count:"
  8. arrayIdx=$count%10
  9. strArray[$count]="$line"
  10. idx=$(expr match "${strArray[$count]}" ".*ERROR")
  11. if [ $idx -le 0 ];
  12. then
  13. idx=$(expr match "${strArray[$count]}" ".*Exception*")
  14. fi
  15. idx2=$(expr match "${strArray[$count]}" ".*DEBUG")
  16. idx3=$(expr match "${strArray[$count]}" ".*INFO")
  17. if [ $idx -gt 0 ] ;
  18. then
  19. if ! $isInErrorBlock;
  20. then
  21. echo 'print out previous lines'
  22. isInErrorBlock=true
  23. echo ${strArray[$count]}
  24. fi
  25. else
  26. if [ $idx2 -gt 0 ] || [ $idx3 -gt 0 ] ;
  27. then
  28. isInErrorBlock=false
  29. else
  30. if $isInErrorBlock;
  31. then
  32. echo ${strArray[$count]}
  33. fi
  34. fi
  35. fi
  36. count=$[ $count+1 ]
  37. done
  38. #echo "finish\n"
  39. exit 0

    效果

    基本達到了要求,對於每個目錄 cat *log | sh find_error.sh 能夠將整個堆棧單獨輸出到一個文件。但是效率很慢,不知道如何才能提高SHELL的運行效率。 更多 0
Copyright © Linux教程網 All Rights Reserved