ngx_http_log_module 模块

ngx_http_log_module 模块以指定的格式写入请求日志。

请求记录在处理结束的 location 的上下文中。如果在请求处理过程中发生内部重定向,则它可能与原始 location 不同。

示例配置

log_format compression '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $bytes_sent '
                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log compression buffer=32k;

指令

access_log 指令

语 法:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
    access_log off;
默认值:access_log logs/access.log combined;
上下文:http, server, location, if in location, limit_except

设置缓冲日志写入的路径、格式和配置。可以在同一配置级别上指定多个日志。可以通过在第一个参数中指定“syslog:”前缀来配置日志记录到 syslog。设置值为 off,则取消当前级别的所有 access_log 指令。如果未指定格式,则使用预定义的 “combined” 格式。

注意:error_log 和 access_log 指令支持记录到系统日志。

如果使用 buffer 或 gzip (1.3.10, 1.2.7) 参数,写入日志将被缓冲。

缓冲区大小不得超过对磁盘文件进行原子写入的大小。对于 FreeBSD,这个大小是无限的。

启用缓冲后,数据将写入文件:

  • 如果下一个日志行不适合缓冲区(可能时缓冲区放不下日志);

  • 如果缓冲的数据比 flush 参数(1.3.10,1.2.7)指定的要早;

  • 当工作进程重新打开日志文件或关闭时;

如果使用 gzip 参数,则缓冲数据将在写入文件之前进行压缩。压缩级别可以设置在 1 (最快,压缩较少)和 9 (最慢,最佳压缩)之间。默认情况下,缓存大小为 64K 字节,压缩级别设置为 1。由于数据是以原子块进行压缩的,因此可以随时使用zcat对日志文件进行解压缩或读取。

实例:

access_log /path/to/log.gz combined gzip flush=5m;

要使 gzip 压缩工作,必须使用 zlib 库构建 nginx。

文件路径可以包含变量(0.7.6+),但这样的日志有一些限制:

  • 工作进程使用其凭据的用户应具有在具有此类日志的目录中创建文件的权限;

  • 缓冲写入不起作用;

  • 每次日志写入时,都会打开和关闭该文件。但是,由于常用文件的描述符可以存储在缓存中,因此在 OPEN_LOG_FILE_CACHE 指令的有效参数指定的时间内可以继续写入旧文件;

  • 在每次写入日志时,都会检查请求的根目录是否存在,如果不存在,则不会创建日志。因此,在同一配置级别上同时指定 root 和 access_log 是一个好主意:

server {
    root       /spool/vhost/data/$host;
    access_log /spool/vhost/logs/$host;
    ...

if 参数 (1.7.0) 启用条件日志记录。如果条件评估为 “0” 或空字符串,则不会记录请求。在以下示例中,不会记录响应代码为 2xx 和 3xx 的请求:

map $status $loggable {
    ~^[23]  0;
    default 1;
}
access_log /path/to/access.log combined if=$loggable;

log_format 指令

语 法:log_format name [escape=default|json|none] string ...;
默认值:log_format combined "...";
上下文:http

指定日志格式。

escape 参数(1.11.8)允许在变量中设置 json 或 default 字符转义,默认情况下,使用 default 转义。 none 值 (1.13.10) 禁用转义。

对于 default 转义,字符 “"”,“” 和其他小于32 (0.7.0)或大于126 (1.1.6)的字符转义为 “xXX”。如果找不到变量值,将记录连字符(“-”)。

对于 json 转义,所有 JSON 字符串中不允许的字符都将被转义:字符 “"” 和 “” 被转义为 “"” 和 “\”,值小于 32 的字符被转义为 “ ”, “ ”、“ ”、“”、“f” 或 “u00XX”。

日志格式可以包含普通变量,以及只在日志写入时存在的变量:

  • $bytes_sent  发送到客户端的字节数

  • $connection  连接序列号

  • $connection_requests  当前通过连接发出的请求数 (1.1.18)

  • $msec  以秒为单位的时间,在日志写入时以毫秒为单位

  • $pipe  “p” 如果请求被流水线化,“.” 除此以外

  • $request_length  请求长度(包括请求行、头部和请求体)

  • $request_time  以毫秒为单位的请求处理时间; 从客户端读取第一个字节到最后一个字节发送到客户端后写入日志之间经过的时间

  • $status  响应状态

  • $time_iso8601  ISO8601 标准格式的当地时间

  • $time_local  通用日志格式的本地时间

在现代 nginx 版本变量 $status (1.3.2, 1.2.2), $bytes_sent (1.3.8, 1.2.5), $connection (1.3.8, 1.2.5), $connection_requests (1.3.8, 1.2) .5), $msec (1.3.9, 1.2.6), $request_time (1.3.9, 1.2.6), $pipe (1.3.12, 1.2.7), $request_length (1.3.12, 1.2.7) )、$time_iso8601 (1.3.12, 1.2.7) 和 $time_local (1.3.12, 1.2.7) 也可用作公共变量。

发送到客户端的标题行具有前缀“sent_http_”,例如 $sent_http_content_range。

配置始终包括预定义的 “combined” 格式:

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

open_log_file_cache 指令

语 法:open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
    open_log_file_cache off;
默认值:open_log_file_cache off;
上下文:http, server, location

定义一个缓存,用于存储名称中包含变量的常用日志的文件描述符。该指令有以下参数:

  • max  设置缓存中的最大描述符数;如果缓存已满,则关闭最近最少使用 (LRU) 描述符

  • inactive  如果在此期间没有访问,则设置缓存描述符关闭的时间;默认情况下,10 秒

  • min_uses  设置在 inactive 参数定义的时间内使用的最小文件数,以使描述符在缓存中保持打开状态;默认情况下,1

  • valid  设置应该检查文件是否仍然存在同名的时间;默认情况下,60 秒

  • off  禁用缓存

用法示例:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号