nginx日志中的完整记录URL

use*_*451 52 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;
Run Code Online (Sandbox Code Playgroud)

" 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 "共享相同的请求"Get/ping".

如何在nginx日志中记录"a.test.com"或"b.test.com"?

Tan*_*Tat 51

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

log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$host" "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $request_time';
Run Code Online (Sandbox Code Playgroud)

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

$主机

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

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

  • 这是预定义的组合格式(添加了$ host),供需要的人使用;发问者的示例中不包含“ $ remote_addr”,许多人都希望使用该地址来获得标准用户的IP地址:`log_format组合了“ $ remote_addr-$ remote_user [$ time_local]”“”“ $ host”“ $ request” $ status $ body_bytes_sent''“” $ http_referer“” $ http_user_agent“';`来源:http://nginx.org/zh/docs/http/ngx_http_log_module.html (2认同)

Tim*_*ray 36

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

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';
Run Code Online (Sandbox Code Playgroud)

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

  • 这种格式的优点是可以通过期望标准格式的东西进行解析,例如filebeat nginx模块和logstash的grok模式 (4认同)
  • 谢谢。就我而言,第一个字段使用 `$remote_addr` 更好 (3认同)
  • `$http_x_forwarded_for` 可帮助您在多种情况下捕获客户端 IP,例如客户端直接连接以及客户端通过 Cloudflare 等代理连接。 (3认同)