0

我从日志中提取异常,这里是一个例子:

异常:System.InvalidOperationException:集合已修改;枚举操作可能无法执行。在 System.Collections.Generic.List`1.Enumerator.MoveNextRare() 在 test.Modules.UI.Table.<>c_DisplayClass2.b _0 () 在 System.Win

有时日志使用不同的语言,所以它看起来像这样:

例外:System.InvalidOperationException:La colección fue modificada,la opecion de enumeración no puede ejecutar。在 System.Collections.Generic.List`1.Enumerator.MoveNextRare() 在 Test.Modules.UI.Table.<>c_ DisplayClass2.b _0() 在 System.Win

正如您所看到的,只有异常部分不同,因为它使用不同的语言,但之后的部分将是相同的。我将所有这些异常都存储在数据库中,长度都修剪为 300 个字符,因为它们通常更长,但 300 个字符足以判断是否相同

所以我想可能会跳过异常并比较接下来的 300 个字符,但是要知道异常在哪里结束非常困难,没有任何具体的内容可以显示异常的开始和结束。

有什么想法我可以克服这个吗?也许我只是使用 Levenshtein 来突出显示紧密匹配的位置,然后我可以过滤它们,并可能设置一个界面,一旦我手动识别出用不同语言编写的相同异常,我就可以链接异常?

我的最终目标是查看数以千计的这些日志,看看有多少异常是相同的,大多数日志是英文的,但可能有 25% 不是英文的,所以通常我可以在例外,因为例外部分的语言不同,它可能只有 60-70% 的匹配。在极少数情况下,异常之后的部分与不同的异常非常接近,但这种情况很少见,因此不必太担心

我需要在 PHP 中执行此操作

4

1 回答 1

0

不是 100% 稳健,但您可以根据第二个分号之前的文本和单词后面的文本进行匹配at。我敢打赌这个词at后面跟着一个新行,所以这个词+新行不太可能出现在异常消息本身中(使它成为一个不错的选择作为分隔符)。

我认为您设计的任何方案都希望完全忽略异常消息。您不会在语言之间找到共同的结构,因此允许文本消息成为匹配排名的一部分只会削弱您匹配的信心。

于 2012-11-03T16:51:40.790 回答