nginx切割日志脚本(python)

发布时间:2019-09-10 09:20:15编辑:auto阅读(1914)

    因为以前没有做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)

关键字