nginx日志中的完整记录URL

时间:2014-01-15 11:05:06

标签: nginx

我们在生产环境中使用以下nginx站点配置文件。

log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" $request_time';



server {
        root /srv/www/web;
        server_name *.test.com;
        access_log /var/log/nginx/xxx.test.com.access.log main;

http://a.test.com/ping”和“http://b.test.com/ping”http请求都将记录在文件xxx.test.com.access.log中。

但是有一个问题,nginx不会在xxx.test.com.access.log中存储“域名”。

http://a.test.com/ping”和“http://b.test.com/ping”共享相同的请求“获取/ ping”。

如何在nginx日志中录制“a.test.com”或“b.test.com”?

2 个答案:

答案 0 :(得分:45)

尝试在log_format中添加$host变量:

log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$host" "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $request_time';

http://wiki.nginx.org/HttpCoreModule#.24host

  

$宿主

     

此变量等于请求或名称标题中的行Host   如果主机头不是,则处理请求的服务器   可用。

     

此变量可能与$ http_host具有不同的值   情况:1)当主机输入标头不存在或具有空值时,   $ host等于server_name指令的值; 2)当值   主机包含端口号,$ host不包含该端口号。   自0.8.17以来,$ host的值始终为小写。

答案 1 :(得分:30)

如果您想记录完整的请求网址,那么我的方法是

log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request_method $scheme://$host$request_uri $server_protocol" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';

因此将$ request拆分为其组成部分并在中间弹出$ host。还可以让您查看请求是http还是https。