去年年底,开发第一版logwatch的时候,就有关注到Lpeg这个项目。

调研期间看了mozilla的heka项目,在解析日志时引入了lua的sandbox,

其定义的解析函数主要依赖Lpeg来实现,(LPEG可以称为PEG的Lua实现)。

PEG相关知识自行google–>解析表达文法。

日志领域的Lpeg

为什么mozilla的heka要引入lua和lpeg呢?

heka是基于go开发的高性能日志处理工具,lua也是以性能著称的,

而且增加或者修改lua文件并不需要重新编译,非常理想的插件模式。

对于一般的日志文件解析来说正则就足够强大了,但这个世界并不完美,

总有一些特殊情况,导致了复杂度。假如日志文件里存在一种以上的格式,

如何高效的进行解析?如何解析抽取UserAgent这样的字段?

模式匹配是一个很不错的选择,lua领域的lpeg就可以完成这个工作。

几年前我在看一个解析UserAgent的java库,大概实现思路是要跑N条正则,

看看哪个可以完成解析,这样的效率显然是很低。

初识Lpeg

Lpeg的入门还是有一些难度的,语法比较怪异,相关的例子也不是很多。

我在git上建了一个项目,记录了我练习的一些例子,从最简单的计算器、

到一个日期格式自动识别转化的工具、再到一个简易的模板(支持变量替

换和for循环语句)。【lpeg-test】

如果你想用lpeg来自制一门脚本语言parser的话,还是要借助一些高级库,

比如【label】【parser】【lexer】