Nginx日志配置文档

247 阅读4分钟

Intro

本文总结翻译自官方文档,主要介绍如何在Nginx中配置错误和已处理的请求日志

设置错误日志

error_log指令设置将日志写入到指定文件、stderr或syslog中,并指定日志的级别。默认情况下,错误日志位于(logs/error.log 绝对路径,取决于安装位置)

Example:

error_log logs/error.log warn;

该example最低错误级别是warn,在这种情况下,warnerrorcritalertemerg级别的消息被会记录

错误日志的配置全局生效,需要覆盖这个配置需要在main configuration context(top level)中配置error_log指令。main context的设置总是被其他级别的配置继承,如:http、server、location。error_log指令也可以在http、stream、server和location上指定,并覆盖从最近一级的父级配置继承过来的配置内容。

发生错误时,错误信息只写入一个最近的一个log配置指定的日志位置。但是如果同一级配置了多个error_log指令,同一级指定的所有错误日志都会被写入这个错误信息。

注意:  在同一配置层上指定多个error_log指令的功能是在 NGINX 开源版本1.5.2中添加的。

设置访问日志

NGINX在请求处理后立即在access log中记录关于客户端请求的信息。默认情况下,默认情况下,访问日志位于logs/access.log,并以预定义的combined格式记录信息。要覆盖默认设置,请使用log_format指令更改记录消息的格式,以及access_log指令指定日志的位置和格式。日志格式是使用变量定义的。

以下示例定义了扩展预定义combined格式的日志格式,该格式指示响应的 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;
        ...
    }
}

Note:compression是为这个日志格式指定的名称,可以在后续的access_log指令中引用,$gzip_ratio变量在启用gzip压缩后,NGINX自动计算并设置这个变量

另一个log_format的例子: 追踪NGINX和upstream server中通讯的不同时间值,追踪这个时间值可以帮助诊断web服务器出现的响应时间长的问题。你可以使用以下变量记录指定记录需要追踪的时间值:

$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;
        ...
    }
}

读取时间值时,注意:

  • 一个请求经过多个服务器处理时,这个变量读取出来的包含多个值,并且每个服务器的时长通过逗号','分隔
  • 当内部重定向从一个upstream server转到另一个upstream server时,这些值用分号';'分隔
  • 当无法到达upstream server或无法接收完整的头部时,该变量包含0(零)
  • 在连接到upstream时发生内部错误或从缓存中获取答复时,变量包含-(连字符)

启用日志消息的缓冲区和经常使用的日志文件描述符的缓存来优化日志记录:

  • 要启用缓冲区,请使用access_log指令的buffer参数来指定缓冲区大小。当下一个日志消息无法完全填充缓冲区时,以及在某些其他情况下,才会将缓冲的消息写入日志文件。

  • 要启用日志文件描述符的缓存,请使用open_log_file_cache 指令。

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

启用条件日志记录

带有if条件的日志记录允许从访问日志中排除琐碎或不重要的日志条目。在 NGINX 中,通过access_log指令的if参数启用有条件的日志记录。

此示例排除了具有 HTTP 状态码2xx(成功)和3xx(重定向)的请求:

map $status $loggable {
    ~^[23]  0;
    default 1;
}

access_log /path/to/access.log combined if=$loggable;