后端

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

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

xiaoziwuzui
我还没有学会写个人说明!
查看“xiaoziwuzui”的所有文章 →

相关推荐