方法1:

日志切分很简单,利用nginx_lua
set $currentDate 'day';
access_by_lua 'ngx.var.currentDate = os.date("%Y-%m-%d")';
access_log /data1/nginx/logs/access.$currentDate.log main;
$currentDate的规则请自行发挥

 

方法2:

使用shell,可参考网上 https://blog.csdn.net/Skywin88/article/details/108539621

#!/bin/bash
# -*- coding: utf-8 -*-
# --------------------------------------------------
# @Time : 2020/6/17 10:36
# @Author : skywin886
# @File : nginx_log_cut.sh
# @Version : 1.2.0
# --------------------------------------------------

#Nginx日志路径
LogPath=/var/log/nginx/
#Access日志名称
LogAccess=access
#Error日志名称
LogError=error

#Nginx主文件路径
NginxPath=/usr/sbin/nginx
#分割后日志存放路径
LogCutPath=/var/log/nginx/

#脚本日志生成路径
ShellLogPath=./nginx_log_cut.sh
#时间戳命名格式
Current=`date "+%Y%m%d%H%M%S"`
#日志时间戳格式
CurrentLog=`date "+%Y-%m-%d %H:%M:%S"`

#日志路径生成检查
if [ -d "$LogPath" ];then
    mkdir -p ${LogCutPath}

    #access.log
    if [ -f "$LogPath$LogAccess.log" ];then
        mv ${LogPath}${LogAccess}.log  ${LogCutPath}/${LogAccess}_${Current}.log | tee -a $ShellLogPath
    else
        echo -e "\033[31m$CurrentLog $LogAccess.log文件不存在\033[0m" | tee -a $ShellLogPath
    fi

    #error.log
    if [ -f "$LogPath$LogError.log" ];then
        mv ${LogPath}${LogError}.log  ${LogCutPath}/${LogError}_${Current}.log | tee -a $ShellLogPath
    else
        echo -e "\033[31m$CurrentLog $LogError.log文件不存在\033[0m" | tee -a $ShellLogPath
    fi

    #通知Nginx重新生成日志
    if [ -f "$NginxPath" ];then
        #root用户执行
        #kill -USR1 `cat $NginxPid` 2>&1 >> "$LogCutLog"
        #普通用户执行
        $NginxPath -s reload 2>&1 >> $ShellLogPath
    else
        echo -e "\033[31m$CurrentLog Nginx主文件不存在,请检查Nginx主文件路径\033[0m" | tee -a $ShellLogPath
        exit 0
    fi

    echo -e "\033[32m$CurrentLog 已完成日志分割\033[0m" | tee -a $ShellLogPath

else
    echo "\033[31m$CurrentLog ERROR Nginx日志路径不存在,请检查配置后重试\033[0m"  | tee -a $ShellLogPath 
    exit 0
fi

: '
配合crontab使用说明
需要配合crontab实现每日任务用于分割日志

例如
输入crontab -e

如需每天早上6点执行该脚本则添加如下一行保存
相当于每日日志分割
0 6 * * * /脚本存放路径/nginx_log_cut_v1.0.sh

每个月的第一天 13:10分运行则添加如下一行保存
相当于每月日志分割
10 13 1 * * /root/auto_backup_gitlab_send_ftp.sh

每5天执行一次
相当于每5天分割
0 0 */5 * * /root/auto_clean_docker_log.sh

每次开机就执行一次
@reboot /root/auto_backup_gitlab_send_ftp.sh

显示所有crontab
crontab -l
'

注:该shell的一个缺点是,日志文件较大时,可能会有较长的日志缺失时间段。

可以使用移动日志目录,并即时重载nginx的方式,日志缺失时间基本会很短。参考 https://segmentfault.com/a/1190000018422223

#!/bin/bash
time=$(date -d "yesterday" +"%Y%m%d")
# 日志目录
logs_path="/var/log/nginx/siteA/"
# pid文件路径
pid_path="/run/nginx.pid"
# 移动(重命名)日志文件
mv ${logs_path}access.log ${logs_path}access_${time}.log
# 使用中断信号重载nginx,重新生成日志文件
kill -USR1 `cat ${pid_path}`
 
多日志分割参考 https://www.jianshu.com/p/1ccdd3e390ac
#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
logs_backup_path="/data/logs/logs_backup/$year$month" #日志备份路径

logs_path="/data/logs/" # 原始日志路径
logs_access="access" # access日志
logs_error="error" # error日志
pid_path="/var/run/nginx.pid" #nginx的pid

[ -d $logs_backup_path ] || mkdir -p $logs_backup_path
time=`date +%Y%m%d`
for log in `ls -al ${logs_path} | grep "^-" | awk '{print $9}' `
do
   mv ${logs_path}${log} ${logs_backup_path}/${log}_${time}.bak
done
#mv ${logs_path}${logs_access}.log ${logs_backup_path}/${logs_access}_${time}.log
#mv ${logs_path}${logs_error}.log ${logs_backup_path}/${logs_error}_${time}.log
kill -USR1 $(cat /var/run/nginx.pid)
 
 
方法3:

使用python脚本,自行学习

 

posted on 2020-11-10 09:45  51core  阅读(146)  评论(0)    收藏  举报