【问题标题】:Issue with parsing combined log format log解析组合日志格式日志的问题
【发布时间】:2016-02-14 08:29:49
【问题描述】:

我已更改我的 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

我尝试通过实时在线正则表达式工具玩弄正则表达式,但没有任何运气。

任何帮助将不胜感激。

【问题讨论】:

    标签: php regex parsing logging nginx


    【解决方案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]+)$
    

    【讨论】:

    • 谢谢克里斯。我想我是在无意中复制/粘贴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2015-11-27
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多