记录错误和请求
本节介绍如何在NGINX开源中配置日志记录错误和处理的请求。
- 设置错误日志
- 设置访问日志
- 启用条件日志记录
- 记录Syslog
<h1 id="1">设置错误日志</h1>
NGINX将有关遇到的不同严重级别问题的信息写入错误日志。error_log
指令设置对特定文件,stderr
或syslog
的日志记录,并指定要记录的最低严重级别的消息。 默认情况下,错误日志位于logs/error.log(绝对路径取决于操作系统和安装),并且记录来自所有严重级别的消息。
下面的配置更改错误消息的最小严重级别以便从错误中记录以警告:
error_log logs/error.log warn;
在这种情况下,会记录debug
,info
,notice
,warn
,error
,crit
, alert
,emerg
级别的信息。
错误日志的默认设置全局工作。 要覆盖它,请将error_log
指令放置在主(顶级)配置上下文中。 主要上下文中的设置始终由其他配置级别继承。 error_log
指令也可以在http
,stream,
,server
和location
级别指定,并覆盖从较高级别继承的设置。 如果发生错误,则只将消息写入一个错误日志,即最接近错误发生级别的错误日志。 但是,如果在同一级别上指定了多个error_log
指令,则会将消息写入所有指定的日志。
注意:在开源的NGINX版本1.5.2中添加了在同一配置级别指定多个
error_log
指令的功能。
<h1 id="2">设置访问日志</h1>
NGINX在处理完请求之后立即在访问日志中写入关于客户请求的信息。 缺省情况下,访问日志位于logs/access.log,信息以预定义的组合格式写入日志。 要覆盖默认设置,请使用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
指令的缓冲区参数指定缓冲区的大小。 当下一条日志消息不适合缓冲区以及其他情况时,缓冲的消息将被写入日志文件。
要启用日志文件描述符的缓存,请使用open_log_file_cache
指令。
与error_log
指令类似,在特定配置级别上定义的access_log
指令将覆盖以前级别的设置。 处理完请求后,消息将写入当前级别配置的日志中,或从之前的级别继承。 如果一个级别定义了多个访问日志,则将消息写入所有这些日志。
<h1 id="3">启用条件日志记录</h1>
条件日志记录允许从访问日志中排除不重要或不重要的日志条目。 在NGINX中,通过access_log
指令的if
参数启用条件日志记录。
此示例排除具有HTTP状态码2xx(成功)和3xx(重定向)的请求:
map $status $loggable {
~^[23] 0;
default 1;
}
access_log /path/to/access.log combined if=$loggable;
<h1 id="4">记录Syslog</h1>
系统日志实用程序是计算机消息记录的标准,允许从单个系统日志服务器上的不同设备收集日志消息。 在NGINX中,使用error_log
和access_log
指令中的syslog:前缀配置日志记录到系统日志。
Syslog消息可以发送到server=可以是域名,IP地址或UNIX域套接字路径。 域名或IP地址可以通过端口来指定,以覆盖缺省端口514.可以在unix:前缀之后指定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错误日志消息在debug日志记录级别写入到UNIX域套接字,并且访问日志被写入具有IPv6地址和端口1234的系统日志服务器。
facility =参数指定记录消息的程序的类型。 默认值是local7。 其他可能的值是:auth,authpriv,daemon,cron,ftp,lpr,kern, mail,news,syslog,user,uucp,local0 ... local7。
severity =参数设置访问日志的系统日志消息的严重级别。 按照严重程度递增的顺序可能的值有:debug,info,notice,warn,error(default),crit,alert和emerg。 消息以指定的级别和更严格的级别进行记录。 在我们的例子中,严重程度 error还可以记录crit,alert和emerg程度。
转载于:https://blog.51cto.com/guojianwei2008/2043616