模块 ngx_http_log_module
示例配置 指令 access_log log_format open_log_file_cache |
ngx_http_log_module
模块以指定的格式写入请求日志。
请求记录在处理结束的位置的上下文中。如果在请求处理过程中发生 内部重定向,则它可能与原始位置不同。
示例配置
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 |
---|---|
默认值 |
access_log logs/access.log combined; |
上下文 |
http 、server 、location 、if in location 、limit_except |
设置缓冲日志写入的路径、格式和配置。可以在同一配置级别上指定多个日志。通过在第一个参数中指定“syslog:
”前缀,可以配置将日志记录到 syslog。特殊值 off
取消当前级别上的所有 access_log
指令。如果未指定格式,则使用预定义的“combined
”格式。
如果使用了 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 压缩生效,nginx 必须使用 zlib 库构建。
文件路径可以包含变量(0.7.6+),但此类日志有一些限制
- 工作进程使用的凭据的用户应具有在包含此类日志的目录中创建文件的权限;
- 缓冲写入不起作用;
- 每个日志写入都会打开和关闭文件。但是,由于常用文件的描述符可以存储在 缓存 中,因此在 open_log_file_cache 指令的
valid
参数指定的时间内,可以继续写入旧文件 - 在每次日志写入期间,都会检查请求的 根目录 是否存在,如果不存在,则不会创建日志。因此,最好在同一配置级别上指定 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 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 的字符转义为“\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 open_log_file_cache |
---|---|
默认值 |
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;