如何配置 Nginx 的错误日志和访问日志

Nginx 会在两种类型的日志中记录其事件:访问日志和错误日志。访问日志记录客户端请求的信息,而错误日志记录服务器和应用程序的问题。

一、配置访问日志

每当客户端请求被处理时,Nginx 就会在访问日志中生成一个新的事件。每个事件记录包含一个时间戳,并包括有关客户端和请求资源的各种信息。访问日志可以显示访问者的位置、他们访问的页面、在页面上花费的时间等等。

log_format 指令允许您定义记录消息的格式。access_log 指令启用并设置日志文件的位置和使用的格式。

access_log 指令的最基本语法如下:

access_log log_file log_format;

其中 log_file 是日志文件的完整路径,log_format 是日志文件使用的格式。

访问日志可以在 httpserver 或 location 指令块中启用。

默认情况下,访问日志在主 Nginx 配置文件中的 http 指令内全局启用。

/etc/nginx/nginx.conf

http {
  ...
  access_log  /var/log/nginx/access.log;
  ...
}

为了更好的可读性,建议为每个服务器块设置一个单独的访问日志文件。在 server 指令中设置的 access_log 指令会覆盖在 http(更高级别)指令中设置的。

/etc/nginx/conf.d/domain.com.conf

http {
  ...
  access_log  /var/log/nginx/access.log;
  ...

  server {
    server_name domain.com
    access_log  /var/log/nginx/domain.access.log;
    ...
  }
}

如果没有指定日志格式,Nginx 将使用预定义的 combined 格式,如下所示:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

要更改日志记录格式,要么覆盖默认设置,要么定义一个新的。例如,要定义一个新的名为 custom 的日志记录格式,它将通过显示 X-Forwarded-For 头的值来扩展 combined 格式,请在 http 或 server 指令中添加以下定义:

log_format  custom  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

要使用新格式,请在日志文件后指定其名称,如下所示:

access_log  /var/log/nginx/access.log custom;

虽然访问日志提供了非常有用的信息,但它占用磁盘空间,可能会影响服务器性能。如果您的服务器资源有限,并且您的网站流量很大,您可能想要禁用访问日志。要做到这一点,将 access_log 指令的值设置为 off

二、 配置错误日志

Nginx 将应用程序和一般服务器错误的消息写入错误日志文件。如果您的 Web 应用程序遇到错误,错误日志是开始解决问题的第一个地方。

error_log 指令启用并设置错误日志的位置和严重级别。它采用以下形式,可以在 httpserver 或 location 块中设置:

error_log log_file log_level

log_level 参数设置日志记录的级别。以下是按严重程度(从低到高)列出的级别:

  • debug – 调试消息。
  • info – 信息性消息。
  • notice – 通知。
  • warn – 警告。
  • error – 处理请求时的错误。
  • crit – 严重问题。需要立即采取行动。
  • alert – 警告。必须立即采取行动。
  • emerg – 紧急情况。系统处于不可用状态。

每个日志级别都包括更高级别的日志。例如,如果您将日志级别设置为 warn,则 Nginx 还将记录 errorcritalert 和 emerg 消息。

当未指定 log_level 参数时,默认为 error

默认情况下,error_log 指令在主 nginx.conf 文件中的 http 指令内定义:

/etc/nginx/nginx.conf

http {
  ...
  error_log  /var/log/nginx/error.log;
  ...
}

与访问日志一样,建议为每个服务器块设置一个单独的错误日志文件,这将覆盖从更高级别继承的设置。

例如,要将 domain.com 的错误日志设置为 warn,您将使用:

http {
  ...
  error_log  /var/log/nginx/error.log;
  ...

  server {
    server_name domain.com
    error_log  /var/log/nginx/domain.error.log warn;
    ...
  }
}

每当您修改配置文件时,都必须重新启动 Nginx 服务 才能使更改生效。

三、日志文件的位置

默认情况下,在大多数 Linux 发行版上,例如 Ubuntu 、CentOS 和 Debian 上,访问和错误日志位于 /var/log/nginx 目录中。

读取和理解 Nginx 日志文件

您可以使用标准命令如 cat 、less 、grep 、cut 、awk等来打开和解析日志文件。

以下是使用默认组合 Nginx 日志格式的访问日志文件中的示例记录:

192.168.33.1 - - [15/Oct/2019:19:41:46 +0000] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"

让我们分解一下记录的每个字段的含义:

  • $remote_addr – 192.168.33.1 – 发出请求的客户端的 IP 地址。
  • $remote_user – - – HTTP 认证用户。当用户名未设置时,此字段显示 -
  • [$time_local] – [15/Oct/2019:19:41:46 +0000] – 服务器本地时间。
  • "$request" – "GET / HTTP/1.1" – 请求类型、路径和协议。
  • $status – 200 – 服务器响应代码。
  • $body_bytes_sent – 396 – 服务器响应的大小(字节)。
  • "$http_referer" – "-" – 引用 URL。
  • "$http_user_agent" – Mozilla/5.0 ... – 客户端(Web 浏览器)的用户代理。

使用 tail 命令实时查看日志文件:

tail -f  access.log 

你可能感兴趣的