记录消息分类/分组并为每个组查找人类可读的模式

Posted

技术标签:

【中文标题】记录消息分类/分组并为每个组查找人类可读的模式【英文标题】:Log messages classification/grouping and finding human readable pattern for each group 【发布时间】:2020-05-16 12:24:55 【问题描述】:

作为数据科学和机器学习的新手,我想就下面解释的问题提出以下问题:

机器学习对此类问题有好处还是矫枉过正? 这个问题是否与另一个已经发表论文的经典问题相关,以便我可以选择正确的解决方案?

问题:

我一直在研究一个非常有趣的问题,我相信许多分析系统都可以通过自动化过程解决。

我们正在收集各种浏览器和自定义构建 Web 应用程序中发生的许多 javascript 错误消息。我们的目标是对相似的消息进行分组,并按照分组消息所具有的共同模式来标记每个组。

例子:

+---------------------------------------------------------------+
|Label: "Forbidden: User session placeholder1 has expired." |
+---------------------------------------------------------------+
|Message: "Forbidden: User session aad3-1v299-4400 has expired."|
|Message: "Forbidden: User session jj41-1d333-bbaa has expired."|
|Message: "Forbidden: User session aab3-bn12n-1111 has expired."|
+---------------------------------------------------------------+

到目前为止,我们有解决问题的半自动化流程,但有时我们会收到新的用户生成的 JavaScript 错误消息,这些错误消息会通过我们的过滤器。

我一直在考虑使用现有库/工具/算法的简单两步方法。

    对于一批错误行,运行一个查找相似字符串的算法(例如 Levenshtein)。对类似的错误进行分组。 在一组相似的字符串中运行差异并找到动态部分。检查差异:

作为参考,我们有在一分钟内收集的错误消息:

Message: 3312445,Error: Unknown page "retina_list"
Message: 9931234,Error: Unknown page "widget_summary"
Message: ReferenceError: 'alg,TypeError: g' is undefined
Message: 522574,Error: Unknown page "page_options"
Message: ReferenceError: '297756| Zly / Error in handler for event:,[object Object],ApiListenerError: TypeError: a' is undefined
Message: [Euv warn]: style="width: item.evaluationem": interpolation in 'style' attribute will cause the attribute to be discarded in Internet Explorer. Use krt-bind:style instead. (found in component: <default-componentfalse2320383>)
Message: [Euv warn]: src="//www.example.com/image/item._id-1.jpg?w=220&h=165&mode=crop": interpolation in 'src' attribute will cause a 404 request. Use krt-bind:src instead. (found in component: <default-componentfalse8372912>)
Message: [Euv warn]: src="//www.example.com/image/item._id?car=recommend_sp312": interpolation in 'src' attribute will cause a 404 request. Use krt-bind:src instead. (found in component: <default-componentfalse3330736>)
Message: [Euv warn]: src="//www.example.com/image/item._id-1.jpg?w=220&h=165&mode=crop": interpolation in 'src' attribute will cause a 404 request. Use krt-bind:src instead. (found in component: <default-componentfalse4893336>)
Message: ReferenceError: 'alg,TypeError: g' is undefined
Message: 73276| Zly / Error in handler for event:,[object Object],ApiListenerError: TypeError: Cannot read property 'campaignName' of undefined
Message: ReferenceError: 'alg,TypeError: g' is undefined
Message: ReferenceError: 'bend,TypeError: f' is undefined

我最近一直在玩 Tensorflow JS,我完全是初学者,但我可能会尝试训练一些可以帮助我对字符串进行分类和标记的东西。

我还认为生成组标签比对字符串进行分组更严重,因为有时一对相似的字符串具有非常不同的长度,并且占位符是带有特殊字符的长句子,例如 \,".^%#& *!?|][.

【问题讨论】:

【参考方案1】:

正如您所指出的,听起来我们可以将此问题分为两个不同的步骤。

    将相似的消息组合在一起,并且 标记每个组。 第 1 步:

虽然我对 Tensorflow JS 不太熟悉,但我认为使用机器学习 (ML) 来解决这个问题并不过分,尤其是第 1 步。

事实上,这类问题非常适合用于特定形式的机器学习,即无监督学习,更具体地说,聚类。在无监督学习中,我们希望在我们的数据中找到“以前未知的模式,而没有预先存在的标签”。

见:https://en.wikipedia.org/wiki/Unsupervised_learning

在这种情况下,这意味着在我们应用聚类算法之前,我们不知道“错误消息 1”和“错误消息 2”是否属于同一组。使用您的示例,我们可以合理地怀疑这些消息:

“Forbidden: User session aad3-1v299-4400 has expired"
“Forbidden: User session jj41-1d333-bbaa has expired"

将属于同一个组,但聚类算法在启动时并不知道这一点。

我们可以将此与一种称为分类监督学习形式进行对比,在这种形式中,我们事先知道我们期望一个群体具有这种形式

“Forbidden: User session placeholder1 has expired". 

那么数据中预先存在的标签就是诸如

之类的消息
“Forbidden: User session aad3-1v299-4400 has expired"
“Forbidden: User session jj41-1d333-bbaa has expired"

属于上面的预期组。本质上,我们给 ML 模型提供了一组该组的外观示例,然后看起来相似的传入消息将被分类到该组。

从您的描述看来,对于第 1 步,您想要执行字符串匹配(例如 Levenshtein)来比较所有示例消息,然后将聚类算法应用于这些结果。然后,在您拥有消息组(集群)之后,第 2 步涉及为每个组找到适当的标签。

第 2 步:

同意为每个组找到合适的标签可能是这里更难的问题。一种可能有用的方法是计算一个单词或短语在组或集群中出现的次数,如果它不满足某个预定义的阈值,则使用示例标签中的占位符。例如,“Forbidden”、“User”、“session”和“expired”这些词对组来说是通用的,而列出的字母数字 ID 对单个消息来说是唯一的。如果阈值是单词或短语必须至少出现在两条消息中,则只有 ID 将被占位符替换。

在这种方法中,您本质上是在寻找对该组不常见的单词或短语,并且在形成适当的标签时不提供有用的信息。在某种程度上,这与许多搜索引擎中使用的概念相反,该概念旨在找出单词或短语对文档的常见程度或重要性(请参阅https://en.wikipedia.org/wiki/Tf%E2%80%93idf)。

【讨论】:

以上是关于记录消息分类/分组并为每个组查找人类可读的模式的主要内容,如果未能解决你的问题,请参考以下文章

组内交流图像识别及应用

以人类可读的格式显示容器弃用日志?

将日志消息存储在数据库表而不是文件中是好还是坏?

从人类可读的字符串创建 MKPlacemark/CLPlacemark

人类可读的 GUID

将人类可读的日期从 Epoch 转换为变量