跳转至

Nginx 自定义日志


2016-03-30 by dongnan

举个栗子

为什么要自定义 nginx日志? 这里有个例子:

开发人员期望 nginx 能够记录 php-fpm (上游服务器)执行程序所花费的时间,以便优化服务器端(程序)响应时间提供数据, nginx 提供了 ngx_http_log_module 模块用于个性化日志配置。

环境描述

nginx 反向代理 php-fpm , 软件版本如下:

容器镜像: php:5.6-fpm
容器系统: debian 8 (jessie)
nginx版本: nginx-1.9.12

操作步骤

自定义日志格式

编辑 nginx.conf配置文件,log_format 指令中加入 $upstream_response_time 变量,例如:

# 执行命令
cat /etc/nginx/nginx.conf

# 省略...

http {
    # 省略...
    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" $upstream_response_time';       
}

使用自定义日志

在虚拟主机配置文件中使用自定义的日志。

# 执行命令
cat /etc/nginx/conf.d/default.conf

server {

    # 省略...
    access_log  /var/log/nginx/access.log access;
}

重启Nginx

nginx -t && nginx reload

验证

访问服务器日志输出如下,最后一个字段0.027 为上游php-fpm服务器所花费的时间。

# 执行命令
docker logs --tail 1 -f crm-web

119.188.116.16 - - [30/Mar/2016:16:59:45 +0800] "GET /index.php HTTP/1.1" 200 15035 
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) xxxx Version/9.0 Safari/601.1.56" 
106.37.1xx.2xx 0.027

日志相关指令

log_format

语法: log_format name string ...;
默认值:    log_format combined "...";
使用字段: http
功能: 定义日志格式。

access_log

语法: access_log path [format [buffer=size] ...];
      access_log off;
默认值: access_log logs/access.log combined;
使用字段: http, server, location, if in location
功能: 设置日志的路径、格式、配置缓冲。如果设置off 则关闭日志,如果未指定格式,则使用预定义的"combined"格式。

小结

最后来总结下文章中的知识点

  • log_format 指令提供个性化日志配置,access_log指令则使用定义好的日志格式。
  • $upstream_response_time 变量,是指从 nginx 向上游服务器建立连接开始到其执行结束的时间。
  • 此外还有一个 $request_time 变量,是指从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间。
回到页面顶部