Nginx日志管理

使用版本 - CentOS Linux release 7.5.1804 (Core) - nginx/1.12.2版本 - curl 7.61.0 (x86_64-pc-linux-gnu) libcurl/7.61.0 OpenSSL/1.0.2k zlib/1.2.7
目录
error_log
log_format
access_log
error_log
Syntax: error_log file [level]; Default: error_log logs/error.log error; Context: main, http, mail, stream, server, location日志级别严重性从轻到重顺序:debug、info、notice、warn、error、crit、alert、emerg 如果file设置为stderr,nginx将会将日志输出到标准错误输出 设置某个日志级别将会使指定级别和更高级别的日志都被记录下来,如指定error会使nginx记录所有的error、crit、alert、emerg级别消息 debug日志级别需要configure --with-debug 特殊file值stderr可以将error_log输出到标准错误输出中,不过需要nignx的守护进程设置为off(damemon off;)
log_format
Syntax: log_format name [escape=default|json|none] string ...;
Default: log_format combined "...";
Context: http
定义日志的格式,access_log默认使用的日志格式名字叫combined,可以定一个名字叫test的日志格式,然后让access_log使用test的日志格式 nginx有一个默认的日志combined
log_format combined '$remote_addr - $remote_user [$time_local] '

                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent"';

access_log
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
server{

 access_log /tmp/nginx.access combined buffer=64k gzip=9 flush=1m;

}
参数: - path:指定记录日志的位置 - format:指定记录日志内容的格式,由log_format指定,默认的format名字为combined - buffer:指定缓存buffer大小,buffer的大小不能超过磁盘原子性写入大小 - gzip:指定缓存压缩,如果gzip参数被使用,则buffer数据会先被压缩,然后再写入文件。gzip参数可以指定为1-9,1为最快,9最慢但是压缩比最大。默认情况下,gizp为1 - flush:指定缓存到期时间,flush=1m为1分钟(如果达到1分钟,不管buffer满没满都将缓存写进日志文件) - 为访问日志设置路径、格式和缓冲区大小。在同一个配置层级里可以指定多个日志,特定值off会取消当前配置层级里面的所有access_log。如果没有指定日志格式则会使用预定义的combined 请求在处理结束时,会按请求路径的配置记录访问日志,如果请求处理期间产生了内部跳转,请求结束时的路径可能不同于原始的请求路径
如果请求location a;在location a里面发生内部跳转到location b;在location b里面重新定义access_log或者error_log等,则location a里面的不会生效

如果在location a里面proxy pass到location b,则a和b的都会记录,并且a的http_code是b给返回的

server{

 location /a {
   access_log /tmp/a;
   rewrite ^/(.*)$ /b last;  #请求这里会改变uri为/b,并且发生重新请求到location /b
 }
 location /b {
   access_log /tmp/b;
 }

}
以上只有access_log /tmp/b会生效

server{

 location /a {
   access_log /tmp/a;
   proxy_pass http://127.0.0.1/b;  #发生请求到location /b
 }
 location /b {
   access_log /tmp/b;
 }

}
以上access_log /tmp/b和access_log /tmp/a都会生效 如果指定gzip或者buffer参数,则写操作会被缓存 如果写操作缓存被使用,以下会发生实际写入文件的操作 - 下一个日志没有被缓存 - 如果到了flush指定的时间 - 达到指定的buffer大小 - 工作进程关闭或者打开(kill掉工作进程) 如果指定了缓存或者gzip,还指定了flush=1m,则在缓存不超缓存大小的情况下,会在1分钟后写入日志 如果日志数据被压缩,查看日志文件需要使用zcat filename 为了支持gzip功能,系统必须有zlib library模块 如果access_log的路径值使用变量,则不能使用buffer、gzip、flush,否则会报错 如果将nginx日志删掉,启动nginx和reload会新建这个日志文件;如果在运行期间删除nginx文件,则新请求不会创建nginx日志文件;日志路径包含变量的话,会在运行期间创建文件 如果运行期间日志被删除,则可以使用kill -USR1 nginx进程号 来创建nginx日志,-USR1对日志切割同样管用 在日志切割中,如果剪切access_log到access_log.old文件,然后给nginx的master进程发送-USR1信号,如果日志缓存启用,则日志缓存不管有没有到期或者达到buffer指定的大小,都缓存会写进access_log.old文件中 注意,如果更改access_log的format,则要使用log_format定义,然后再使用server{ log_format test '$remote_addr $status'; access_log /tmp/nginx_access.log test; }出处https://github.com/Zhucola/advanced-nginx