Nginx日志
Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误日志记录了访问出错的信息,可以帮助我们定位错误的原因。本文将详细描述一下如何配置Nginx日志。
ngx_http_log_module 模块指定日志格式记录请求 log_format NAME string ...; string可以使用nginx核心模块及其它模块内嵌的变量定义在(上下文:http) access_log off; #禁用访问日志,访问日志文件路径,格式及相关的缓冲的大小 压缩方式 删除清空日志的时间 access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];(上下文:http server) path :日志写入的路径或 指定 syslog: 前缀配置将日志记录到 syslog format 指定日志的格式。默认使用预定义的combined。 buffer 用来指定日志写入时的缓存大小。默认是64k。 gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。 flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。 if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。 off 如果指定了该值,当前作用域下的所有的请求日志都被关闭 示例
示例
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format zjol '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" ';
server {
access_log /var/logs/nginx-access.log main buffer=32k;
access_log /usr/local/nginx/logs/zjol.access.log zjol;
error_log /usr/local/nginx/logs/zjol.error.log error;
}
nginx 的默认访问日志记录内容相对比较单一,默认的格式也不方便后期做日志统计分析, 生产环境中通常将nginx日志转换为json日志,然后配合使用ELK做日志收集-统计-分析 log_format zzhz_json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"uri":"$uri",' '"domain":"$host",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"tcp_xff":"$proxy_protocol_addr",' '"http_user_agent":"$http_user_agent",' '"status":"$status"}'; access_log /apps/nginx/logs/access_json.log zzhz_json; json格式的日志访问统计: #!/usr/bin/env python #coding:utf-8 #Author:Zhang ShiJie status_200= [] status_404= [] with open("access_json.log") as f: for line in f.readlines(): line = eval(line) if line.get("status") == "200": status_200.append(line.get) elif line.get("status") == "404": status_404.append(line.get) else: print("状态码 ERROR") f.close() print "状态码200的有--:",len(status_200) print "状态码404的有--:",len(status_404) 测试: [root@ ~]# python nginx_json.py 状态码200的有--: 1910 状态码404的有--: 13
将多个日志进行积累,达到一定量级后写入到磁盘,可以减少磁盘旋转,从而降低磁盘i/o,提升nginx能效
缓存各日志文件相关的元数据信息
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off; 禁用缓存
max: 设置缓存中描述符的最大数量。如果缓存变满,则最近最少使用(LRU)的描述符将被关闭
min_uses: 在inactive指定的时长内访问大于等于此值方可被当作活动项
inactive: 如果在此时间后缓存描述符没有被访问,则被关闭,默认为 10 秒
valid: 验证缓存中各缓存项是否为活动项的时间间隔
access_log /application/nginx/logs/access_81.log zjol buffer=64k flush=1m;
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=1;
buffer=64k #日志文件缓存在内存中的大小
flush=1m #内存中日志存留一分钟
max=1000 #文件描述符
inactive=20s #日志文件在缓存中没有被使用就会被取消
valid=1m #默认 1m 或 60s 两个单位都可以使用
min_uses=1 #在存活时间内日志被写入几次才会记录到缓存
清空日志不要用rm,建议使用cat /dev/null > /log/access_log.log 或 > /log/access_log.log.