我目前正在为我们的内部日志文件(由log4php,log4net和log4j生成)解析器。到目前为止,我有一个很好的正则表达式来解析日志,除了一个恼人的位:一些日志消息跨越多行,我无法正确匹配。正则表达式我现在是这样的:使用正则表达式解析日志文件
(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}):\d{2}:\d{2}),\d{3})\s(?<message>.+)
的日志格式(我用于测试的解析器)是这样的:
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标志正则表达式,从而使 “”匹配所有字符,而不仅仅是除了新行之外的所有字符(这是默认值)。
我试过了,但是它匹配了整个文件。我也尝试将消息组设置为。+? (非贪婪),但它匹配单个字符(这不是我正在寻找的)。
问题是,该消息的模式也与日期组相匹配,所以当它不在新行上断开时,它只会继续前进。
我现在使用这个正则表达式作为消息组。它的工作原理是,除非日志消息中的模式与日志消息的开头相同。
(?<message>(.(?!\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3}\s\[\d{4}\]))+)