Chinaunix首页 | 论坛 | 博客
  • 博客访问: 811748
  • 博文数量: 167
  • 博客积分: 7173
  • 博客等级: 少将
  • 技术积分: 1671
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 23:07
文章分类

全部博文(167)

文章存档

2018年(1)

2017年(11)

2012年(2)

2011年(27)

2010年(88)

2009年(38)

分类:

2010-09-21 10:03:15



 在日常的java类的应用中会抛出很多异常,但不是每个异常都是对应用产生影响,有些异常只是开发
为了清楚其应用的情况而进行抛出;在这个过程中就有些矛盾了,相对于系统的工作人员来说,大部分
信息我不需要,但每次不能不把每个log进行查找。
 在做系统、dba这一行经验比较重要,在对log的分析要判断哪些是对应用产生影响的log,哪些不是;
在我们的工作中不断的去形成了一个sample库;做分析脚本也是一样,显示把所知道对应用产生影响的
log就行记录下来。
 在日常的工作中可以grep exception jdk.log|stderr.log|stdout.log;进一步把这个形式固化
下来,就是写成脚本;再进一步就是怎样自动化处理,因为我们面对的可能是上千上百的机器。我的分析
脚本在本文章的后面。
 对于自动化处理,在探讨以下两种方法:
1.集中式存储

    曾经模拟过MogileFS的流程体系,对log脚本进行集中分布式存储(个人词汇),就是把所有机
器上的log拉到一个黑盒子上进行存储,这个黑盒子是一个分布式的集群,如图:

   




集中是相对前端产生log机器来说;分布式相对存储log的空间来说,我主要是想通过这个存储方式
充分调度器各台机器上空闲的资源。
这种方式下分析脚本只需获取出相应机器产生的log在那个节点上就能进行相应的处理分析告警。
可以统称这种方式为log集中存储式log日志分析,要做这个在代码的工作量比较大,目前根据
自己的想法,相应的命令有:xmv,xvi,xmore,xcp;做了几个就转战另一方式了。

2.脚本跟着机器的log走


网络可以看《鼠标click一下,就按需安装应用》http://blog.chinaunix.net/u3/102731/showart_2326163.html这边文章。
由中央控制中心进行脚本分发,对数据采集,发送相应机器的分析结果。分析脚本给分派到相应的机器进行工
作,为中央控制中心进行数据的提供。这样我省略了调度log,生成获取log的计算方法等。




google有一款日志分析工具但好像是收费,感兴趣的朋友可以去了解一下。



希望技术朋友们留下你遇到的对应用产生影响的exception,谢谢。

脚本分析代码(其实可以用awk简单解决,做复杂了,呵呵)

#!/usr/bin/perl -w
#Analyse Resin JDK LOG
#Edit by Sky

use strict;

our ($usage,@ERRORS,%ELOG,$TLOG,$mylasttime,@ARGV,$LOGPATH,$line,$ttap,$logdate,$time,
$event,$error,$mylog,%log,$i,$sf,$sft,$lastmonth,$lasthour,$lastdate,$lastsed,
$lastmin,$lasttotal,$nowmonth,$nowhour,$nowdate,$nowsed,$nowmin,$nowtotal,$result);

$usage="perl  analyseRlog.pl jdklog_path \nperl  analyseRlog.pl jdklog_path timelog_path \ncat jdk.log | perl  analyseRlog.pl \n";

#Error Types
@ERRORS=("OutOfMemoryException","java.lang.NullPointerException","too may open files");

#init ELOG for last output
for( $i=0 ; $i < (@ERRORS+0); $i++ ){

   $ELOG{$ERRORS[$i]}=0;

}

#reffer to time log
$ttap=1;

#Get data from different ways
if ( @ARGV > 0) {

 
   if ( ($ARGV[0] cmp "help") ==  0 ){
      print "$usage";
      exit 0;
   }

  $LOGPATH=$ARGV[0];

  open(LOG,$LOGPATH) or die "Can not open your log file:$!\n";

  while ( $line = ) {

    ($logdate,$time,$event,$error)=split(" ",$line);

    $mylog=$logdate . $time;


      if ( ! exists $log{$mylog}  ) {

        $log{$mylog} = $error . $event ;

      }
      $mylasttime=$mylog;

  }

   close(LOG);

} else {

      $ttap=0;

    while ( defined( $line= ) ){
 
      ($logdate,$time,$event,$error)=split(" ",$line);

      $mylog=$logdate . $time;


      if ( ! exists $log{$mylog}  ) {

        $log{$mylog} = $error  . $event ;

      }


         
   }
}

$TLOG="time.log";

if ( @ARGV > 1) {

  $TLOG=$ARGV[1];

}

#Get the time of last log check
eval{
  
   $sft=1;
   open(LTIME,$TLOG) or $sft=0;
   if( $sft == 1 ){
      $sf=;
          $lastmonth=substr($sf,1,2);
          $lastdate=substr($sf,4,2);
          $lasthour=substr($sf,6,2);
          $lastmin=substr($sf,9,2);
          $lastsed=substr($sf,12,2);
          $lasttotal= ($lastmonth*60*60*24*30)+($lastdate*60*60*24)+($lasthour*60*60)+($lastmin*60)+$lastsed;
   }

   close(LTIME);

};

if($@){

   return "";

}


#analyse the data,get the result form sample
  foreach $mylog ( keys %log ){
   
       if(($sft==1)&&($ttap==1)){

          $nowmonth=substr($mylog,1,2);
          $nowdate=substr($mylog,4,2);
          $nowhour=substr($mylog,6,2);
          $nowmin=substr($mylog,9,2);
          $nowsed=substr($mylog,12,2);
          $nowtotal= ($nowmonth*60*60*24*30)+($nowdate*60*60*24)+($nowhour*60*60)+($nowmin*60)+$nowsed;

          if ( $lasttotal - $nowtotal >= 0 ){

             next;

          }
      

       }    
       

       for( $i=0 ; $i < (@ERRORS+0); $i++ ){
         

           if ( index($log{$mylog},$ERRORS[$i]) > -1){

              #print "time:$mylog\terror$log{$mylog}\n";

              $ELOG{$ERRORS[$i]}++;

              $i=@ERRORS+0;

           }

       }

  }



#Output the result
foreach $result ( keys %ELOG ){
     print "$result\t$ELOG{$result}\n";
}

#output the end time of analysing of this time
eval{

  if ($ttap==1){
   $sft=1;
   open(MYLASTTLOG,">$TLOG") or $sft=0;
   if( $sft == 1 ){
      syswrite(MYLASTTLOG,"$mylasttime\n");
   }

   close(MYLASTTLOG);
  }
};

if($@){

   return "";

}











文件:analyseRlog.zip
大小:1KB
下载:下载

阅读(1431) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~