在本文将主要介绍 nginx 配置文件中 log_format 和 access_log 指令。其中,通过 log_format 设置日志输出格式;通过 access_log 设置日志输出位置;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"';
上面是 nginx 配置文件中官方给出的日志格式实例,默认是被注释的。下面将分别介绍其中每部分的含义:
$remote_addr 远程客户端的IP地址
$remote_user 远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如:登录百度的用户名 scq2099yt,如果没有登录就是空白
$time_local 访问的时间与时区,比如:18/Jul/2012:17:00:01 +0800,时间信息最后的 "+0800" 表示服务器所处时区位于 UTC 之后的 8 小时
$request 请求的 URI 和 HTTP 协议,这是整个 PV 日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status 记录请求返回的 http 状态码,比如:成功是 200,没有找到是 404
$body_bytes_sent 发送给客户端的文件主体内容的大小,比如:899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 客户端浏览器信息
$http_x_forwarded_for 客户端的真实 ip,通常 web 服务器放在反向代理的后面,这样就不能获取到客户的 IP 地址了,通过 $remote_add 拿到的 IP 地址是反向代理服务器的 iP 地址。反向代理服务器在转发请求的http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 IP 地址和原来客户端的请求的服务器地址
$server_name 虚拟主机名称
$uptream_status upstream状态,比如成功是200
$upstream_addr 后端服务器的IP地址
$upstream_status 后端服务器返回的HTTP状态码
$ssl_protocol SSL协议版本,比如TLSv1
$ssl_cipher 交换数据中的算法,比如RC4-SHA
$upstream_addr upstream的地址,即真正提供服务的主机地址
$request_time 整个请求的总时间
$upstream_response_time 请求过程中,upstream 的响应时间
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
192.168.238.1 - - [06/Jul/2018:13:58:49 +0800] "GET /images/sli-rit.png HTTP/1.1" 200 730 "https://business.hxstrive.com/css/style.css" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3722.400 QQBrowser/10.5.3751.400"
其中:
$remote_addr :远程客户端IP地址为 192.168.238.1
$remote_user :为空
$time_local : 请求时间为 06/Jul/2018:13:58:49 +0800
$request :请求行为 GET /images/sli-rit.png HTTP/1.1,包含了HTTP方法、资源地址和HTTP协议
$status :HTTP状态码为 200
$body_bytes_sent :HTTP报文主体部分的长度为 730
$http_referer :该请求来源于那个页面。这里为 https://business.hxstrive.com/css/style.css
$http_user_agent :用户浏览器信息为“Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3722.400 QQBrowser/10.5.3751.400”
$http_x_forwarded_for :如果通过代理访问,该字段为真实客户端的IP地址,此处为空
自定义自己的日志格式。日志只包含“远程地址”和“请求行”信息。
# 自定义日志格式 log_format simple '$remote_addr $request';
输出如下:
192.168.238.1 GET /images/img-sprite.png HTTP/1.1
192.168.238.1 GET /images/content_middle.jpg HTTP/1.1
192.168.238.1 GET /images/header_bg.jpg HTTP/1.1
192.168.238.1 GET /images/2.png HTTP/1.1
192.168.238.1 GET /images/tooltip.png HTTP/1.1
192.168.238.1 GET /favicon.ico HTTP/1.1
其中:
$remote_addr 为 192.168.238.1,表示客户的IP地址
$request 为 GET /favicon.ico HTTP/1.1 请求行信息
上面用了 log_format 指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径。格式如下:
access_log path(存放路径) format_name(自定义日志名称,和 log_format 设置的名称一致)
示例:
access_log /root/nginx/logs/access.log myFormatName;
注意:
access_log 可以在 http 模块中为所有的虚拟机指定统一的日志位置,也可以为某个虚拟机(server)指定独有的日志位置。
实例:为 phone.hxstrive.com 设置特有的日志位置。如下:
http { include mime.types; default_type application/octet-stream; # 自定义日志格式 log_format simple '$remote_addr $request'; server { listen 80; server_name phone.hxstrive.com; # 指定日志格式和日志格式化名称 access_log /root/log/phone.log simple; location / { root html; index index.html; proxy_pass https://localhost:8080/phone/; proxy_redirect off; proxy_connect_timeout 4s; proxy_read_timeout 600s; proxy_send_timeout 8s; } } }
当然也可以为所有server设置统一的日志,如下:
http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; log_format simple '$remote_addr $request'; #access_log logs/access.log main; access_log /root/log/access.log simple; }
注意:
在定义日志目录中要注意的是,nginx 进程设置的用户和组必须有对该路径创建文件的权限,假设 nginx 的 usr 指令设置的用户名和用户组都是 www,而 logs 目录的用户名和组是 root,那么日志文件将无法被创建。