Nginx 会在两种类型的日志中记录其事件:访问日志和错误日志。访问日志记录客户端请求的信息,而错误日志记录服务器和应用程序的问题。
每当客户端请求被处理时,Nginx 就会在访问日志中生成一个新的事件。每个事件记录包含一个时间戳,并包括有关客户端和请求资源的各种信息。访问日志可以显示访问者的位置、他们访问的页面、在页面上花费的时间等等。
log_format
指令允许您定义记录消息的格式。access_log
指令启用并设置日志文件的位置和使用的格式。
access_log
指令的最基本语法如下:
access_log log_file log_format;
其中 log_file
是日志文件的完整路径,log_format
是日志文件使用的格式。
访问日志可以在 http
、server
或 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
指令启用并设置错误日志的位置和严重级别。它采用以下形式,可以在 http
、server
或 location
块中设置:
error_log log_file log_level
log_level
参数设置日志记录的级别。以下是按严重程度(从低到高)列出的级别:
debug
– 调试消息。info
– 信息性消息。notice
– 通知。warn
– 警告。error
– 处理请求时的错误。crit
– 严重问题。需要立即采取行动。alert
– 警告。必须立即采取行动。emerg
– 紧急情况。系统处于不可用状态。每个日志级别都包括更高级别的日志。例如,如果您将日志级别设置为 warn
,则 Nginx 还将记录 error
、crit
、alert
和 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