nginx切割日志脚本(python)

释放双眼,带上耳机,听听看~!

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

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

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
1#coding:utf-8
2'''
3Version: 1.0.0
4Actor:youshumin
5Date:2018/04/28
6脚本需求--
7  1.用户提供一个nginx日志路径 (目录)
8  2.用户提供nginxnginx执行路径
9  3.备份日志路径
10  4.保留多久的存储日志文件或者空间 天和GB为单位
11'''
12#######
13Nginx_Log_Dir="/data/nginx/web1/"
14Nginx_Pid_File="/usr/local/nginx/sbin/nginx"
15Nginx_Bak_Dir="/data/nginx/bak/web1"
16Nginx_Bak_Day=15
17Nginx_Bak_Max_Size=20
18#######
19import os,time,shutil
20import tarfile,datetime
21TIME_Secs=time.strftime("%Y%m%d%H%M%S",
22                        time.localtime())
23Time_Day=time.strftime("%Y%m%d",time.localtime())
24POSSIBLE_TOPDIR=os.path.normpath(os.path.abspath(Nginx_Log_Dir))
25Tmp_Work_File=os.path.normpath(os.path.join(POSSIBLE_TOPDIR,
26                                            TIME_Secs))
27
28def MvLog(Sour_Dir,Desc_dir):
29    Need_Mv_File_List=os.listdir(Sour_Dir)
30    os.mkdir(Desc_dir)
31    for item in Need_Mv_File_List:
32        shutil.move(os.path.join(Sour_Dir,item),
33                    Desc_dir)
34
35def ReloadNginxLog(Nginx_Sbin):
36    Shell_Command="{0} -s reopen".format(Nginx_Sbin)
37    if os.system(Shell_Command)==0:
38        print "nginx 日志已经重新加载"
39
40def Tar_Log_File(Log_Path,Tar_Dir):
41    Tar_Bak_Name=os.path.normpath(os.path.join(Tar_Dir,
42                                               "web1_{0}.tar.gz".format(Time_Day)))
43    Tar=tarfile.open(Tar_Bak_Name,"w:gz")
44    Tar.add(Log_Path,arcname=os.path.basename(Log_Path))
45    Tar.close()
46    shutil.rmtree(Log_Path)
47
48def Del_One_Old_File(Del_File_Dir,Check_Day=None):
49    for root, dirs, files in os.walk(Del_File_Dir):
50        files.sort(key=lambda fn: os.path.getctime(os.path.join(root, fn)))
51    if Check_Day==True:
52        OLd_File_Time_Day=datetime.datetime.fromtimestamp(os.path.getctime(os.path.join(root,
53                                                                                        files[0]))).strftime("%Y%m%d")
54        Time_Now=time.strftime("%Y%m%d",time.localtime())
55        S_Day=int(Time_Now)-int(OLd_File_Time_Day)
56        return S_Day
57    else:
58        os.remove(os.path.normpath(os.path.join(root,files[0])))
59
60def Check_Ture_Or_Flase(Nginx_Bak_Dir,Bak_Days,Bak_Size):
61    Nginx_Bak_Dir = os.path.normpath(Nginx_Bak_Dir)
62    Size = 0
63    for root, dirs, files in os.walk(Nginx_Bak_Dir):
64        Size += sum([os.path.getsize(os.path.join(root, name)) for name in files])
65    Mb_Size = '%.2f' % float(Size / 1024.0 / 1024.0)
66    Mb_Max_Bak_Size = '%.2f' % float(Bak_Size * 1024)
67    Flat = Del_One_Old_File(Nginx_Bak_Dir, True) > Bak_Days or float(Mb_Size) > float(Mb_Max_Bak_Size)
68    return Flat
69
70def Check_Bak_Dir(Nginx_Bak_Dir,Bak_Days,Bak_Size):
71    Flat=Check_Ture_Or_Flase(Nginx_Bak_Dir,Bak_Days,Bak_Size)
72    while Flat:
73        Del_One_Old_File(Nginx_Bak_Dir)
74        Flat = Check_Ture_Or_Flase(Nginx_Bak_Dir, Bak_Days, Bak_Size)
75        if Flat==False:
76            break
77
78if __name__=="__main__":
79  '''
80    MvLog 移动当前文件
81    ReloadNginxLog 从新加载nginx日志
82    Tar_Log_File 打包日志文件
83    Check_Bak_Dir 检查日志备份目录,是否需要删除备份日志
84    '''
85    MvLog(POSSIBLE_TOPDIR,Tmp_Work_File)
86    ReloadNginxLog(Nginx_Pid_File)
87    Tar_Log_File(Tmp_Work_File,Nginx_Bak_Dir)
88    Check_Bak_Dir(Nginx_Bak_Dir,Nginx_Bak_Day,Nginx_Bak_Max_Size)
89

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C++ 中 struct和class 的区别

2022-1-11 12:36:11

安全技术

JavaScript面向对象编程(6)利用原型链实现继承

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索