正则表达式或("|")匹配优先级控制

最近在使用阿里云的日志服务,其中比较灵活的地方是支持自定义正则匹配,可以使用正则匹配字段,也可以作为多行日志的条件。公司的日志格式没有一个统一的标准,大概有几十种日志格式,还好我的正则原本玩得666,否则我们这日志部署到阿里云日志服务上可能一般人得玩累死。

匹配多行日志开始头(单行亦如此)的正则格式如下:

(^\[[A-Za-z]+|^\[\d{4,}|^\d{4,}|^\[\d{1,2}\-\w+\-\d{2,}|^\d+\.\d+\.\d+\.\d+|^time=).+

匹配日志内容的正则格式如下:

(.*?((\d{4}[-/\.]\d{2}[-/\.]\d{2}|\d{1,2}[-/\.][A-Za-z]{3,}[-/\.]\d{4})[:\sT-]*\d{0,2}:{0,1}\d{0,2}:{0,1}\d{0,2}\.{0,1}\d{0,9}[\sZ]{0,1}[\+-]{0,1}[:\d]*|\d{10}).+)

其中\d{10}表示匹配时间戳(有的日志是使用时间戳作为日志时间,无奈...),正则表达式的|符号优先级往往是前面的优先级比后面的高,因此这里将\d{10}放置到末尾。此外,.*?使用了非贪婪匹配也是一个重点,否则该表达式无法达到预期结果。

Leave a Reply

Your email address will not be published.