模块 ngx_http_log_module

access_log
log_format
open_log_file_cache配置
Directives
示例

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

请求记录在处理结束位置的上下文中。 它可能与原始位置不同,如果internal 重定向发生在请求处理期间。

示例配置

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;

Directives

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

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

如果 或 (1.3.10, 1.2.7) 参数,则将缓冲对 log 的写入。buffergzip

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

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

  • 如果下一个 log 行不适合缓冲区;
  • 如果缓冲数据早于参数指定的时间 (1.3.10, 1.2.7);flush
  • 当 worker 进程重新打开日志时 文件或正在关闭。

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

例:

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

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

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

  • 其凭证被 Worker 进程使用的用户应该 有权在具有 此类日志;
  • 缓冲写入不起作用;
  • 每次日志写入时,都会打开和关闭文件。 但是,由于可以存储常用文件的描述符 在缓存中,写入旧文件 可以在 open_log_file_cache Directives的参数指定的时间内继续valid
  • 在每次日志写入期间,将检查请求的根目录是否存在,如果不存在,则日志不存在 创建。 因此,最好同时指定 root 和 on the same configuration level:access_log
    server {
        root       /spool/vhost/data/$host;
        access_log /spool/vhost/logs/$host;
        ...
    

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

map $status $loggable {
    ~^[23]  0;
    default 1;
}

access_log /path/to/access.log combined if=$loggable;

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

指定日志格式。

参数 (1.11.8) 允许设置或字符转义 在 Variables 中,默认情况下,使用 Escescapeing。 值 (1.13.10) 禁用转义。escapejsondefaultdefaultnone

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

对于转义, 不允许所有字符 在 JSON 字符串中将被转义: 字符 “” 和 “” 被转义为 “” 和 “”, 值小于 32 的字符将被转义为 “”, “”, “”, “”, “” 或 “”.json"\\"\\\n\r\t\b\f\u00XX

日志格式可以包含常见变量,以及 仅在日志写入时存在:

$bytes_sent
发送到客户端的字节数
$connection
连接序列号
$connection_requests
当前通过连接发出的请求数 (1.1.18)
$msec
时间(以秒为单位),在日志写入时具有毫秒分辨率
$pipe
“” 如果请求是通过管道传输的,则为 “” 否则p.
$request_length
请求长度(包括请求行、标头和请求正文)
$request_time
请求处理时间(以秒为单位),分辨率为毫秒; 从客户端读取第一个字节之间经过的时间 将最后一个字节发送到客户端后的日志写入
$status
响应状态
$time_iso8601
ISO 8601 标准格式的当地时间
$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 max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
默认值:
open_log_file_cache off;
上下文: http, ,serverlocation

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

max
设置缓存中的最大描述符数; 如果缓存已满,则为最近最少使用 (LRU) 描述符已关闭
inactive
设置关闭缓存描述符的时间 如果在此期间无法访问; 默认情况下为 10 秒
min_uses
设置在此期间使用文件的最小次数 由参数 让描述符在缓存中保持打开状态; 默认情况下为 1inactive
valid
设置时间,在此时间之后应检查文件 仍然存在于同名中;默认情况下为 60 秒
off
禁用缓存

使用示例:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;