追踪缺失的东西

Tracing Whats Missing

我有一个如下形式的日志文件,我想分析一下。

[ 2016.03.09 20:40:28 ] (MessageType) Some message text that depends on the <MessageType>

由于文本的形式取决于消息类型,我需要一个规则来识别消息类型,并需要一个规则来解析消息体本身。为了帮助我在相关语法中挣扎,我使用了 jnthn 的 Grammer::Debugger 模块中的 Grammer::Tracer。这是一个很好的模块,它会告诉我哪里匹配成功了,以及在哪一点上 Grammer 放弃了解析。在匹配成功的情况下,它会显示部分被成功解析的子串。如果解析一个规则或标记失败,它会告诉你,但不会显示违规的字符串。语法纠缠的全部目的是识别不匹配的位,并修改语法,直到它们消失。不显示错误的字符串并没有太大帮助。

但不要害怕,因为 grammar 是类,因此可以有方法。让我们定义一个方法,并将其添加到一个选项链中。

method parse-fail {
    # self is a subclass of Grammar
    say self.postmatch.substr(0, 100);
    exit 0;
}

rule body-line { '[' <timestamp> ']' [ <body-notify> | <body-question> | <body-info> | <body-warning> || <parse-fail> ] }

所以,当已知的消息类型都不匹配时,Grammar 就会停止,并显示仍需要处理的字符串。这样,我就可以解析所有8768个文件,直到把它们全部处理完毕。而且这比使用 Grammar::Tracer 运行要快得多。

让民间人士实现一种他们想使用的语言来实现这种语言似乎非常有用。

by glfdex.

comments powered by Disqus