解析组合日志格式日志的问题

时间:2015-11-12 20:57:55

标签: php regex parsing logging nginx

我更改了我的nginx日志以显示自定义日志而不是默认日志。我添加了两个字段$ request_time和$ upstream_response_time。我正在使用PHP来解析它。

我对正则表达式不太好但是我试图修改我从Parse Apache log in PHP using preg_match

中选择的另一个正则表达式

正则表达式是:

$regex = '/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$/';

我对正则表达式不太满意,所以这就是我要做的事情:

$pattern = '/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$ ^(\S+) ^(\S+) /';

我的输入看起来像这样:

$line = "127.0.0.1 - - [12/Nov/2015:13:39:19 -0500] \"GET /mj/feed/ HTTP/1.1\" 200 3276 \"-\" \"rogerbot/1.0 (http://www.moz.com/dp/rogerbot, rogerbot-crawler@moz.com)\" 0.254 0.254";

以上两个额外字段为0.2540.254

所以我正在尝试获取[14] = 0.254[15] = 0.254

我试过通过实时在线正则表达式工具来运行正则表达式而没有任何运气。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

^是字符串的开头(如果正在使用m修饰符,则为行)。在一个角色类中,它否定了里面的角色。所以

^(\S+) ^(\S+)

不在你的正则表达式中间工作。

尝试一下:

^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)" (\S+) (\S+)$

Regex101演示:https://regex101.com/r/lQ6zX9/1

或使用否定字符类的其他写作方式:

^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)" ([^\s]+) ([^\s]+)$