nginx日志命名与切割

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版权协议,转载请附上原文出处链接和本声明。