方法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脚本,自行学习
浙公网安备 33010602011771号