第十四节——日志

  • 来源:新网
  • 更新日期:2018-04-18

摘要:NGINX将遇到的不同严重级别的错误信息记录到错误日志。error_log指令设置记录错误信息到指定文件、stderr或syslog和最小严重级别。默认,错误日志位于logs/error.log(绝对路径取决于操作系统和安装方式),所有严重级别的消息都会被记录。

1 设置错误日志

NGINX将遇到的不同严重级别的错误信息记录到错误日志。error_log指令设置记录错误信息到指定文件stderrsyslog最小严重级别。默认,错误日志位于logs/error.log(绝对路径取决于操作系统和安装方式),所有严重级别的消息都会被记录。

下面配置,将错误消息的最小严重级别从error改为warn

error_log logs/error.log warn;

在这种情况下,warnerrorcritalertemerg级别的消息被记录。

错误日志默认全局范围开启。在main(顶级)配置上下文中定义error_log指令覆盖该行为。main上下文的设置总是被其它配置级别继承。error_log指令也可以在httpstreamserverlocation级别指定,覆盖从更高级别继承的设置。在一个错误的情况下,只记录一条最接近错误发生级别的错误消息到错误日志。然而,如果相同级别指定多个error_log指令,消息写入错误指定的日志。

t01cf1ee45570108c7a.jpg

2 设置访问日志

NGINX在请求处理之后记录客户端请求的访问日志。默认访问日志位于logs/access.log,信息以预定义组合格式写入日志。为了覆盖默认设置,使用log_format指令改变日志消息的格式,同样,access_log指令可以指定日志的位置和格式。日志的格式使用变量定义。

下面例子定义日志格式,使用表示响应的gzip压缩率的值扩展预定义组合格式。格式应用到启用压缩的虚拟服务器。

http { log_format compression \'$remote_addr - $remote_user [$time_local] \' \'"$request" $status $body_bytes_sent \' \'"$http_referer" "$http_user_agent" "$gzip_ratio"\'; server { gzip on; access_log /spool/logs/nginx-access.log compression; # ... } }

日志格式的另一个例子是跟踪NGINX和上游服务器的时间,有助于调试问题。可以使用以下变量记录时间值:

$upstream_connect_time:与上游服务器建立连接花费的时间。 $upstream_header_time:建立连接和从上游服务器接收响应头的第一个字节之间的时间。 $upstream_response_time:建立连接和从上游服务器接收响应体的最后一个字节之间的时间。 $request_time:处理请求花费的总时间。

所有时间值以秒加毫秒为单位。

http { log_format upstream_time \'$remote_addr - $remote_user [$time_local] \' \'"$request" $status $body_bytes_sent \' \'"$http_referer" "$http_user_agent"\' \'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"\'; server { access_log /spool/logs/nginx-access.log upstream_time; # ... } }

这里读取产生的时间值有一定规则:

当一个请求被多个服务器处理时,变量包含通过逗号分隔的多个值。 当从一个上游组产生一个内部重定向到另一个时,值通过分号分隔。 当一个请求不能抵达上游服务器或不能接收一个完整头,变量包含“0”。 当连接到一个上游或从缓存获取数据响应时遇到内部错误,变量包含“-”。

通过启用日志消息缓存和频繁使用文件名包含变量的日志文件的描述符缓存可以优化记录日志。在access_log指令上指定buffer参数启用缓存并设置缓存大小。日志先记录到缓存,当缓存内存不足或其它原因,日志从缓存刷入日志文件。

使用open_log_file_cache指令启用日志文件描述符缓存。

类似error_log指令,定义在特定配置级别的access_log指令覆盖前面级别的设置。当请求处理完成时,消息被写入配置在当前级别或继承前面级别的日志。如果同一级别定义多个访问日志,消息写入所有访问日志。

3 启用条件日志

条件日志允许从访问日志排除繁琐或不重要的日志条目。在NGINX中,在access_log指令使用if参数启用条件日志。

该例子排除HTTP状态码为2xx(成功)和3xx(重定向)的请求:

map $status $loggable { ~^[23] 0; default 1; } access_log /path/to/access.log combined if=$loggable; 4 记录syslog

syslog工具标准的计算机消息日志,允许在一个系统日志服务器从不同设备收集日志消息。在NGINX中,在error_logaccess_log指令中使用syslog:前缀配置记录syslog

syslog消息可以发送到server=,可以是一个域名、一个IP地址或一个UNIX域socket路径。域名或IP地址可以使用特定端口覆盖默认514端口。UNIX域socket路径可以使用unix:前缀指定:

error_log server=unix:/var/log/nginx.sock debug; access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;

例子中,NGINX将debug日志级别的错误日志消息写入UNIX域socket,访问日志写入IPv6地址和1234端口的syslog服务器。

facility=参数指定记录消息的程序类型。默认值为local7。其它可选值为:auth、authpriv、daemon、cron、ftp、lpr、kern、mail、news、syslog、user、uucp、local0、...、local7。

tag=参数应用自定义标记给系统日志(我们的例子中是nginx)。

severity=参数设置访问日志的syslog消息的严重级别。按照递增顺序的可能值为:debug、info、notice、warn、error(默认)、crit、alert和emerg。记录指定级别和所有更严重级别的消息。例子中,严重级别error,也记录crit、alert和emerg级别的日志。