Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志(http块、server块、location块均可以)。

日志格式通过 log_format 配置项进行定义。

log_format 配置项

  1. log_format 的作用是定义日志格式语法
# 配置语法: 包括: error.log access.log
语法: log_format name [escape=default|json] string ...;
默认值: log_format combined "...";
配置段: http
# 日志定义格式只能在http块中,定义好的日志格式便可以在 access_log 配置项中进行引用

log_format 定义的该日志格式名(自定义) '日志内置变量';
  1. Nginx默认日志格式语法
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
  1. Nginx日志格式允许包含的内置变量
$remote_addr        # 记录客户端IP地址
$remote_user        # 记录客户端用户名
$time_local         # 记录通用的本地时间
$time_iso8601       # 记录ISO8601标准格式下的本地时间
$request            # 记录请求的方法以及请求的http协议
$status             # 记录请求状态码(用于定位错误信息)
$body_bytes_sent    # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent         # 发送给客户端的总字节数
$msec               # 日志写入时间。单位为秒,精度是毫秒。
$http_referer       # 记录从哪个页面链接访问过来的
$http_user_agent    # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length     # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time       # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客户端真实的IP地址。
# $remote_addr 获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加 X-Forwarded-For 信息,用来记录客户端IP地址和客户端请求的服务器地址。
  1. access_log(访问)日志配置语法
语法: 	access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
#    gzip 压缩等级。
#    buffer 设置内存缓存区大小。
#    flush 保存在缓存区中的最长时间
access_log off; # 不记录访问日志

默认值: 	access_log  /var/log/nginx/host.access.log  main;;
配置段: 	http, server, location, if in location, limit_except

access_log 日志文件路径 引用定义的日志格式(即在http块中定义好的log_format名); # 日志文件不存在会自行创建,但是文件所在目录不存在会报错
  1. error_log(错误)日志配置语法
配置:	error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
默认:	error_log  /var/log/nginx/error.log notice;
配置段:	main(全局块), http, server, location
  1. open_log_file_cache 配置项

对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用 open_log_file_cache 来设置日志文件缓存(默认是 off)。

语法:	open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
		open_log_file_cache off;
默认值:	open_log_file_cache off;
配置段:	http, server, location
参数:
    max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用 LRU 算法将描述符关闭。
    inactive:设置存活时间,默认是 10s
    min_uses:设置在 inactive 时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是 1 次
    valid:设置检查频率,默认 60s
    off:禁用缓存

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

nginx日志切割

[root@nginx ~]# cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
        daily		# 每天切割日志
        missingok	# 日志丢失忽略
        rotate 52	# 日志保留52天
        compress	# 日志文件压缩
        delaycompress	# 延迟压缩日志
        notifempty		# 不切割空日志
        create 640 nginx adm	# 日志文件权限
        sharedscripts			
        postrotate			# 切割日志执行的命令
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}