如何在Nginx中配置自定义访问和错误日​​志格式

本指南旨在帮助您了解如何生成日志,以及如何在Linux中配置自己的格式以获取Nginx的访问和错误日​​志。

Nginx的HTTP服务器有一个非常可定制的惊人的日志记录工具。 在本文中,我们将解释如何在Linux中为您配置自己的Nginx访问和错误日​​志格式。

本指南的目的是帮助您了解如何生成日志,以配置自定义日志格式,用于调试,故障排除或分析Web服务器内部以及Web应用程序(如跟踪请求)中展开的内容。

另请参阅4适用于Linux的开源日志监控和管理工具

本文由三部分组成,它们将启发您配置访问/错误日志以及如何在Nginx中启用条件日志记录。

在Nginx中配置访问日志

Nginx下 ,使用ngx_http_log_module模块将所有到服务器的客户端请求以指定格式记录访问日志中。

默认的日志文件是log / access.log (在Linux系统上通常是/ var / log / nginx / access_log ),日志的默认格式通常是组合或主格式(从一个发行版到另一个发行版可能不同)。

access_log指令用于设置日志文件和log_format指令(仅适用于http上下文环境),用于设置日志格式。 日志格式由公共变量和仅在写入日志时生成的变量来描述。

配置日志格式的语法是:

log_format format_name 'set_of_variables_to_define_format';

并且配置访问日志的语法是:

access_log /path/to/log_file format_name;		#simplest form 
OR
access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

以下是CentOS 7上的默认Nginx配置文件/etc/nginx/nginx.conf的摘录。

/etc/nginx/nginx.conf
http {
#main 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"';
access_log /var/log/nginx/access.log;
}

此日志格式产生以下日志条目。

127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"

以下是另一种有用的日志记录格式,我们使用它的一些默认变量来跟踪我们的Web应用程序的请求,最重要的是有请求ID和日志客户端位置的详细信息(国家,国家代码,地区和城市)。

/etc/nginx/nginx.conf
log_format  custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';

你可以像这样使用它:

access_log  /var/log/nginx/access.log custom;

这将产生一个日志条目,看起来像这样。

153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala 

您可以使用同一级别的access_log指令指定多个日志,这里我们在http上下文中使用了多个日志文件。

/etc/nginx/nginx.conf
http{
##default 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"';
##request tracing using custom format
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';
##this uses the default log format
access_log /var/log/nginx/access.log;
##this uses the our custom log format
access_log /var/log/nginx/custom_log custom;
}

以下是更高级的日志记录配置示例,这些示例适用于包含与压缩相关的变量以及用于创建压缩日志文件的日志格式:

access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression  gzip  flush=5m;

在Nginx中配置错误日志

如果Nginx遇到任何故障,它会在错误日志中记录关于它们的信息。 这些问题属于不同的严重程度级别: 调试信息通知警告错误 (这是默认级别,全球工作), 暴击警报重大事件

默认的日志文件是log / error.log ,但通常位于Linux发行版的/ var / log / nginx /目录下 error_log指令用于指定日志文件,它可以在主,http,邮件,流,服务器,位置上下文中(按此顺序)使用。

你还应该注意到:

  • 主环境中的配置总是按照上面的顺序由较低级别继承。
  • 并且较低级别的配置覆盖从较高级别继承的配置。

您可以使用以下语法配置错误日志记录:

error_log /path/to/log_file log_level;

例如:

error_log /var/log/nginx/error_log warn; 

这将指示Nginx记录所有类型警告和更严重的日志级别暴击警报emerg消息的消息。

在下一个示例中,将会记录暴击警报紧急级别的消息。

error_log /var/www/example1.com/log/error_log crit;

考虑下面的配置,在这里,我们已经定义了不同级别的错误日志记录(在http和服务器上下文中)。 如果发生错误,消息只写入一个错误日志,即最接近出现错误级别的日志。

/etc/nginx/nginx.conf
http {
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
error_log  /var/log/nginx/error_log  crit;
server {
listen 80;
server_name example1.com;
#this logs errors messages for example1.com only
error_log  /var/log/nginx/example1.error_log  warn;
…...
}
server {
listen 80;
server_name  example2.com;
#this logs errors messages for example2.com only
error_log  /var/log/nginx/example1.error_log;
…….
}
}

如果您在下面的配置(相同级别)中使用多个error_log指令,则会将这些消息写入所有指定的日志。

/etc/nginx/nginx.conf
server {
listen 80;
server_name example1.com;
error_log  /var/www/example1.com/log/error_log  warn;
error_log  /var/log/nginx/example1.error_log  crit;
…...
}

在Nginx中配置条件日志

在某些情况下,我们可能希望Nginx执行消息的条件记录。 并非每一条消息都必须由Nginx记录,因此我们可以忽略特定实例的访问日志中不重要或不重要的日志条目。

我们可以使用ngx_http_map_module模块来创建其值取决于其他变量值的变量。 地图块内的参数(只应该存在于http内容中)指定源和结果值之间的映射。

对于这种设置,如果条件评估为“0”或空字符串,则不会记录请求。 本示例排除了带有HTTP状态码2xx3xx的请求。

/etc/nginx/nginx.conf
http{
map $status $condition {
~^[23] 0;
default 1;
}
server{
access_log  /path/to/access.log  custom if=$condition;
}
}

这是在开发阶段调试Web应用程序的另一个有用的示例。 这将忽略所有的消息,只记录调试信息。

/etc/nginx/nginx.conf
 
http{
map $info  $debuggable { 
default     0; 
debug       1; 
} 
server{
……..
access_log /var/log/nginx/testapp_debug_access_log  debug if=$debuggable; 
#logs other requests 
access_log  /var/log/nginx/testapp_access.log  main; 
…….
}
}

你可以找到更多的信息,包括在这里登录syslog。

目前为止就这样了! 在本指南中,我们介绍了如何在Nginx中配置访问和错误日​​志的自定义日志记录格式。 使用下面的反馈表格提出问题或分享您对本文的看法。