在日常的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 |
下载: | 下载 |
|
阅读(1477) | 评论(0) | 转发(0) |