免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: hidinga
打印 上一主题 下一主题

[待解决]日志截取代码优化 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-07-10 17:19 |只看该作者

回复 #10 Minsic 的帖子

tomcat的日志整个往内存里丢,内存一般受不了……

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
12 [报告]
发表于 2009-07-10 17:25 |只看该作者

回复 #11 kwokcn 的帖子

俺没其他办法了

论坛徽章:
0
13 [报告]
发表于 2009-07-10 17:37 |只看该作者

回复 #12 Minsic 的帖子

觉得麻烦不想写……

照顾到效率,需要在awk遍历完文件时完成输出;同时又要照顾到内存,需要在存放前面的数据时对无用数据进行及时的删除,但由于还有前面8楼9楼说到的情况,还不能固定保存20行,需要根据"Exception"的情况设置flag指挥删除操作或者另行存放。当然也可能是我想麻烦了~

楼主用的方法,出现N次Exception,就遍历N+1遍日志文件,想想那动辄若干个G的日志,肯定慢的难受了。

论坛徽章:
0
14 [报告]
发表于 2009-07-10 17:42 |只看该作者
原帖由 kwokcn 于 2009-7-10 17:37 发表
觉得麻烦不想写……

照顾到效率,需要在awk遍历完文件时完成输出;同时又要照顾到内存,需要在存放前面的数据时对无用数据进行及时的删除,但由于还有前面8楼9楼说到的情况,还不能固定保存20行,需要根据"E ...




是啊,神啊,救救我吧,写这个东西我都折腾半天,结果分析50M的日志花了一个多小时.......

论坛徽章:
0
15 [报告]
发表于 2009-08-08 22:47 |只看该作者
顶一下,求结果!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
16 [报告]
发表于 2009-08-09 00:26 |只看该作者

回复 #1 hidinga 的帖子

有比较新版的GNU grep么?可以一行代码搞定:
grep -C 20 -P '^\w.*Exception.*(\n\s+.*)*'

论坛徽章:
0
17 [报告]
发表于 2009-08-10 01:52 |只看该作者
要求:匹配行的前面20行+匹配行本身+首字缩进的段(红色部份)+匹配行后的首字不缩进行开始后面20行
要是能多给几段详细的日志就好了,下面是从你给出的日志,模拟的一段文件。在这里我只取前后各3行,20行太多了。
  1. -bash-3.2$ cat log.txt
  2. 11111111111111111111
  3. 11111111111111111111
  4. 22222222222222222222
  5. 33333333333333333333
  6. 44444444444444444444
  7. 55555555555555555555
  8. 66666666666666666666
  9. xxxxxExceptionxxxxxx
  10.         ##################
  11.         ##################
  12.         ##################
  13.         ##################
  14. 44444444444444444444
  15.    33333333333333333
  16.    22222222222222222
  17. 11111111111111111111
  18. 11111111111111111111
  19. 22222222222222222222
  20. 33333333333333333333
  21. 44444444444444444444
  22. 55555555555555555555
  23. 66666666666666666666
  24. xxxxxExceptionxxxxxx
  25.         ##################
  26.         ##################
  27.         ##################
  28.         ##################
  29. 44444444444444444444
  30.    33333333333333333
  31.    22222222222222222
  32. 11111111111111111111
  33. 11111111111111111111
  34. 22222222222222222222
  35. 33333333333333333333
  36. 44444444444444444444
  37. 55555555555555555555
  38. 66666666666666666666
  39. xxxxxExceptionxxxxxx
  40.         ##################
  41.         ##################
  42.         ##################
  43.         ##################
  44. 44444444444444444444
  45.    33333333333333333
  46.    22222222222222222
  47. 11111111111111111111
复制代码

代码部分,如果你要取20行,请将lines=3,改为lines=20
  1. -bash-3.2$ cat log.awk
  2. #!/bin/awk -f
  3. BEGIN{
  4.     lines=3
  5.     mflag=0
  6.     eflag=0
  7.     ecount=0
  8.     num=0
  9. }
  10. {
  11.    
  12.     if ($0~/Exception/){
  13.     for (n=1;n<=lines;n++){
  14.         if (array[n] != "") print array[n]    加 >> "log.tmp" 重定向到文件中
  15.     }
  16.     delete array
  17.     print $0                                             加 >> "log.tmp" 重定向到文件中                           
  18.     mflag=1
  19.     next
  20.     }

  21.     if (mflag == 0){
  22.         num++
  23.         array[num]=$0
  24.         if (num > lines){
  25.             num=lines
  26.             for (i=1;i<=lines;i++){
  27.             array[i]=array[i+1]
  28.             }
  29.         }
  30.     }
  31.    
  32.     if (mflag == 1){
  33.         if ($0~/^[ ]+/ && eflag == 0) print $0   加 >> "log.tmp" 重定向到文件中
  34.         if ($0!~/^[ ]+/) eflag=1
  35.         if (eflag == 1 && count < lines){
  36.             print $0                                              加 >> "log.tmp" 重定向到文件中
  37.             count++
  38.         }else if (count == lines){
  39.             eflag=0
  40.             mflag=0
  41.             count=0
  42.         }
  43.     }
  44. }
复制代码

测试模拟文本结果:匹配行的前面3行+匹配行本身+首字缩进的段+匹配行后的首字不缩进行开始后面3行
  1. -bash-3.2$ ./log.awk log.txt
  2. 44444444444444444444
  3. 55555555555555555555
  4. 66666666666666666666
  5. xxxxxExceptionxxxxxx
  6.         ##################
  7.         ##################
  8.         ##################
  9.         ##################
  10. 44444444444444444444
  11.    33333333333333333
  12.    22222222222222222
  13. 44444444444444444444
  14. 55555555555555555555
  15. 66666666666666666666
  16. xxxxxExceptionxxxxxx
  17.         ##################
  18.         ##################
  19.         ##################
  20.         ##################
  21. 44444444444444444444
  22.    33333333333333333
  23.    22222222222222222
  24. 44444444444444444444
  25. 55555555555555555555
  26. 66666666666666666666
  27. xxxxxExceptionxxxxxx
  28.         ##################
  29.         ##################
  30.         ##################
  31.         ##################
  32. 44444444444444444444
  33.    33333333333333333
  34.    22222222222222222
复制代码


这个执行起来效率会高一点,在内存消耗方面就只用了一个用来存取前20行的数组,并且数组内并不是总是存在数据,只有在符合条件是才存入数据,用完后消毁。
深更半夜,头脑有些发昏,逻辑有些混乱,但看看结果应该是你说的那种要求,不考虑特例,特别是后20不足的情况,前20行不足时,脚本可以正常工作。

[ 本帖最后由 kvkingdom 于 2009-8-10 02:10 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP