日志 ###

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

请求在处理结束的 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/angie-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-log-path 构建选项

上下文

http, server, location, if in location, limit_except

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

如果使用了 buffergzip 参数,则写入日志将被缓冲。

小心

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

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

  • 如果下一行日志不适合缓冲区;

  • 如果缓冲的数据比 flush 参数指定的时间更旧;

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

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

示例:

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

重要

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

文件路径可以包含变量,但此类日志有一些限制:

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

  • 缓冲写入无效;

  • 每次日志写入时,文件都被打开和关闭。然而,由于可以将频繁使用的文件的描述符存储在缓存中,因此在 open_log_file_cache 指令的 valid 参数指定的时间内,写入旧文件仍然可以继续;

  • 在每次日志写入时,检查请求的根目录是否存在,如果不存在,则不创建日志。因此,最好在同一配置级别上同时指定 rootaccess_log

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

if 参数启用条件日志记录。如果条件计算结果为 "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 参数允许设置 jsondefault 字符串中的字符转义,默认使用 default 转义。none 值禁用转义。

对于 default 转义,字符 ""、"\" 和其他值小于 32 或大于 126 的字符将被转义为 "\xXX"。如果未找到变量值,则将记录一个连字符 "-"。

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

发送到客户端的头行具有前缀 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;