正则表达式 - 从日志C#获取模式后的所有文本

时间:2015-08-18 08:45:31

标签: c# regex parsing logging

我有以下日志文​​件,我想在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行收集到一个组中。 所以"丢弃...参数)" 将是整个消息。

4 个答案:

答案 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+:|$)"

DEMO

答案 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,参见标签。

enter image description here

答案 2 :(得分:0)

亚历克斯。试试这个:

string pattern = @"^(\S+) (\S+ \S+) (\S+) ((?:.*(?:\n\s)?)+)";

(样本在这里:https://regex101.com/r/uI4uQ0/1

  1. (\ S +)=“5376:0084”;
  2. (\ S + \ S +)=“2015-08-07 13:51:29.103”
  3. (\ S +)=“错误”(仅限一个字)
  4. ((?:。*(?:\ n \ s)?)+)=“......会议
    系统...
    在......“
  5. Magick在这里:“\ n \ s”。它说我们需要换行和任何空白字符。

    祝你好运,MiKe。

答案 3 :(得分:0)

除了正则表达式之外,对于解析日志文件,您可以使用TextFieldParser类。虽然这是一个不必要的依赖Microsoft.VisualBasic.FileIO.TextFieldParser,但它是一个很好的。

以下是关于如何使用此类的good tutorial