Nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module

通过访问日志,你可以得到用户地域来源,跳转来源,使用终端,某个URL访问量等相关信息;通过错误日志,可以得到系统某个服务或server的性能瓶颈,日志就是信息,日志就是问题的答案。

Nginx 配置文件中日志的配置路径一般为:/usr/local/nginx/conf/nginx.conf

 

Nginx 日志参数详解

$remote_addr 客户端ip地址(若使用了高匿代理服务器,显示代理服务ip),例如 123.57.78.100

$remote_port  客户端的端口,例如 54673

$http_x_forwarded_for  可以记录客户端IP,通过代理服务器来记录客户端的ip地址

$remote_user 用户记录远程客户端的用户名称,一般为 '-'

$http_host($host) 浏览器中输入的地址(IP或域名),例如: proxy.mimvp.com 或 123.57.78.100

$time_local   用具记录访问时间和时区,日期格式:18/Feb/2017:14:10:17 +0800

$time_iso8601   用具记录访问时间和时区,日期格式:2017-02-18T14:10:17+08:00

$status 响应状态码 ‘404’页面找不到 ‘200’成功等

$request_time 整个请求的总时间,从接收用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间,程序响应时间,输出响应数据时间

$bytes_sent  传输给客户端的全部字节数,包含响应头等信息

$body_bytes_sent 给客户端发送的文件主题内容字节数,响应头不计算在内

$request_length 请求的长度(包括请求的地址,http请求头和请求主体)

$http_referer  url跳转来源,用来记录从哪个页面链接访问过来的,例如:https://proxy.mimvp.com

$upstream_addr  后台提供服务的地址(即转发处理的目标地址)

$upstream_response_time  从nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间

$upstream_status  upstream状态,例如 200

$http_user_agent 用户所使用的代理(一般为浏览器)

$request   用于记录请求的url以及请求方法,格式:"GET /free.php?proxy=in_tp HTTP/1.1"

$request_method   用于记录请求的url以及请求方法,格式:GET、POST

$request_body 客户端的请求主体,此变量可以在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理

$args 请求中的参数值,格式:"proxy=in_tp"

$uri 请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令修改,格式:"/free.php"

$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改

$ssl_protocol   SSL协议版本,例如 TLSv1、TLSv2

$ssl_cipher   SSL协议的交换数据中的算法,例如 RC4-SHA,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-GCM-SHA384

$geoip_country_code  用户地理位置代码(国家代码)

$http_accept_language  用户浏览器语言。如:上例中的 "es-ES,es;q=0.8"

$http_true_client_ip 客户端的真实ip地址

 

Nginx的log_format有很多可选的参数用于指示服务器的活动状态,默认的是:

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

 

日志格式自定义配置

Nginx 配置的日志格式

log_format   main   '$time_iso8601 $remote_addr $remote_user "$request" "$uri" - '
                    '$status $request_time $request_length $body_bytes_sent/$bytes_sent $ssl_protocol $ssl_cipher - '
                    '$http_referer $http_x_forwarded_for "$http_user_agent"';

access_log          logs/access.log  main;

Nginx 对应的运行日志:

2018-11-20T23:37:40+08:00 119.15.90.30 - "GET /free.php?proxy=out_hp&sort=&page=1 HTTP/1.1" "/free.php" - 200 0.156 362 6849/7213 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - - - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)"
2018-11-20T23:37:44+08:00 117.30.95.62 - "GET /partner.php HTTP/1.1" "/partner.php" - 200 0.016 457 6534/6956 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - https://blog.csdn.net/ithomer/article/details/6566739 - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
2018-11-20T23:37:44+08:00 117.30.95.62 - "GET /css/bootstrap.min.css HTTP/1.1" "/css/bootstrap.min.css" - 200 0.045 398 19402/19757 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - https://proxy.mimvp.com/partner.php - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
2018-11-20T23:37:44+08:00 117.30.95.62 - "GET /css/hint.min.css HTTP/1.1" "/css/hint.min.css" - 200 0.000 393 1635/1989 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 - https://proxy.mimvp.com/partner.php - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

 

Apache 配置的日志格式

LogFormat "%{%Y-%m-%dT%H:%M:%S+08:00}t %h %u \"%m %U%q %H\" \"%U\" - %>s %T/%D %I %b/%O %{SSL_PROTOCOL}x %{SSL_CIPHER}x - %{Referer}i %{X-Forwarded-For}i \"%{User-Agent}i\"" customlog

Apache 对应的运行日志:

2018-11-20T23:38:36+08:00 106.39.149.200 - "POST /wp-admin/admin-ajax.php HTTP/1.1" "/wp-admin/admin-ajax.php" - 200 0/349792 1520 101/706 TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 - https://blog.mimvp.com/wp-admin/post.php?post=29756&action=edit - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
2018-11-20T23:38:36+08:00 106.39.149.200 - "GET /article/27722.html HTTP/1.1" "/article/27722.html" - 200 0/21943 991 35794/36405 TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 - - - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
2018-11-20T23:38:38+08:00 106.39.149.200 - "GET /wp-admin/admin-ajax.php?postviews_id=27722&action=postviews&_=1542728317638 HTTP/1.1" "/wp-admin/admin-ajax.php" - 200 0/345844 1177 3/466 TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 - https://blog.mimvp.com/article/27722.html - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
2018-11-20T23:38:43+08:00 220.181.51.110 - "GET /article/25537.html HTTP/1.1" "/article/25537.html" - 200 0/95574 719 122125/126073 TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 - - - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"

详见米扑博客:Apache 日志格式详解

如上,Nginx 和 Apache 服务器的日志格式相同了,分析统计就方便了

 

 

log_format 日志格式详解

log_format指令用来设置日志的记录格式,它的语法如下:
log_format name format {format ...}
其中name表示定义的格式名称,format表示定义的格式样式。
 
log_format有一个默认的、无须设置的combined日志格式设置,相当于Apache的combined日志格式,其具体参数如下:
log_format combined '$remote_addr-$remote_user [$time_local]'
‘"$request"$status $body_bytes_sent’
 ‘"$http_referer" "$http_user_agent"’
 
也可以自定义一份日志的记录格式,不过要注意,log_format指令设置的名称在配置文件中是不能重复的。
 
假设将Nginx服务器作为Web服务器,位于负载均衡设备、Squid、Nginx反向代理之后,不能获取到客户端的真实IP地址了。
原因是经过反向代理后,由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP。
通过$remote_addr变量拿到的将是反向代理服务器的IP地址。
 
但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。
这时候,要用log_format指令设置日志格式,让日志记录X-Forearded-For信息中的IP地址,即客户的真实IP。
 
例如,创建一个名为mylogformat的日志格式,再$http_x_forwarded_forlog_for变量记录用户的X_Forwarded-For IP 地址:
log_format mylogformat '$http_x_forwarded_for_$remote_user [$time_local]'
‘"$request"$status $body_bytes_sent’
 ‘"$http_referer" "$http_user_agent"’
在日志格式样式中,变量$remote_addr和$http_x_forwarded_for用于记录IP地址;
$remote_user用于记录远程客户端用户名称;
$time_local用于记录访问时间与时区;
$request用于记录请求URL与HTTP协议;
$status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404;
$body_bytes_sent用于记录发送客户端的文件主体内容大小;
$http_referer用于记录是从哪个页面链接访问过来的;
$http_user_agent用于记录客户浏览器的相关信息。

 

 

参考推荐

Nginx 错误日志配置详解

Apache 日志格式详解

Nginx 配置文件详解

Nginx 配置文件禁止访问目录或文件