nginx切割日志脚本(python)

因为以前没有做nginx日志分割,有时候想看日志的时候总是发现有十几G的甚至上百G的日志文件,于是就想使用python写个nginx日志分割(当然你也可以使用shell来完成都是很简单)

需求:
1.按照日分割nginx所有日志
2.由于日志不需要随时可以查看,需要做归档(压缩.tar.gz)
3.归档日志需要有过期时间和容量限制(分割日志需要做定期的删除,超过一定时间或者目录大小超过一定容量)

分析:
按照需求,我们需要 备份前一天日志---->重新加载日志文件---->压缩日志文件---->检测备份日志文件目录

好了,也不一一分析脚本,直接发出来了,有什么问题大家可以提啊。

#coding:utf-8
‘‘‘
Version: 1.0.0
Actor:youshumin
Date:2018/04/28
脚本需求--
  1.用户提供一个nginx日志路径 (目录)
  2.用户提供nginxnginx执行路径
  3.备份日志路径
  4.保留多久的存储日志文件或者空间 天和GB为单位
‘‘‘
#######
Nginx_Log_Dir="/data/nginx/web1/"
Nginx_Pid_File="/usr/local/nginx/sbin/nginx"
Nginx_Bak_Dir="/data/nginx/bak/web1"
Nginx_Bak_Day=15
Nginx_Bak_Max_Size=20
#######
import os,time,shutil
import tarfile,datetime
TIME_Secs=time.strftime("%Y%m%d%H%M%S",
                        time.localtime())
Time_Day=time.strftime("%Y%m%d",time.localtime())
POSSIBLE_TOPDIR=os.path.normpath(os.path.abspath(Nginx_Log_Dir))
Tmp_Work_File=os.path.normpath(os.path.join(POSSIBLE_TOPDIR,
                                            TIME_Secs))

def MvLog(Sour_Dir,Desc_dir):
    Need_Mv_File_List=os.listdir(Sour_Dir)
    os.mkdir(Desc_dir)
    for item in Need_Mv_File_List:
        shutil.move(os.path.join(Sour_Dir,item),
                    Desc_dir)

def ReloadNginxLog(Nginx_Sbin):
    Shell_Command="{0} -s reopen".format(Nginx_Sbin)
    if os.system(Shell_Command)==0:
        print "nginx 日志已经重新加载"

def Tar_Log_File(Log_Path,Tar_Dir):
    Tar_Bak_Name=os.path.normpath(os.path.join(Tar_Dir,
                                               "web1_{0}.tar.gz".format(Time_Day)))
    Tar=tarfile.open(Tar_Bak_Name,"w:gz")
    Tar.add(Log_Path,arcname=os.path.basename(Log_Path))
    Tar.close()
    shutil.rmtree(Log_Path)

def Del_One_Old_File(Del_File_Dir,Check_Day=None):
    for root, dirs, files in os.walk(Del_File_Dir):
        files.sort(key=lambda fn: os.path.getctime(os.path.join(root, fn)))
    if Check_Day==True:
        OLd_File_Time_Day=datetime.datetime.fromtimestamp(os.path.getctime(os.path.join(root,
                                                                                        files[0]))).strftime("%Y%m%d")
        Time_Now=time.strftime("%Y%m%d",time.localtime())
        S_Day=int(Time_Now)-int(OLd_File_Time_Day)
        return S_Day
    else:
        os.remove(os.path.normpath(os.path.join(root,files[0])))

def Check_Ture_Or_Flase(Nginx_Bak_Dir,Bak_Days,Bak_Size):
    Nginx_Bak_Dir = os.path.normpath(Nginx_Bak_Dir)
    Size = 0
    for root, dirs, files in os.walk(Nginx_Bak_Dir):
        Size += sum([os.path.getsize(os.path.join(root, name)) for name in files])
    Mb_Size = ‘%.2f‘ % float(Size / 1024.0 / 1024.0)
    Mb_Max_Bak_Size = ‘%.2f‘ % float(Bak_Size * 1024)
    Flat = Del_One_Old_File(Nginx_Bak_Dir, True) > Bak_Days or float(Mb_Size) > float(Mb_Max_Bak_Size)
    return Flat

