学习/检测日志中URL的可变部分

时间:2012-08-30 23:19:00

标签: statistics analysis logparser

假设你有一个网络服务器日志(apache,nginx,等等)。从中您可以提取大量URL:

/article/1/view
/article/2/view
/article/1/view
/article/1323/view
/article/1/edit
/help
/article/1/view
/contact
/contact/thank-you
/article/8/edit
...

/blog/2012/06/01/how-i-will-spend-my-summer-vacation
/blog/2012/08/30/how-i-wasted-my-summer-vacation
...

你将这些网址分成了碎片,这样你就可以['article','1323','view']或['blog','2012','08','30','how-i-浪费了 - 我 - 夏季假期']。

如何分析和比较这些网址以检测和调出网址路径中的“变量”。也就是说,您希望识别/article/XXX/view/article/XXX/edit/blog/XXX/XXX/XXX/XXX之类的内容,以便您可以在日志中汇总有关这些行的信息。

我认为,对于构成可变片段的差异数量与相似但看起来不同的模板,需要有一些统计阈值。我也不确定哪种数据结构可以使这种分析变得简单快捷。

我希望脚本的输出输出它认为是服务器上存在的所有url模板的内容,如果合适,可能会有一些置信度值。

2 个答案:

答案 0 :(得分:2)

一个简单的解决方案是计算路径出现次数并了解哪些值对应于模板。假设文件input包含第一个代码段中的网址。然后计算每个路径的访问次数:

awk -F '/' '{ for (i=2; i<=NF; ++i) { for (j=2; j<=i; ++j) printf "/%s", $j; printf "\n" }}' input \
    | sort \
    | uniq -c \
    | sort -rn

这会产生:

7 /article
4 /article/1
3 /article/1/view
2 /contact
1 /help
1 /contact/thank-you
1 /article/8/edit
1 /article/8
1 /article/2/view
1 /article/2
1 /article/1323/view
1 /article/1323
1 /article/1/edit

现在,每个路径都有一个权重,您可以将其输入分数函数 f(x,y),其中 x 表示计数和 y 路径的深度。例如,第一行会导致调用 f(7,2),并且可能会返回 [0,1] 中的值,比如说0.8,告诉你给定的参数化对应于80%的模板。当然,所有的魔法都发生在 f 中,你必须根据你看到被访问的路径提出合理的值。要开发一个好的 f ,你可以对一些小数据集使用逻辑回归,看看它是否能够很好地预测作为模板的二进制特征。

你也可以走一条平凡的路线:只需放下尾巴,例如所有值&lt; = 1。

答案 1 :(得分:1)

如何使用DAWG?除了节点不会存储字母,而是存储URI片段。像这样:

enter image description here

这是一个非常好的数据结构:它具有非常小的内存要求,易于遍历,并且作为DAG,有很多简单且经过深入研究的算法。它也恰好描述了接受样本中所有URL并拒绝所有其他URL的状态机(因此我们实际上可能会构建一个正则表达式,这非常简洁,但我不够聪明,不知道如何去做从那里开始。)

无论如何,对于这样的结构,你的问题转化为找到“瓶颈”的问题。我猜有适当的算法,但是如果变量变化很大,那么基本上就是这样:在某个深度上存在的节点越多,它就越可能是一个可变部分。

一个可能天真的做法就是这样:为每个起始部分保留单独的DAWG,我会找到DAWG的平均宽度(可能根据深度加权)。如果一个级别的宽度高于该平均值,我会认为它是一个变量,其概率取决于它与平均值的距离。此时你很可能释放出统计数据的力量。模拟宽度的分布。

对于以相同部件开头的独立模式,这种方法不会很好,例如“shop /?/?”和“shop / admin /?/ edit”。这可以通过以更动态的方式检查DAWG-s,使用各种滑动窗口,一次只检查DAWG的一部分,但我不知道如何来减轻。哦,如果第一部分是一个变量,那么整个事情就会失败,但幸运的是很少见。

您也可能会注意某些小事情,例如同一级别的所有节点都有数值(更可能是变量),并且在构建DAWG之前我肯定会检查样本中的常见日期模式,因子分解他们将使处理类似博客的模式更容易。

(哦,添加“算法”标签可能会吸引更多关注这个问题。)