用于格式化 Apache 日志的 PHP 正则表达式模式


PHP regex pattern to format Apache logs

我有这个正则表达式模式,适用于我当前的 apache 日志格式:

preg_match("/^('S+) ('S+) ('S+) '[([^:]+):('d+:'d+:'d+) ([^']]+)'] '"('S+) (.*?) ('S+)'" ('S+) ('S+) ('".*?'") ('".*?'")$/", $line, $matches); // pattern to format the line

它适用于以下日志:

127.0.0.1 - - [19/Jun/2012:11:38:37 +0200] "GET /some_page HTTP/1.1" 200 8243 "http://example.com/referrer" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5"

现在我已经更改了 apache 日志格式以包含服务器名称,因此新日志将是:

127.0.0.1 - - [19/Jun/2012:11:38:37 +0200] **servername.com** "GET /some_page HTTP/1.1" 200 8243 "http://example.com/referrer" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5"

它唯一做的是在"GET/url..."之前添加 servername.com。

现在正则表达式不再工作,我不知道我必须修改什么才能使其与新的日志格式匹配。

这是您更新的正则表达式:

preg_match("/^('S+) ('S+) ('S+) '[([^:]+):('d+:'d+:'d+) ([^']]+)'] ['w.]+ '"('S+) (.*?) ('S+)'" ('S+) ('S+) ('".*?'") ('".*?'")$/", $line, $matches);

我添加了一个额外的 [''w.]。+ 应与您的服务器名称匹配的组。