欢迎,来自IP地址为:35.171.164.77 的朋友



Nginx HTTP服务器有一个非常强大的自定义访问日志记录工具,本文将解释如何在Linux系统中配置个性化访问日志及错误日志。

首先,会讲解Nginx日志文件是如何产生的,这有助于我们个性化设置日志格式,可以方便的进行调试、故障分析以及web服务器以及查看web应用程序中展开的内容(请求跟踪)。

我们将分三个部分讲解如何在Nginx中配置访问/错误日志以及如何使用条件日志记录。

配置Nginx访问日志

在Nginx系统中,所有的客户端访问都会以ngx_http_log_module的格式记录在访问日志中。默认文件是log/access.log(在Linux系统通常位于/var/log/nginx/access.log),而文件格式通常是复合格式或主格式(这会根据系统发行版的区别而有所不同)。

配置文件中 access_log 指令用于设置log文件(适用于配置文件的 http、server、location部分),而 log_format 指令用于设置日志文件格式(仅在配置文件的http部分使用),日志格式由公共变量和仅在写入日志时生成的变量来描述。

配置日志格式的语法是:

log_format format_name 'set_of_variables_to_define_format';

而配置 access_log 的语法是:

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关于日志格式和日志记录的摘录:

http{
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;
}

这个日志文件格式会产生如下的日志条目:

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应用请求的变量以及访问客户端详细地址信息的内容:

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 ';

由于此时将日志格式命名为custom,那么你可以使用以下方式启用这种日志格式:

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

当然你也可以在同一个上下文中使用多个accecc_log指令来设置不同的日志文件,以下是在http配置块中设置多个日志文件的示例:

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,它通常位于 /var/ log /nginx/目录下。error_log指令用于指定日志文件,可以在http、mail、stream、server、location上下文配置块中使用(使用级别排序)。

需要注意的是:

  • 配置内容按上面的顺序依次继承高级别的内容,即不需要对每个配置块单独配置
  • 如果较低级别的配置内容同继承内容冲突,则会覆盖继承内容使用本配置块中的内容

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

error_log /path/to/log_file log_level;

示例如下:

 error_log /var/log/nginx/error_log warn;

这会让Nginx记录所有错误等级为warn的信息。同理,如果有一个配置块中含有多个error_log指令,那么则会分别记录相应等级的错误信息。

在Nginx中配置条件日志

在某些情况下,我们可能会希望按特定的条件记录日志。并不是很条信息都需要由Nginx记录,我们只关心符合特定条件的某些日志,对于常规的日志则不需要记录。

我们可以通过使用ngx_http_map_module来创建取值取决于他值的变量。这个map模块只允许出现在http配置块,其参数用于建立源与目的之间的对应关系。

对于这种设置,如果其值为“0”或为空值,则不会记录。以下示例用于记录HTTP状态为2xx和3xx的请求:

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

以上就是关于Nginx配置访问日志和错误日志的方法,希望有所帮助。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注