python 簡單實現日誌文件打包並推送至七牛存儲

目標: 
1.實現將目標文件拷貝備份到其他目錄並重新命名爲日期+.back格式
2.清空源文件的內容
2.並對n天前的備份.back文件進行打包爲tgz包
3.刪除備份的.back文件,
4.推送tgz壓縮文件到七牛存儲。
5.刪除本地tgz包

測試


推送文件至七牛

備份腳本
[root@iZm5e9x1jjza2nspm04niyZ tmp]# cat back_file.py 
[root@iZm5e9x1jjza2nspm04niyZ scripts]# cat back_file.py 
# -*- coding: utf-8 -*-
import shutil
from datetime import datetime as dt
import datetime
import sys
import argparse
import os


class f_backup:
    def __init__(self,sdir,bdir,sfile,rday,bday):
        self.sdir = sdir
        self.bdir = bdir
        self.sfile = sfile
        self.bday = bday
        self.rday = rday
    @staticmethod
    def mkdirpdir(sdir,bdir):
        if not os.path.isdir(bdir):
            os.makedirs(bdir)
        if not os.path.isdir(sdir):
            print('備份文件目錄不存在請重新指定')
            sys.exit(1)
    def cpbackfile(self):
        for i in self.sfile:
            checkdir=self.mkdirpdir(self.sdir,self.bdir)
            self.localfile = self.sdir + i
            self.backfile = self.bdir + i +'.'+self.rday+'.back'
            shutil.copyfile(self.localfile,self.backfile)
            if os.path.isfile(self.backfile):
                print('copyfile-成功')
                #清空文件
                clearfile = open(self.localfile,'w').close()
                print('目標文件已清空')
            else:
                print('copyfile-失敗')
                sys.exit(1)
    def tarfile(self):
        os.chdir(self.bdir)
        for i in [ h for h in os.listdir('./') if h.endswith('.back')]:
            aday=i.split('.')[2]#獲取文件日期
            #如果是三天前的文件那麼就打包.
            if dt.strptime(aday,"%Y-%m-%d") < dt.strptime(self.bday,"%Y-%m-%d"):
                tarf = i + '.tgz'
                cmd = 'tar -czvf %s %s'%(tarf,i)
                if os.system(cmd) == 0:
                    print('%s打包成功'%(i))
                    os.remove(i)
                else:
                   print('%s打包失敗'%(i))
                   sys.exit(1)
def main():
    #python file_tar_back.py -SF ./ -BD ./test/ -BF 1.txt 2.txt 3.txt -TD 3
    print('|-----------------------------------------------------------------------------------------------')
    print('|Usage:python back_file.py -SF ./aaa/ -BD ./bbb/ -BF wyl-1.txt wyl-2.txt  -TD 10')
    parser = argparse.ArgumentParser()
    parser.add_argument('-SF','--sdir',type=str,default='NULL',help='目標目錄')
    parser.add_argument('-BD','--bdir',type=str,default='NULL',help='備份目錄')
    parser.add_argument('-BF','--plugins',type=str,nargs='+',help='目標文件',default=['access.log'])
    parser.add_argument('-TD','--ntday',type=str,help='對ntday天前的備份文件進行打包',default='3')
    args=parser.parse_args()
    print('|Target_dir:[%s],backupdir:[%s],backupfile:%s,days[%s]'%(args.sdir,args.bdir,args.plugins,args.ntday))
    print('|-----------------------------------------------------------------------------------------------')
    ##########################################################################
    # 獲取想要的日期的時間,即前1天和3天時間
    today = datetime.datetime.now()
    # 計算偏移量,前1天和三天前
    offset = datetime.timedelta(days=-1)
    offsets = datetime.timedelta(days=-int(args.ntday))
    # 獲取想要的日期的時間,即前1天和3天時間
    re_date = (today + offset)
    re_datas = (today + offsets)
    #當前時間前1天3天
    tday=today.strftime('%Y-%m-%d')#當天
    rday=re_date.strftime('%Y-%m-%d')#1天前
    bday = re_datas.strftime('%Y-%m-%d')#三天前
    #######################################################################
    A = f_backup(args.sdir,args.bdir,args.plugins,rday,bday)
    A.cpbackfile()
    A.tarfile()

