我们在生产环境中使用以下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”?
答案 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。