Nginx配置日志

Nginx配置日志

本节介绍如何在NGINX中配置日志记录错误和处理的请求。在本文章中将涉及以下内容 -

  1. 设置错误日志
  2. 设置访问日志
  3. 启用条件日志记录
  4. 日志记录到Syslog

1. 设置错误日志

NGINX将遇到的不同严重性级别问题的信息写入错误日志。 error_log指令将日志记录设置为特定文件,stderrsyslog,并指定要记录的消息的最低级别。 默认情况下,错误日志位于{NGING_INSTALL_PATH}/logs/error.log(绝对路径取决于操作系统和安装),并记录来自所指定的所有严重级别的消息。

以下配置将错误消息的最小严重性级别更改为从错误记录到警告:

error_log logs/error.log warn;
## 或者可写为: error_log /var/logs/nginx/error.log warn;

在这种情况下,将记录 warn, error crit, alertemerg 级别的消息。
错误日志的默认设置全局工作。 要覆盖它,将error_log指令放在 main (顶级)配置上下文中。main 上下文中的设置始终由其他配置级别继承。 还可以在 http, stream, serverlocation 级别指定error_log指令,并覆盖从较高级别继承的设置。 如果发生错误,则该消息只写入一个错误日志,最接近发生错误的级别的错误日志。 但是,如果在同一级别指定了多个error_log伪指令,则会将消息写入所有指定的日志。

注意:在开源NGINX版本1.5.2中添加了在同一配置级别指定多个error_log伪指令的功能。

2. 设置访问日志

在处理请求之后,NGINX在访问日志中写入有关客户端请求的信息。 默认情况下,访问日志位于{NGING_INSTALL_PATH}logs/access.log中,{NGING_INSTALL_PATH}为安装nginx的目录,信息以预定义的组合格式写入日志。要覆盖这个默认设置,请使用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;
        ...
    }
}

以下是一些如何读取生成时间值的规则:

  • 当通过多个服务器处理请求时,变量包含由逗号分隔的多个值。
  • 当从一个上游组到另一个上游组有内部重定向时,这些值以分号分隔。
  • 当请求无法到达上游服务器或无法接收到完整报头时,变量包含“0”(零)。
  • 在连接到上游或从缓存中获取回复时出现内部错误的情况下,该变量包含“ - ”(连字符)。

可以通过启用缓冲区的日志消息和名称包含变量的常用日志文件的描述符缓存来优化日志记录。 要启用缓冲,请使用access_log指令的缓冲区参数来指定缓冲区的大小。 当下一个日志消息不适合缓冲区以及其他情况时,缓冲的消息将被写入日志文件。

要启用日志文件描述符的缓存,请使用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实用程序是计算机消息记录的标准,并允许从单个syslog服务器上的不同设备收集日志消息。 在NGINX中,对syslog的日志记录使用error_logaccess_log伪指令中的syslog:前缀进行配置。

Syslog消息可以发送到服务器=可以是域名,IP地址或UNIX域的套接字路径。 可以使用端口指定域名或IP地址来覆盖默认端口514. 可以在unix:prefix之后指定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错误日志消息将在调试日志记录级别写入UNIX域套接字,并将访问日志写入具有IPv6地址和端口1234的syslog服务器。

facility =参数指定正在记录消息的程序类型。 默认值为local7。 其他可能的值是:authauthprivdaemoncronftplprkernmailnewssysloguseruucplocal0local7

tag =参数将自定义标签应用于syslog消息(在我们的示例中为nginx)。

severity =参数设置访问日志的syslog消息的严重性级别。 严重性越来越高的可能值为:debuginfonoticewarnerror(default)critalertemerg。 消息记录在指定的级别和更严重的级别。 在我们的示例中,严重性级别错误还使得可以 crit, alertemerg 级别。