nginx access log

早晨尝试给数据喂一些设备的请求信息。 虽然最后发现客户端没有带上这些信息从而作罢,但是还是学到了一点冷知识。

Nginx 的访问日志比我想象的厉害一点,ngx_http_log_module 模块可以自定义日志格式。 日志格式通过指令 log_format 来定义,日志输出通过指令 access_log 来定义。

log_format

默认的输出格式的名字叫 combined。 我们可以自定义输出格式的名字,这个名字将可以用在 access_log 里面指定这种自定义格式输出到哪里。 输出格式的字符串中可以填入由 $ 开头的的变量。

有一些内建的变量,例如 $bytes_sent, $request_time, $status, $time_iso8601 等等。 可以通过 $sent_http_ 前缀获取响应 header,例如 $sent_http_content_length 可以获取响应长度。 可以通过 $http_ 前缀获取请求的 header,例如 $http_user_agent。 可以通过 $cookie_ 前缀获取请求的 cookie,例如 $cookie_session

缺失的内容会被使用 - 填充。

access_log

使用 access_log off 关闭日志,但是不建议这么做。 使用 access_log /var/log/nginx/app-event.log 将 combined 日志输出到文件。 使用 access_log /var/log/nginx/app-event.log my_log_format 将自定义的输出格式输出到文件。

可以使用 gzip, 或者 compress 压缩内容。 可以使用 flush 设定刷到磁盘的间隔或 buffer 设定缓冲区的大小。 可以使用 if 来过滤请求。

总结

以上用法在 ngx_http_log_module 模块的文档中有更多介绍。

接口设计与实现

在指令的设计上,有 formatter 和 handler 的两层封装,与大多数日志库的使用是一样的。

Nginx 可能在解析日志后使用一张表存储了每个 server 的 log_format,而在输出时将请求的数据应用到多种格式输出到目的文件。

替代方案

估计没有很多人会喜欢解析 nginx access log,因为脏数据比较多。 如果不是非必需,应用自己收集日志可能可用性更高。

来源: ngx_http_log_module