nginx自定义access访问日志格式

2023-03-29 10:23:22 浏览数 (1)

在Nginx中,访问日志是非常重要的。默认情况下,Nginx将访问日志写入到access.log文件中。这个文件中包含了每个请求的时间、来源、请求方式、请求路径、状态码等基本信息。然而,有时候我们需要自定义访问日志的格式,以便更好地分析和监控访问信息。本文将介绍如何在Nginx中自定义访问日志格式。

Nginx访问日志格式

Nginx访问日志格式是由变量和字符串组成的格式化字符串。其中变量代表了需要记录的请求信息,字符串则代表了日志记录的格式。Nginx预定义了很多变量,如下所示:

  • $remote_addr:客户端IP地址
  • $remote_user:客户端用户名
  • $time_local:请求时间
  • $request:请求的URI和HTTP协议版本
  • $status:请求返回的状态码
  • $body_bytes_sent:发送给客户端的字节数
  • $http_referer:引用的页面地址
  • $http_user_agent:客户端代理信息

通过在访问日志中使用这些变量,可以记录请求的各种信息。默认情况下,Nginx的访问日志格式为:

代码语言:javascript复制
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
access_log  /var/log/nginx/access.log  main;

该格式将客户端的IP地址、用户名、请求时间、请求URI和HTTP协议版本、请求返回的状态码、发送给客户端的字节数、引用的页面地址、客户端代理信息和X-Forwarded-For头信息记录在日志文件中。

自定义访问日志格式

有时候,我们需要记录更多的信息来更好地分析和监控访问信息。例如,我们可能需要记录每个请求的响应时间、请求的来源、请求的参数等信息。在Nginx中,我们可以通过在访问日志格式中添加自定义变量来实现自定义访问日志格式。下面是一个示例:

代码语言:javascript复制
log_format  custom  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    '$request_time $upstream_response_time '
                    '$sent_http_content_type $sent_http_x_cache';
access_log  /var/log/nginx/access.log  custom;

在这个示例中,我们添加了$request_time和$upstream_response_time变量。$request_time表示Nginx处理请求的总时间,包括客户端的网络延迟和Nginx的处理时间。$upstream_response_time表示Nginx从上游服务器(例如,代理服务器、FastCGI服务器等)接收到响应的时间。除此之外,我们还添加了$sent_http_content_type和$sent_http_x_cache变量,用于记录响应的Content-Type和缓存信息。

除了预定义的变量,我们还可以自定义变量来记录其他信息。例如,我们可以添加一个变量来记录请求的来源,如下所示:

代码语言:javascript复制
map $http_referer $my_referer {
    default "";
    "~^https?://([^/] )/" $1;
}

log_format  custom  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$my_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    '$request_time $upstream_response_time '
                    '$sent_http_content_type $sent_http_x_cache';
access_log  /var/log/nginx/access.log  custom;

在这个示例中,我们使用map指令来定义了一个名为$my_referer的变量。这个变量的值根据请求的来源来动态计算。如果请求的来源为空,则$my_referer的值为"",否则$my_referer的值为来源中的第一个/之前的部分。然后,我们在访问日志格式中使用了$my_referer变量来记录请求的来源。

0 人点赞