1

我正在解析以下 apache 日志条目

59.167.203.103 - - [28/May/2013:03:12:47 +0000] "POST /some/some.htm HTTP/1.1" 200 1187 "-" "xyzf/2.00.16 xyzNetwork/609.1.4 xyzwin/13.0.0"

下面给出了 RegEx 及其工作正常。

String logentrypattern = "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\"";

但是在少数条目中,响应字节是“-”而不是某个值,这给了我以下错误并说无法解析。请帮助

Bad log entry (or problem with RE?):
89.178.46.54 - - [24/May/2013:17:04:59 +0000] "PUT /xyz-pmp/xyz-pmp.htm HTTP/1.1" 200 - "-" "kdm/1.0"
4

1 回答 1

1

你可以试试这个:

^([\\d.]+) (\\S+) (\\S+) \\[([\\w:\/]+\\s[+\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+|-) \"([^\"]+)\" \"([^\"]+)\"
                                                                                 ^^

我在你可以有破折号的地方添加了一点。也许你在\\S+那儿有一个街区会​​更好?好吧,这完全取决于你在做什么。如果目的是只接受带有数字的条目,那么您的正则表达式正在按预期工作。如果只是为了捕获条目的不同部分,请确保您了解数据的结构以及它们可以提供给您的不同形式。

于 2013-05-31T07:04:09.410 回答