配置日志

一、错误日志记录

nginx可以记录各种类型的突然事故到错误日志中。error_log 指令可以设置记录到一指定文件,或者stderr、syslog和设置错误日志级别。默认情况下,错误日志位置在 logs/error.log 相对路径,并记录error级别和以上级别的错误信息。

error_log logs/error.log warn;

以上设置,warn、error、alert 和 ermerg级别的日志都会记录下来。

error_log 指令可以设置在 main 顶级上下文,由下级继承,也可以设置在http、stream、server、location上下文中,以覆盖继承设置。

注:同等级下可以调置多个 error_log 指令。

 

二、设置访问日志

当客户端请求被正确处理时,nginx会写入日志。访问日志默认位置:logs/access.log,并使用预定的 combined 格式。要覆盖默认设置,请使用 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指令将覆盖先前级别的设置。

 

三、开启条件式日志

条件式日志允许 排除琐碎的或不重要的日志也写进访问日志里。在nginx中,条件式日志可以用 if 参数在 access_log 指令里开启。

下例排除了 HTTP 状态码 2xx(成功码)和 3xx (转发):

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

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