我有以下日志文件,我想在C#中解析。
我已经走上了使用RegEx来解决大部分问题的路线。 我已经在RegExr中对MultiLine(m)标记进行了测试。
日志
5376:0084 2015-08-07 13:51:29.103 Error ### Error Message ###
5376:0084 2015-08-07 13:51:35.545 Error Discarding invalid session
System.Web.Services.Protocols.SoapException: Verify Session ID failed
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
5376:0084 2015-08-07 13:51:36.013 Error ### Error Message ###
拆分为表格:
| ProcessID | DateTime | Type | Message |
|-----------|-------------------------|-------|-----------------------|
| 5376:0084 | 2015-08-07 13:51:29.103 | Error | ### Error Message ### |
我使用了以下模式
string pattern = @"(.*:\d{4}) ((\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{3})) ([A-Za-z\n]+) (.*$)";
这得到了1,3和1.3行。 6但是我想把第2-5行收集到一个组中。 所以"丢弃...参数)" 将是整个消息。
答案 0 :(得分:1)
您还需要匹配Message
处存在的换行符
部分。这可以通过使用DOTALL修饰符s
来实现。
@"(?s)(\d+:\d{4}) (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) ([A-Za-z\n]+) (.*?)(?=\n\d+:|$)"
或
@"(?s)(?:\n|^)(\d+:\d{4}) (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) ([A-Za-z\n]+) (.*?)(?=\n\d+:|$)"
答案 1 :(得分:1)
请注意,在日志解析中,命名捕获是一个很好的帮助,我强烈建议使用它们。此外,您可以使用内联单行修饰符(?s:...)
更好地控制使用RegexOptions.Singleline
捕获的内容。这样,您就不必使用全局.
选项,并且仍然可以使用var pattern = @"(?m)^(?<ProcessID>\d{4}:\d{4})\s+(?<DTime>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+)\s+(?<Type>\w+)\s+(?<Message>(?s:.*?(?=\n\d+:\d+|\r?\z)))";
来匹配除换行符之外的任何符号。
这是我的尝试:
(?m)
此处,^
设置\d{n}
的多行模式以匹配行开头,然后我修改了ID和日期时间子模式,以获得Type
[\w\s]+
更高效的子模式} part可以根据您的需要进行实际调整(例如Message
),而XXX:XXXX
部分只匹配新行上\n\d+:\d+
的任意数量的字符(由于{{{ 1}})或直到字符串的末尾(\z
)。
请参阅regex demo,参见表标签。
答案 2 :(得分:0)
亚历克斯。试试这个:
string pattern = @"^(\S+) (\S+ \S+) (\S+) ((?:.*(?:\n\s)?)+)";
(样本在这里:https://regex101.com/r/uI4uQ0/1)
Magick在这里:“\ n \ s”。它说我们需要换行和任何空白字符。
祝你好运,MiKe。答案 3 :(得分:0)
除了正则表达式之外,对于解析日志文件,您可以使用TextFieldParser
类。虽然这是一个不必要的依赖Microsoft.VisualBasic.FileIO.TextFieldParser
,但它是一个很好的。
以下是关于如何使用此类的good tutorial。