Nginx以日期命名日志
配置如下:
http {
..........
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$upstream_addr" "$upstream_status"'
'"$upstream_response_time" "$request_time"';
error_log logs/error.log;
map $time_iso8601 $logdate {
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
default 'date-not-found';
}
access_log logs/access.$logdate.log main;
open_log_file_cache max=10;
...........
}
upstream_addr:请求分发到哪台后端服务器
upstream_status:分发请求的状态
upstream_response_time:nginx与后端建立TCP连接开始到接收完响应数据并关闭连接为止
request_time:从接收到客户端的第一个字节开始,到把所有的响应数据都发送完为止
所以,request_time会大于等于upstream_response_time
upstream_connect_time:跟后端server建立连接的时间,如果是到后端使用了加密的协议,该时间将包括握手的时间
upstream_header_time:接收后端server响应头的时间


map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装 nginx 都会安装该模块。
上面这配置文件使用关键字 map 来定义一个变量 $logdate
如果 nginx 内置变量 $time_iso8601 通过正则能匹配到则 获取到 $logdate = $ymd 否则 $logdate = 'date-not-found'
reload后日志文件不会马上生成,因为日期是通过 $time_iso8601 内置变量获取的。需要访问一下才会生成日志文件
访问触发以后,如果还没有生成日期格式的日志文件,则检查下 nginx 运行用户及目录属主属组。有两种方法解决:
1、对nginx日志目录授予777的权限
chmod -R 777 logs
2、更改logs的所有者
chown nginx:root logs
Nginx日志分割-脚本分割
以日志形式存在的日志会保留7天,7天之前的日志会以压缩包形式存在,共180天。脚本放置在与nginx日志目录同级,使用Linux计划任务执行
#!/bin/bash
#Version:2.0 2020-10-15
#########################################################以下参数需要填写#########################################################
#设置日志保留天数
LOGS_DAYS=7
#设置归档文件(.gz)保留天数
ARCHIVE_DAYS=180
DATE_Y=`date -d yesterday +%Y-%m-%d`
################################使用方法 计划任务 例:1 0 * * * /opt/nginx/nginx-logclean.sh################################
cd `dirname $0` || { echo Failure To Exit && exit ;}
LOGS_DIR=`pwd`
cd $LOGS_DIR/logs
echo "LOGS_DIR IS $LOGS_DIR/logs"
#define gzip and delete expire file leave lastest files
gzip_fun(){
LOG_NUM=`ls -1t $1.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].log 2>/dev/null | wc -l`
if [ $LOG_NUM -gt $LOGS_DAYS ]
then
echo "gzip old files "
GZIP_DAYS=`expr $LOG_NUM - $LOGS_DAYS`
for i in `ls -1t $1.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].log | tail -$GZIP_DAYS`
do
echo "gzip $i"
gzip -fN $i
done
fi
}
del_fun(){
ARCHIVE_NUM=`ls -1t ls -1t $1.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].log.gz 2>/dev/null | wc -l`
if [ $ARCHIVE_NUM -gt $ARCHIVE_DAYS ]
then
echo "delete old files "
DEL_DAYS=`expr $ARCHIVE_NUM - $ARCHIVE_DAYS`
for i in `ls -1t $1.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].log.gz | tail -$DEL_DAYS`
do
echo "rm -rf $i"
rm -rf $i
done
fi
}
split_fun(){
if [ ! -f $1.$DATE_Y.log.gz ]
then
gzip -c $1.log > $1.$DATE_Y.log.gz && > $1.log
fi
}
#access.log
gzip_fun access &&
del_fun access
#error.log
split_fun error &&
del_fun error
版权声明:本文为m0_37642477原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。