def Check_Bak_Dir(Nginx_Bak_Dir,Bak_Days,Bak_Size):
    Flat=Check_Ture_Or_Flase(Nginx_Bak_Dir,Bak_Days,Bak_Size)
    while Flat:
        Del_One_Old_File(Nginx_Bak_Dir)
        Flat = Check_Ture_Or_Flase(Nginx_Bak_Dir, Bak_Days, Bak_Size)
        if Flat==False:
            break

if __name__=="__main__":
  ‘‘‘
    MvLog 移动当前文件
    ReloadNginxLog 从新加载nginx日志
    Tar_Log_File 打包日志文件
    Check_Bak_Dir 检查日志备份目录,是否需要删除备份日志
    ‘‘‘
    MvLog(POSSIBLE_TOPDIR,Tmp_Work_File)
    ReloadNginxLog(Nginx_Pid_File)
    Tar_Log_File(Tmp_Work_File,Nginx_Bak_Dir)
    Check_Bak_Dir(Nginx_Bak_Dir,Nginx_Bak_Day,Nginx_Bak_Max_Size)

原文地址:http://blog.51cto.com/youprince/2109134

时间: 2024-10-10 23:09:42

nginx切割日志脚本(python)的相关文章

python写的nginx切割日志脚本

#!/usr/bin/env pthon #_*_coding=utf-8_*_ #python版本(nginx日志切割脚本) import os import datetime #access.log路径 accesslogs_path = "/usr/local/nginx/logs/" #昨天的日期 lastDate = datetime.date.today() - datetime.timedelta(days=1) #备份路径 bak_path = "%s%s/%

Nginx 切割日志脚本

非常的简单, 主要是留一个记号, 方便以后使用 #!/bin/bash access_path="/usr/local/nginx/logs/" logs_path="/webdata/logs/" mkdir -p ${logs_path}$(date '+%y_%m')/$(date '+%d')/ mv ${access_path}access.log ${logs_path}$(date '+%y_%m')/$(date '+%d')/access_$(da

nginx 切割日志文件

一.利用crontab 切割nginx日志文件(linux平台下) cat nginx_log.sh #!/bin/bash # 零点执行该脚本 # Nginx 日志文件所在的目录 LOGS_PATH=/data/opt/nginx/logs ## 获取昨天的 yyyy-MM-dd YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) # 移动文件 mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YEST

nginx切割日志

#!/bin/bash # # Filename:    nginxCutLog.sh # Author:      Qicheng # Website:     http://qicheng0211.blog.51cto.com/ # Description: 切割nginx日志 # Notes:       设置crontab,每天23点59分定时执行 # ROOT_UID=0 if [ "$UID" -ne "$ROOT_UID" ];then     ech

shell切割日志脚本

1 #!/bin/bash 2 3 set -e 4 5 source /etc/bashrc 6 7 cd `dirname $0` 8 9 linenum=`wc -l userinfolist.txt | awk '{print $1}'` 10 11 n1=1 12 13 file=1 14 15 while [ $n1 -lt $linenum ] 16 do 17 n2=`expr $n1 + 9999` 18 sed -n "${n1}, ${n2}p" userinfo

nginx日志切割脚本,python实现

# 自搭建了个人博客 有需要交流学习的可以访问 www.wpython.com #!/usr/bin/env python   import datetime,os,sys,shutil   log_path = '/alidata/log/nginx/access/' log_file = 'www.wpython.com.log'   yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1))   try:    

shell脚本:nginx访问日志切割与打包上传

脚本功能: 日志切割类脚本,包含:nginx的访问日志.网关设备.AC设备.认证信息等等日志,都通过ftp上传到相应的服务器进行保存. --------------- #!/bin/bash # Cut and upload nginxlog # by colin # revision on 2016-02-22 ######################################## # 功能说明:该脚本运用于切割与上传nginxlog # # 更新说明: # ############

nginx日志切割shell脚本

#!/bin/bash #function:cut nginx log files shell #cp /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log.bak log_cut_path="/var/log/nginx" log_files_path="/usr/local/nginx/logs/" log_files_dir=${log_cut_path}$(date -d &quo

线上nginx访问日志切割脚本

1.说明 随着时间的增加,nginx 的访问日志会越来越大,下图是新部署的线上 zabbix 监控网站运行了十几天左右产生的访问日志达到213M. 所以必须进行日志分割,要求如下: 1.每天的日志单独生成一个文件 2.保留30天的访问日志 2.编写脚本 vim /usr/local/nginx/logs/nginx_log_rotate.sh #! /bin/bash logs_path="/usr/local/nginx/logs/" log_name="access.lo