首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用正则表达式解析日志文件

使用正则表达式解析日志文件
EN

Stack Overflow用户
提问于 2018-12-06 01:52:38
回答 2查看 0关注 0票数 0

我正在为我们的内部日志文件(由log4php,log4net和log4j生成)处理解析器。到目前为止,我有一个很好的正则表达式来解析日志,除了一个恼人的位:一些日志消息跨越多行,我无法正确匹配。我现在的正则表达式是这样的:

代码语言:javascript
复制
(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}):\d{2}:\d{2}),\d{3})\s(?<message>.+)

日志格式(我用于测试解析器)是这样的:

代码语言:javascript
复制
07/23/08 14:17:31,321 log 
message
spanning
multiple
lines
07/23/08 14:17:31,321 log message on one line

当我立即运行解析器时,我只获得日志开始的行。如果我将其更改为跨越多行,我只得到一个结果(整个日志文件)。

@samjudson:

您需要将RegexOptions.Singleline标志传递给正则表达式,以便“。” 匹配所有字符,而不仅仅是除新行之外的所有字符(这是默认值)。

我尝试过,但它匹配整个文件。我还尝试将消息组设置为。+?(非贪婪),但它匹配单个字符(这不是我正在寻找的)。

问题是消息的模式也在日期组上匹配,因此当它不在新行上中断时它就会继续打开和打开。

我现在将此正则表达式用于消息组。除非日志消息中的模式与日志消息的开头相同,否则它可以工作。

代码语言:javascript
复制
(?<message>(.(?!\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3}\s\[\d{4}\]))+)
EN

回答 2

Stack Overflow用户

发布于 2018-12-06 10:31:23

你显然需要将“消息行”与“日志行”区分开来; 如果你允许消息部分以新行之后的日期/时间开始,那么根本无法确定消息的哪些部分以及什么不是。因此,您需要一个表达式,允许任何不包含换行符后跟日期和时间的表达式,而不是使用点。

但是,就个人而言,我不会使用正则表达式来解析整个日志条目。我更喜欢使用自己的循环迭代每一行,并使用一个简单的正则表达式来确定一行是否是新条目的开头。从可读性的角度来看,这也是我的偏好。

票数 0
EN

Stack Overflow用户

发布于 2018-12-06 11:22:23

你需要通过RegexOptions。单行标志中的正则表达式,以便“。” 匹配所有字符,而不仅仅是除新行之外的所有字符(这是默认值)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档