多路归并在分析日志中的使用
时间:2010-09-27 来源:库从志
问题起源:由于系统被外挂攻击,所以要对外部访问的日志进行分析,找出攻击者的攻击方式。系统使用了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;
}
当然这个程序的思想还可以对数组排序,记得以前有人问过,如果对有规律的数据进行排序,那么如果有上述的规律,进行多路的合并, 比起对整个程序进行排序化得时间小。
下面是日志的部分内容截图
相关阅读 更多 +