【问题标题】:Learning/Detecting Mutatable Parts of a URL in Logs学习/检测日志中 URL 的可变部分
【发布时间】:2012-08-25 18:37:43
【问题描述】:

假设您有一个网络服务器日志(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
...

您将这些 url 分解成它们的片段,这样您就有 ['article', '1323', 'view'] 或 ['blog', '2012', '08', '30', 'how-i-浪费了我的暑假']。

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

我假设对于构成可变片段与外观相似但不同的模板的差异数量需要一些统计阈值。我也不确定什么样的数据结构可以让这种分析变得又快又容易。

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

【问题讨论】:

    标签: statistics analysis logparser


    【解决方案1】:

    一个简单的解决方案是计算路径出现次数并了解哪些值对应于模板。假设文件input 包含来自您的第一个sn-p 的URL。然后计算每个路径的访问:

    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,您可以在一些小数据集上使用逻辑回归,看看它是否能很好地预测作为模板的二元特征。

    您也可以采取普通路线:只需放下尾巴,例如,所有值

    【讨论】:

      【解决方案2】:

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

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

      无论如何,使用这样的结构,您的问题转化为寻找“瓶颈”的问题。我猜想有合适的算法,但是对于足够大的样本,其中变量变化足够大,基本上是这样的:在一定深度的节点越多,它就越有可能是一个可变部分。

      一种可能很幼稚的方法是这样的:为每个起始部分保留单独的 DAWG,我会找到 DAWG 的平均宽度(可能基于深度加权)。如果一个级别的宽度高于该平均值,我会认为它是一个变量,其概率取决于它与平均值的距离。在这一点上,您可能会很好地释放统计数据的力量。对宽度的分布进行建模。

      这种方法不适用于从同一部分开始的独立模式,例如“shop/?/?”和“商店/管理员/?/编辑”。这可以通过以更动态的方式检查 DAWG-s 来缓解,使用各种滑动窗口,总是一次只检查 DAWG 的一部分,但我不知道如何。哦,如果第一部分是一个变量,那么整个事情就会严重失败,但幸运的是,这种情况很少见。

      您还可能会注意某些小事情,例如具有数值的同一级别的所有节点(更可能是变量),并且我肯定会在构建 DAWG 之前检查示例中的常见日期模式,考虑因素它们会让处理类似博客的模式更容易。

      (哦,加上“算法”标签可能会引起更多关注。)

      【讨论】:

      • 这让我有了一个很好的起点。我必须小心我的词干分析器没有创建不存在的网址。如果输入是“/a/1/view”和“/b/1”,像这样的简单 DAWG 将允许“/b/1/view”出来,但我想我已经涵盖了。谢谢!
      猜你喜欢
      • 2014-07-10
      • 1970-01-01
      • 2011-03-28
      • 2021-10-22
      • 1970-01-01
      • 2013-12-08
      • 2017-09-28
      • 2019-10-27
      • 2021-04-15
      相关资源
      最近更新 更多