if __name__ == "__main__":
    main()

推送腳本 push_file.py 

[root@iZm5e9x1jjza2nspm04niyZ scripts]# cat push_file.py 
# -*- coding: utf-8 -*-
# flake8: noqa
#使用前先:
#pip uninstall urllib3
#pip uninstall chardet
#pip install requests
#pip install qiniu
#pip install requests

from qiniu import Auth, put_file, etag
import qiniu.config
import os
import argparse

class update_file:
    def __init__(self,bucket_name,localfile,key):
        #需要填寫你的 Access Key 和 Secret Key
        self.access_key = 'xxxxxxxx'
        self.secret_key = 'yyyyyyyy'
        #要上傳的空間
        self.bucket_name = bucket_name
        #上傳後保存的文件名key
        self.key = key
        #要上傳文件的本地路徑localfile
        self.localfile = localfile
    def upfile(self):#構建鑑權對象
        q = Auth(self.access_key, self.secret_key)
        #生成上傳 Token,可以指定過期時間等,policy指定上傳策略
        token = q.upload_token(self.bucket_name, self.key,7200)
        ret, info = put_file(token, self.key, self.localfile)
        #print('ret',ret)
        #print('info',info)
        assert ret['key'] == self.key
        assert ret['hash'] == etag(self.localfile)
        info = str(str(info).split(',')[2]).split(':')[1]
        return info
def main():
    #python push_file.py -B mint-jizhiyunwei -L 網安.rar -K test/網安.rar
    print('|--------------------------------------------------------------------------------------------')
    print('|usage1:推送單文件:python push_file.py -B mint-jizhiyunwei -L 網安.rar -K test/網安.rar')
    print('|usage2:推送目錄:python push_file.py -B mint-jizhiyunwei -L /server/scripts/ -K test/ -E .txt')
    parser = argparse.ArgumentParser()
    parser.add_argument('-B','--bucket_name',type=str,default='NULL',help='存儲桶名稱')
    parser.add_argument('-L','--localfile',type=str,default='NULL',help='本地文件路徑名稱')
    parser.add_argument('-K','--key',type=str,default='NULL',help='上傳後保存的文件路徑名稱')
    parser.add_argument('-E','--endswith',type=str,default='NULL',help='以什麼結尾')
    args = parser.parse_args()

    if 'NULL' in (args.bucket_name,args.localfile,args.key,):
        print('缺少必要參數請查看幫助:python file.py --help')
    else:
        if os.path.isdir(args.localfile):
            print('|您選用的存儲桶:%s,準備上傳的文件路徑爲:%s,上傳後的文件路徑爲:%s,上傳文件的後綴爲:%s'%(args.bucket_name,args.localfile,args.key,args.endswith))
            print('|--------------------------------------------------------------------------------------------')
            if 'NULL' != args.endswith:
                listlocalfile = [ i for i in os.listdir(args.localfile) if i.endswith(args.endswith)]
                listkey = [ args.key + i for i in listlocalfile ]
                dictpush = dict(zip(listlocalfile,listkey))
                for lfile in dictpush:

                    LBG = update_file(args.bucket_name,args.localfile+lfile,dictpush[lfile])
                    LDG = LBG.upfile()
                    print(LDG)
                    os.remove(args.localfile+lfile)
            else:
                print('當上傳資源爲路徑時,-E(--endswith)不能爲空!')
                return ""
        elif os.path.isfile(args.localfile):
            print('您選用的存儲桶:%s,準備上傳的文件:%s,上傳後的文件名:%s'%(args.bucket_name,args.localfile,args.key))
            try:
                BG = update_file(args.bucket_name,args.localfile,args.key)
                DG = BG.upfile()
                os.remove()
            except BaseException as f:
                print('上傳失敗\n%s'%(f))
                return ""
        else:
            print('上傳文件不存在')
            return ""
if __name__ == "__main__":
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章