多路归并在分析日志中的使用

问题起源:由于系统被外挂攻击,所以要对外部访问的日志进行分析,找出攻击者的攻击方式。系统使用了lvs,这样就有了多个访问日志文件,需要将所有的日志进行合并。这个合并的要求很简单,由于每个文件的纪录都是按时间的先后来纪录的,所以合并后的文件是按照时间的先后顺序。

举个例子:我们有100个已经排好序的序列, 现在要将这一百个序列合并成一个按顺序的序列。

 

由于并不是研究这么个算法,主要是要尽快地分析问题,我临时写了一个程序:先将代码分享出来,以后可以进行优化

 

代码
 
   
$files = array ( ' 60.txt ' , ' 61.txt ' , ' 62.txt ' );

$arrs = array ();
$arr_count = 0 ;
$i = 0 ;
$x = 0 ;
foreach ( $files as $file )
{
$arrs [ $i ++ ] = file ( $file );
$arr_count += count ( $arrs [ $i - 1 ]);
}

$r_arrs = array ();
$t = $i - 1 ;

while ( $t > 0 )
{
$s = intval ( $t / 2 );
for ( $x = $t ; $x > $t - $s ; $x -- )
{
$arrs [ $x - $s ] = merge( $arrs [ $x - $s ] , $arrs [ $x ]);
}
$t = intval (( $t - $s ) / 2 );

}
$arrs [ 0 ] = merge( $arrs [ 0 ] , $arrs [ 1 ]);
file_put_contents ( ' total.txt ' , implode ( '' , $arrs [ 0 ]));
print_r ( $arr_count );
print_r ( count ( $arrs [ 0 ]));


function merge( $arr1 , $arr2 )
{
if ( is_array ( $arr1 ) && is_array ( $arr2 ))
{
$t_arr = array ();
$i = 0 ;
$j = 0 ;
while ( isset ( $arr1 [ $i ]) && isset ( $arr2 [ $j ]))
{
if (( $arr1 [ $i ]) <= ( $arr2 [ $j ]))
$t_arr [] = $arr1 [ $i ++ ];
else
$t_arr [] = $arr2 [ $j ++ ];
}
while ( isset ( $arr1 [ $i ])) $t_arr [] = $arr1 [ $i ++ ];
while ( isset ( $arr2 [ $j ])) $t_arr [] = $arr2 [ $j ++ ];
return $t_arr ;
}
return false ;
}

当然这个程序的思想还可以对数组排序,记得以前有人问过,如果对有规律的数据进行排序,那么如果有上述的规律,进行多路的合并, 比起对整个程序进行排序化得时间小。

 

下面是日志的部分内容截图

 

转载于:https://www.cnblogs.com/kucongzhi/archive/2010/09/27/1836993.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值