我有一些自定义日志文件,我正在尝试使用Log Parser Lizard中的正则表达式引擎进行解析。我觉得我应该能够解析它们,但我根本无法让它工作。日志文件的结构如下:
2016-09-20 00:42:29.420 DBG 8 Finished receiving 154 bytes from 100.100.100.100:6000.[cr][lf]
2016-09-20 00:42:29.420 DBG 8 The document received is:[lf]
<?xml version="1.0" encoding="UTF-8"?><tagname:stuff xmlns:data="some:data:here">[lf]
<more:stuff xmlns:blah="more:stuff">[lf]
</more:stuff>[lf]
</tagname:stuff>[lf]
[cr][lf]
2016-09-20 00:42:29.420 DBG 8 Parsing the document for information...[cr][lf]
2016-09-20 00:42:29.420 INF 8 Finished parsing incoming document for stuff from 100.100.100.100:6000.[cr][lf]
(上面的[cr]和[lf]是编码的回车符/换行符的表示,而不是文字字符。)
这里的想法是每条记录以回车/换行结束。但是,第二个记录中的第二个消息字段是多行的,仅以换行符结尾。 (没有回车。)我需要将多行字段全部包含在内,使用正则表达式可以 。
在一些正则表达式测试人员中,我认为这条线似乎按预期工作:
(?<DateTime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3})\s*(?<Type>\w+?)\s*(?<Thread>\d+?)\s*(?m:(?<Message>(?:.*\n?)*))
如果我将其插入RegExBuddy,如果我将其设置为PCRE并将换行符设置为“CR,LF或CRLF”,那么它可以正常运行。但是,当我将其输入到LPL中的regexfileconfig.xml中时(当然正确地进行了转义),第二行的消息是“收到的文档是:”而没有其他内容。它忽略了整个XML文档。 (这个工具绝对需要解析才对我有任何价值。)
我已经尝试使用RegExBuddy将其转换为C#(。NET 2.0-4.6)格式,它会吐出这个正则表达式:
(?<DateTime>[0-9]{4}-[0-9]{2}-[0-9]{2}[\t\n\v\f\r ][0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3})[\t\n\v\f\r ]*(?<Type>[0-9A-Za-z_]+?)[\t\n\v\f\r ]*(?<Thread>[0-9]+?)[\t\n\v\f\r ]*(?m:(?<Message>(?:[^\n\r]*\n?)*))
将所有其他选项设置为默认值时,它再次完美运行。但是,它在Log Parser Lizard中根本不起作用。我已经尝试将查询类型设置为所有4种不同类型的RegEx,但是它们中的每一种都会产生不同的结果,其中没有一种是正确的。
非常感谢任何帮助。提前谢谢!
编辑预期输出: Log Parser Lizard将数据作为表返回,命名的捕获组作为列标题。我在找一张这样的桌子:
DateTime Type Thread Message
2016-09-20 00:42:29.420 DBG 8 Finished receiving 154 bytes from 100.100.100.100:6000.
2016-09-20 00:42:29.420 DBG 8 The document received is:
<?xml version="1.0" encoding="UTF-8"?><tagname:stuff xmlns:data="some:data:here">
<more:stuff xmlns:blah="more:stuff">
</more:stuff>
</tagname:stuff>
2016-09-20 00:42:29.420 DBG 8 Parsing the document for information...
2016-09-20 00:42:29.420 INF 8 Finished parsing incoming document for stuff from 100.100.100.100:6000.