博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx切割日志脚本(python)
阅读量:6095 次
发布时间:2019-06-20

本文共 3357 字,大约阅读时间需要 11 分钟。

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

需求:

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

分析:

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

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

#coding:utf-8'''Version: 1.0.0Actor:youshuminDate: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=15Nginx_Bak_Max_Size=20#######import os,time,shutilimport tarfile,datetimeTIME_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 Flatdef 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:            breakif __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)

转载于:https://blog.51cto.com/youprince/2109134

你可能感兴趣的文章
Maven学习总结(四)——Maven核心概念
查看>>
IOS开发 统计XCODE 代码行数
查看>>
BZOJ1497[NOI2006]最大获利——最大权闭合子图
查看>>
应用系统架构设计
查看>>
[9-13]Shell系列3——分支结构if与case语句
查看>>
Linux系统上的任务计划(at、crontab)的详细使用方法
查看>>
使用emacs的org-mode进行时间管理(二)——TODO
查看>>
JavaScript强化教程——DOM编程(两种控制div移动的方法)
查看>>
生成自己的Alphanumeric/Printable shellcode
查看>>
云计算服务和应用产品价格是多少才合适呢?
查看>>
怎样让山寨安卓机享有google map服务
查看>>
深入学习Java虚拟机——类加载机制
查看>>
为Windows下的Apache服务器添加防DDoS模块
查看>>
JavaScript函数内部属性arguments
查看>>
PHP如何对在线用户状态进行检测
查看>>
硬盘克隆之HDclone
查看>>
公司技术特点
查看>>
MongoDB【最新版V2.6】- 系列 1:Mongdb 启动的基本配置
查看>>
自动化运维工具——ansible
查看>>
LVM
查看>>