c# - 使用正则表达式解析日志文件

标签 c# regex

我目前正在为我们的内部日志文件(由 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}\]))+)

最佳答案

只有当日志消息在行开头不包含日期时,这才有效,但您可以尝试在“消息”组中为日期添加否定的前瞻断言:

(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}:\d{2}:\d{2},\d{3})\s(?<message>(.(?!^\d{2}/\d{2}/
\d{2}))+)

请注意,这需要使用 RegexOptions.MultiLine 标志。

关于c# - 使用正则表达式解析日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41407/

相关文章:

c# - 在具有端点路由的 ASP.NET Core 中使用 CreatedAtRouteResult 生成带有段的 URL

c# - 通过浏览器进行 WCF Rest 服务 Windows 身份验证

c# - 在 C# 中从 DataGrid 导出到 Excel 时停止日期自动格式化

c# - Linq 查询结果到 List 集合

php - 使用正则表达式的 xpath 查询

java - 如何添加正则表达式来匹配字母数字字符和一些特殊字符

c# - 有没有办法在实例化对象时隐藏/显示某些方法?

javascript - string.match() 仅在 IE 8 中评估为 null

php - 分拣车辆登记

javascript - 使用正则表达式进行一元运算符拆分