前言:
按天分文件
直接上nginx.conf配置
usernginx;worker_processes2;error_log/var/log/nginx/error.logwarn;pid/var/run/nginx.pid;events{worker_connections1024;}http{include/etc/nginx/mime.types;default_typeapplication/octet-stream;log_formatmain'$remote_addr-$remote_user[$time_iso8601]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"$request_time$upstream_response_time';#引入time_iso8601模块设置时间日期变量map$time_iso8601$logdate{#'~^(?<ymdh>\d{4}-\d{2}-\d{2}T\d{2})'$ymdh;'~^(?<ymd>\d{4}-\d{2}-\d{2})'$ymd;default'date-not-found';}#日志存放目录access_log/var/log/nginx/access-$logdate.logmain;#日志缓存,将多个日志进行积累,达到一定量级后写入到磁盘,可以减少磁盘旋转,从而降低磁盘i/o,提升nginx能效open_log_file_cachemax=10;sendfileon;#tcp_nopushon;keepalive_timeout65;#gzipon;include/etc/nginx/conf.d/*.conf;#隐藏http版本号server_tokensoff;}
这样就会按照天生成日志文件;这里边最重要的就是引入$time_iso8601
(这个是nginx里边自带的一个时间格式)进行自定义变量,不需要额按编译。
日期格式优化
nginx自带两种时间格式:
$time_iso8601
形如2023-03-29T16:58:4908:00
$time_local
形如14/Nov/2022:08:28:140000
可以看出$time_local
的格式看起来不是很美妙,对于我自己来说肯定按照‘年月日时分秒’这样看更顺眼一些,所以我们在自定义日志格式的时候,时间格式也是选择的是$time_iso8601
。时间怎么和我们本地时间一致
时间格式顺眼了,但是发现时间还是UTC时区的时间,怎么处理呢:
我这边使用的是docker-compose
,可以直接配置环境变量。
version:'3'services:d_nginx:container_name:c_nginxenvironment:TZ:'Asia/Shanghai'
第二种就是Dockerfile
中编译,一劳永逸。
FROMnginx:1.20.1-alpine#定义时区参数ENVTZ=Asia/Shanghai
有一些低版本的nginx做了以上两步还是不得行,有可能是因为缺少了tzdata
时区数据包。
FROMnginx:1.12.1-alpine#将alpine的源更换成阿里云的源RUNsed-i's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g'/etc/apk/repositories#定义时区参数ENVTZ=Asia/Shanghai#安装时区数据包RUNapkadd--updatetzdata#设置时区RUNln-snf/usr/share/zoneinfo/$TZ/etc/localtime&&echo'$TZ'>/etc/timezone
经过上边的步骤nginx日志里边的格式和时间应该就是我自己想要的了。
给大家分享一个nginx日志分析工具
《goaccess》goaccessnginx.log-a>nginx.html
这个工具能方便快速的分析nginx日志,能可视化的展示很多信息,帮助我们快速定位问题;比如接口的调用量(具体到某一个接口),访问者数量等等。