Nginx记录日志的方法解析

发布时间:2020-09-04编辑:脚本学堂
本文介绍下,在nginx服务器中,记录日志的配置方法与相关实例,学习下nginx日志的配置操作方法,有需要的朋友参考下。

本节主要内容:
控制nginx记录日志的方法
 
Nginx服务器提供了一个HttpLogModule模块,可以通过它来设置日志的输出格式,然后在具体的生产环境很少使用。
通常会关闭访问日志,不过为了安全起见,还是建议开启nginx日志记录功能。

在很多的nginx配置教程中,都会介绍nginx日志配置的相关内容,当然也会有nginx日志分割的相关知识,这方面的内容可以参考如下文章:
nginx 日志分割的小脚本
分享:Logrotate分割nginx日志的脚本
Nginx日志按天分割的方法分享(图文)
一个分割ngnix网站日志的Shell脚本
每天自动分割Nginx日志文件的Shell脚本

下面针对nginx日志的配置,我们进行详细介绍。
 
配置示例:
 

复制代码 代码示例:
log_format gzip '$remote_addr - $remote_user [$time_local]  '
                '"$request" $status $bytes_sent '
                '"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log  gzip  buffer=32k;
 

指令
该模块提供了三条指令,可以用它们来设置日志格式、缓存等。
 
指令名称:access_log
功    能:该指令用于为访问日志设置存放缓存的路径、格式和缓存大小。如果在当前的区段中将该指令的值设置为off,那么将会清除从上级继承而来的所有access_log的参数。在使用这个指令时,如果没有指定日志格式,那么就会使用默认的“combined”格式。在默认的设置中缓存是关闭的,这一点要注意。
 
对于0.7.4版本以上的Nginx,在日志文件路径可以包含变量,但是这样的日志有一定的限制:
对于该目录路径worker 用户必须有建立新文件的权限;
1、缓存区不会工作,就是说不能够使用缓冲;
2、对于每一条日志条目,日志文件被打开写入记录后就迅速的关闭。然而,经常被使用的文件的描述符被存储在由指令open_log_file_cache指定的缓存中。在这种情况下,如果产生日志轮换,则要注意:在由指令open_log_file_cache设置的缓存,存储在缓存的中有效条目仍然会将日志写往该缓存条目生成时的变量中去(就是该变量指定的目录、文件)。
 
Nginx支持强大的日志访问记录,每一个location中都可以有自己的日志记录,在同一时刻访问记录还可以输出到多个日志中。在后面的实例部分有使用实例。
语    法: access_log path [format [buffer=size]] | off
默 认 值: access_log log/access.log combined
使用环境: http, server, location
 
指令名称:log_format
功    能:该指令描述了日志条目的格式,可以在格式中使用一般的变量,也可以使用仅在写入日志的那一刻的变量(也叫过程变量),这些变量有:
 

$body_bytes_sent  它的值是一个字节数,就是传递到客户端的字节数减去响应头的后的大小。这个变量是兼容apache mod_log_config的%B参数;
$bytes_sent  传递到客户端的字节数;
$connection  连接数;
$msec  写入日志条目的当前时间(精确到百万分之一秒);
$pipe  如是HTTP pipe技术,那么这里将会是一个 "p" 字符;
$request_length  请求体的长度;
$request_time  请求时间,这个时间是指Nginx在这个请求上花费的时间,单位为精确到毫秒的秒(在低于0.5.19的版本中只使用到秒);
$status  响应的状态代码;
$time_iso8601 使用ISO 8601 格式的时间, 例如 2011-03-21T18:52:25+03:00 (从0.9.6版本开始提供了该变量)
$time_local  在日志中写入服务器本地的时间。
 

其它变量,例如:
 

$sent_http_content_range  这是一个传递到客户端的头,这类头的前缀为"sent_http_" 。
"upstream_http_"  这是有upstream模块产生了日志,因此它的前缀将会是这个前缀。所以在变量值还有可能是其它模块产生的变量。
 

在此nginx日志模块中,预定义了一个叫做"combined"日志格式:
 

复制代码 代码示例:
log_format combined '$remote_addr - $remote_user [$time_local]  '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
 

语    法: log_format name format [format ...]
默 认 值: log_format combined "..."
使用环境: http server

配置好详尽的日志记录格式,对于以后的nginx日志分析,将是大有帮助的,这点大家请注意。
 
指令名称:open_log_file_cache
功    能:该指令用于设置缓存,该缓存用于存储带有变量的日志文件路径而又频繁使用的文件描述符,这些被频繁使用的文件描述符将会被存储在缓存中。
指令选项:
max - 在缓存中可以存储的最大描述符数量,它是通过最近最少使用(LRU)   算法来移除缓存条目;
inactive - 设置一个时间间隔,在这个间隔之后,没有被命中的文件描述符将会被移除,默认值是10秒;
min_uses - 设置访问次数。在一定的时间间隔内(这个间隔通过inactive选项获取),一个文件描述符至少被访问多少次后就可以将该描述符放在缓存中。默认值为1,即访问一次便缓存。
valid - 该选项用于设置检查同名文件存在的时间,默认是60秒;
off - 关闭缓存。
 
例如:
 

复制代码 代码示例:
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
 

语 法:open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off
默 认 值: open_log_file_cache off
使用环境: http server location
 
下面介绍二个使用实例,两个典型的例子,在第一个例子中,实现了自定义日志和多个日志记录;
在第二个例子中,实现了日志文件路径、文件名称变量的使用。
 
实例1、
在Nginx中添加下设置:
 

复制代码 代码示例:
http {
  include       mime.types;
  default_type  application/octet-stream;
  sendfile        on;
  keepalive_timeout  65;
 
  log_format custom $time_local | $server_name |
$request_length | $bytes_sent;
  log_format apache-style. '$remote_addr - $remote_user [$time_local]  '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent"';
open_log_file_cache max=1000 inactive=20s min_uses=1 valid=1m;
 
  server {
    listen       80;
    server_name  localhost;
 
location /rmb {
      root   html;
      index  index.html index.htm;
      access_log logs/custom.log custom buffer=32k;
      access_log logs/apache-style.log  apache-style. buffer=32k;
}
 
 location /rmj {
      root   html;
      index  index.html index.htm;
      access_log logs/custom.log custom buffer=32k;
      access_log /var/log/nginx/custom.log custom buffer=32k;
}
}
}

1、访问/rmb,并监控日志,apache-style格式的日志:
 

复制代码 代码示例:
[root@jb200.com logs]# tail -f apache-style.log
192.168.3.248 - - [23/Aug/2011:09:20:33 +0800]  "GET /rmb/ HTTP/1.1" 200 33 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1
 

custom格式的日志:
 

复制代码 代码示例:
[root@jb200.com logs]# tail -f custom.log
23/Aug/2011:09:20:33 +0800|localhost|739|247

2、访问/rmb,并监控日志,以下均为custom格式的日志:
 

复制代码 代码示例:
[root@jb200.com logs]# tail -f custom.log
23/Aug/2011:09:22:10 +0800|localhost|739|248
[root@jb200.com logs]# tail -f  /var/log/nginx/custom.log
23/Aug/2011:09:22:10 +0800|localhost|739|248