关于c#:使用正则表达式解析日志文件

关于c#:使用正则表达式解析日志文件

Parsing a log file with regular expressions

我目前正在为内部日志文件(由log4php,log4net和log4j生成)解析器。到目前为止,我有一个很好的正则表达式来解析日志,除了一个令人讨厌的地方:一些日志消息跨越多行,我无法正确匹配。我现在使用的正则表达式是:

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

日志格式(我用于测试解析器)是:

1
2
3
4
5
6
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标志传递到正则表达式中,以便使用"。"。与所有字符匹配,不仅匹配除换行符(默认值)以外的所有字符。

我尝试过,但是随后它匹配了整个文件。我还尝试将消息组设置为。 ? (非贪婪),但随后它匹配一个字符(这也不是我要查找的字符)。

问题在于消息的模式在日期组上也匹配,因此当它在换行符上不中断时,它会不断出现。

我现在将此正则表达式用于消息组。除非日志消息中有与日志消息开头相同的模式,否则它会起作用。

1
(?<message>(.(?!\\d{2}/\\d{2}/\\d{2}\\s\\d{2}:\\d{2}:\\d{2},\\d{3}\\s\\[\\d{4}\\]))+)

这仅在日志消息在行首不包含日期的情况下有效,但是您可以尝试在"消息"组中为日期添加否定的前瞻性断言:

1
2
(?<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标志。


您显然需要将"消息行"与"日志行"区分开来;如果您允许消息部分以换行后的日期/时间开头,则根本无法确定消息的一部分,什么不是。因此,除了使用点之外,还需要一个表达式,该表达式允许所有不包含换行符后跟日期和时间的内容。

但是,就我个人而言,我不会使用正则表达式来解析整个日志条目。我更喜欢使用自己的循环遍历每一行,并使用一个简单的正则表达式来确定行是否是新条目的开始。从可读性的angular来看,这也是我的偏爱。


您遇到的问题是,您需要终止RegEx模式,以便它知道一条消息何时结束然后下一条消息开始。

在默认模式下运行时,换行符用作隐式终止符。

问题是,如果进入多行模式,则没有终结符,因此模式会吞噬整个文件。非贪心匹配的字符越少越好。

现在,如果使用下一条消息的日期作为终止符,我认为您的解析器将仅获得每隔一行。

文件中是否还有其他内容可以终止模式?


您可能会发现,使用适当的解析器生成器来解析文件要容易得多-ANTLR可以在C#中生成一个...上下文自由解析器似乎很难,除非您"得到"它们-之后,它们变得更加简单且比正则表达式更友好使用...


您需要通过RegexOptions。在单行标志中加入正则表达式,使之为"。"。与所有字符匹配,不仅匹配除换行符(默认值)以外的所有字符。


推荐阅读

    linux命令日志输出?

    linux命令日志输出?,系统,状态,命令,情况,对比,标准,实时,服务,下来,数据,怎

    linux命令查寻日志?

    linux命令查寻日志?,系统,信息,对比,情况,日志,时间,第一,实时,命令,文件,lin

    linux访问日志的命令?

    linux访问日志的命令?,系统,信息,对比,实时,基础,日志,命令,文件,设备,管理,l

    linux命令保存日志?

    linux命令保存日志?,系统,信息,服务,数据,时间,下来,日志,文件,适当,等级,怎

    linux访问日志命令?

    linux访问日志命令?,系统,信息,对比,日志,简介,管理,情况,实时,命令,文件,查

    linux日志搜索命令?

    linux日志搜索命令?,信息,系统,对比,工具,一致,日志,文件,命令,实时,网络,lin

    linux远程日志的命令?

    linux远程日志的命令?,系统,时间,信息,实时,服务,对比,日志,数据,报告,分析,L

    linux中打日志命令?

    linux中打日志命令?,系统,实时,情况,服务,信息,对比,工作,日志,管理,名称,查

    linux日志查询命令行?

    linux日志查询命令行?,系统,信息,对比,电脑,工具,情况,日志,实时,服务,官网,l

    linux命令正则表达式?

    linux命令正则表达式?,工作,环境,基础,网络,单位,名称,平台,信息,正规,管理,L

    清楚日志命令linux?

    清楚日志命令linux?,系统,时间,信息,情况,日志,实时,对比,文件,命令,程序,lin

    linux日志复制命令?

    linux日志复制命令?,时间,信息,命令,日志,情况,实时,对比,报告,生产,环境,lin

    linux备份日志命令?

    linux备份日志命令?,系统,数据,工作,命令,备份,设备,名字,管理系统,设计,时

    linux执行命令的日志?

    linux执行命令的日志?,系统,信息,状态,项目,暂停,最新,环境,命令,日志,密码,l

    linux读取日志的命令?

    linux读取日志的命令?,系统,信息,情况,实时,对比,日志,命令,指令,文件,尾部,L

    linux打印日志的命令?

    linux打印日志的命令?,系统,信息,服务,名称,实时,异常,情况,管理,报告,日志,L

    linux搜索日志的命令?

    linux搜索日志的命令?,实时,信息,系统,对比,最新,情况,日志,命令,地方,数据,

    倒序看日志命令linux?

    倒序看日志命令linux?,系统,对比,实时,信息,情况,日志,名称,命令,事件,文件

    linux日志管理命令?

    linux日志管理命令?,系统,信息,工作,对比,管理,等级,基础,情况,实时,命令,lin

    linux进入日志的命令?

    linux进入日志的命令?,系统,信息,时间,基础,对比,管理,服务,工作,日志,命令,l