nginx模块 ngx_http_log_module

2018-07-18 10:11:47

ngx_http_log_module 模块可以按照特定的格式记录访问日志。

它是基于 location 上下文的,所以如果有内部跳转,那么有些变量可能会变。

Syntax:	access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except

combined 默认格式定义如下。

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

如果指定了 gzip 压缩,那么 缓冲区的数据会压缩后才会写入到文件,需要zlib库的支持。

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

flush=5m代表缓冲区5分钟后到期,就算没满也刷新的磁盘。如果开启了缓冲区那么只要满足3个条件就会刷新到磁盘:

1.缓冲区满了。
2.缓冲区到期。
3.nginx -s reload。

如果日志路径 path里包含变量,那么缓冲区不生效,在每次记录日志时文件将会打开和关闭,非常耗性能。但是可以指定 open_log_file_cache缓存来避免频繁的打开关闭文件。每次写日志的时候都会去校验根目录是否存在,如果不存在,日志将不创建。所以最好同时指定 root 和 access_log。

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

同时也支持 if 条件,满足则记录。

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

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


Syntax:	log_format name [escape=default|json|none] string ...;
Default: log_format combined "...";
Context: http

指定日志格式,escape指定转义,none代表不转义。

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


Syntax:	open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
Default: open_log_file_cache off;
Context: http, server, location

打开文件缓存,要来避免在path里包含变量时频繁的打开和关闭文件。

max  指定缓存的文件描述符最大数量,超过了把最前面缓存的删除。

inactive  指定没访问的文件的超时时间,超过了自动关闭文件。

min_uses  就算超时了,如果文件使用次数没超过此数,也不关闭。

valid  有效时间,超过了这个时间就会重新去校验文件是否存在。

off  关闭。

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


记录syslog

access_log syslog:server=192.168.1.202:514,tag=nginx,facility=local7,severity=crit combined;

上面的意思是,将访问日志通过udp方式发送到 192.168.1.202:514,标签为 nginx,priority标记为 local7.crit,日志格式为默认的 combined。

192.168.1.202 /etc/rsyslog.conf 部分配置如下,开启了udp,local7.*记录到 /var/log/boot.log文件里。

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

假设我们的nginx服务器在 192.168.1.10 上。

curl localhost

那么在 202的日志文件 /var/log/boot.log 就会看到如下一条记录。

Jul 18 11:53:01 localhost.localdomain nginx: 127.0.0.1 - - \
[18/Jul/2018:11:53:01 +0800] "GET / HTTP/1.1" 200 18 "-" "curl/7.29.0"

如果在 access_log 配置上加上 nohostname 标记,那么上面的 localhost.localdomain 就会消失。

当然也支持 本地 unix domain socket。

access_log syslog:server=unix:/run/x.sock,tag=nginx,facility=local7,severity=crit combined;

syslog详细知识点请参考 linux c syslog 和 linux命令logger


 备注

1.测试环境centos7 64位,nginx版本为 1.14.0。
2.读者也可以参考官方文档 nginx documentation
3..原文地址http://www.freecls.com/a/2712/c2


©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。