日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python實現磁盤日志清理的示例

瀏覽:30日期:2022-07-06 11:40:41

一、描述:

以module的方式組件python代碼,在磁盤文件清理上復用性更好

二、達到目標:

清空過期日志文件,清理掉超過自定大小日志文件

三、原碼

#!/usr/bin/env python# -*- coding: utf-8 -*- import commandsimport osimport timeimport reimport getoptimport sys # commands.getstatusoutput 返回兩個元素的元組tuple(status, result),status為int類型,result為string類型def execute_local_shell_cmd(cmd): status, result = commands.getstatusoutput(cmd) result = result.split('n') return status, result def send_alert_mail(): pass ’’’獲取某一磁盤的空間使用率’’’def get_disk_used(disk_name): status, result = execute_local_shell_cmd('df | grep %s | awk ’{print $5}’' % disk_name) return status, result[0] #print(get_disk_used(’/data0’)) ’’’判斷文件是否在指定時間內修改過’’’ def file_modify_in(file_path,time_interval=’1d’): current_time = time.time() # os.path.getmtime 返回最后修改時間。返回從unix紀元開始的跳秒數 if current_time - os.path.getmtime(file_path) < translate_time_interval_to_second(time_interval): return True return False def translate_file_size_to_kb(file_size): # 將字符串所有大寫字符轉為小寫 file_size = str(file_size.lower()) # 創建匹配數字1次或多次的數字且小數點出現一次或者不出現的;小數點后數字重復0次或多次模式對象 pattern = re.compile(r’d+.?d*’) match = pattern.match(file_size) file_size_number = None if match: # 使用Match獲得分組信息 #print(match.group()) file_size_number = float(match.group()) else: raise IOError('Input {0} can’t translate to byte.' 'Current support g(gb)/m(mb)/k(kb)/b(byte)'.format(file_size)) # endswith() 方法用于判斷字符串是否以指定后綴結尾,如果以指定后綴結尾返回True,否則返回False。 # 可選參數'start'與'end'為檢索字符串的開始與結束位置。 if file_size.endswith('g') or file_size.endswith('gb'): return file_size_number * 1024 * 1024 * 1024 elif file_size.endswith('m') or file_size.endswith('mb'): return file_size_number * 1024 * 1024 elif file_size.endswith('k') or file_size.endswith('kb'): return file_size_number * 1024 elif file_size.endswith('b') or file_size.endswith('byte'): return file_size_number else: raise IOError('Input {0} can’t translate to byte.' 'Current support g(gb)/m(mb)/k(kb)/b(byte)'.format(file_size))#print(translate_file_size_to_kb(’10g’)) def translate_time_interval_to_second(time_interval): date_interval = str(time_interval.lower()) pattern = re.compile(r’d+’) match = pattern.match(date_interval) date_interval_number = None if match: date_interval_number = int(match.group()) else: raise IOError('Input {0} can’t translate to second.' 'Current support d(day)/h(hour)/m(min)/s(sec)'.format(date_interval)) if date_interval.endswith(’d’) or date_interval.endswith(’day’): return date_interval_number * 24 * 3600 elif date_interval.endswith(’h’) or date_interval.endswith(’hour’): return date_interval_number * 3600 elif date_interval.endswith(’m’) or date_interval.endswith(’min’): return date_interval_number * 60 elif date_interval.endswith(’s’) or date_interval.endswith(’sec’): return date_interval_number else: raise IOError('Input {0} cant’t translate to second.' 'Current support d(day)/h(hour)/m(min)/s(second)'.format(date_interval)) #print(translate_time_interval_to_second(’7d’))’’’關斷文件是否可能是當前log文件1) 修改改時間1天內2) 以pattern結尾’’’def probable_current_log_file(file_path,pattern=’log’,modify_in=’1d’): if file_modify_in(file_path,time_interval=modify_in): return True return str(file_path).endswith(pattern) ’’’獲取超過天數設置log,注意不會返回可能是當前正在修改的文件,查看probable_current_log_file確定如何做該判斷’’’def get_clean_log_list_by_date(target_dir,before_days_remove=’7d’,pattern='log'): before_seconds_remove = translate_time_interval_to_second(before_days_remove) current_time = time.time() # os.listdir 返回指定文件夾包含文件或文件夾的名字列表 for candidate_file in os.listdir(target_dir): candidate_file_fullpath = '%s/%s' %(target_dir,candidate_file) # 是否存在一個普通文件 if os.path.isfile(candidate_file_fullpath): candidate_file_mtime = os.path.getmtime(candidate_file_fullpath) # find()根據是否包含字符串,如果包含有,返回開始的索引值,否則返回-1 if current_time - candidate_file_mtime > before_seconds_remove and candidate_file.find(pattern) != -1 and not probable_current_log_file(candidate_file_fullpath):# yield 就是return一個值,并且記住這個返回值的位置,下次迭代就從這個位置后開始yield candidate_file_fullpath ’’’獲取超過大小的日志文件(注意默認不會返回修改時間小于1天的文件)’’’def get_clean_log_list_by_size(target_dir,file_size_limit=’10g’,pattern='log'): file_size_limit_byte = translate_file_size_to_kb(file_size_limit) for candidate_file in os.listdir(target_dir): candidate_file_fullpath = '%s/%s' %(target_dir,candidate_file) if os.path.isfile(candidate_file_fullpath): # stat返回相關文件的系統狀態信息 file_stat = os.stat(candidate_file_fullpath) if candidate_file.find(pattern) != -1 and file_stat.st_size >= file_size_limit_byte:yield candidate_file_fullpath # 如果文件在modify_in之內修改過,則不返回 # if not (modify_in and file_modify_in(candidate_file_fullpath, time_interval=modify_in)) and # not probable_current_log_file(candidate_file_fullpath): # yield candidate_file_fullpath ’’’remove文件列表’’’def remove_file_list(file_list,pattern=’log’,roll_back=False): for file_item in file_list: if roll_back or probable_current_log_file(file_item,pattern=pattern,modify_in=’1d’): print(’roll back file %s’ % file_item) execute_local_shell_cmd('cat /dev/null > {0}'.format(file_item)) else: print(’remove file %s’ % file_item) # os.remove 刪除指定路徑文件。如果指定的路徑是一個目錄,將拋出OSError os.remove(file_item) ’’’清理掉超過日期的日志文件’’’def remove_files_by_date(target_dir,before_days_remove=’7d’,pattern=’log’): file_list = get_clean_log_list_by_date(target_dir,before_days_remove,pattern) remove_file_list(file_list) ’’’清理掉超過大小的日志文件’’’def remove_files_by_size(target_dir,file_size_limit=’10g’,pattern=’log’): file_list = get_clean_log_list_by_size(target_dir,file_size_limit,pattern) remove_file_list(file_list) ’’’清空當前的日志文件,使用cat /dev/null > {log_file}方式’’’ def clean_curren_log_file(target_dir,file_size_limit=’10g’,pattern=’log’): for candidate_file in os.listdir(target_dir): candidate_file_fullpath = ’%s/%s’ % (target_dir,candidate_file) if candidate_file.endswith(pattern) and os.path.isfile(candidate_file_fullpath): file_stat = os.stat(candidate_file_fullpath) if file_stat.st_size >= translate_file_size_to_kb(file_size_limit):remove_file_list([candidate_file_fullpath],roll_back=True) def clean_data_release_disk(disk_name, target_dir, disk_used_limit=’80%’, before_days_remove=’7d’, file_size_limit=’10g’, pattern=’log’): disk_used_limit = disk_used_limit.replace(’%’, ’’) # 第一步執行按時間的日志清理 print(’Step one remove files {0} ago.’.format(before_days_remove)) remove_files_by_date(target_dir, before_days_remove=before_days_remove, pattern=pattern) # 如果磁盤空間還是沒有充分釋放,則執行按大小的日志清理 current_disk_used = int(get_disk_used(disk_name)[1].replace(’%’, ’’)) if current_disk_used > int(disk_used_limit): print('Disk {0}’s current used {1}% great than input used limit {2}%,' 'so we will remove files bigger than {3}'. format(disk_name, current_disk_used, disk_used_limit, file_size_limit)) remove_files_by_size(target_dir, file_size_limit=file_size_limit, pattern=pattern) # 如果磁盤空間開沒有釋放,清空當前正在寫的log文件,并alert current_disk_used = int(get_disk_used(disk_name)[1].replace(’%’, ’’)) if current_disk_used > int(disk_used_limit): print('Disk {0}’s current used {1}% great than input used limit {2}%,' 'so we will roll back current log file'. format(disk_name, current_disk_used, disk_used_limit, file_size_limit)) clean_curren_log_file(target_dir, file_size_limit=file_size_limit, pattern=pattern) # 如果還是沒有,alert mail if int(get_disk_used(disk_name)[1].replace(’%’, ’’)) > int(disk_used_limit): send_alert_mail() def usage(): print(’clean.py -d <target_disk> -r <target_dirctory -u <diskUsedLimit(default 80%)> ’ ’-f <fileSizeLimit(default 10gb,gb/mb/kb)> -p <filePattern(default log)> ’ ’-t <beforeDaysRemove(default 7d,d)> ’)if __name__ == '__main__': target_disk_input = ’/data0’ target_dir_input = ’/data0/hadoop2/logs’ disk_used_limit_input = ’80%’ file_size_limit_input = ’10g’ pattern_input = ’log’ before_days_remove_input = ’7d’ try: # getopt 命令解析,有短選項和長選項 # getopt 返回兩人個參數:一個對應參數選項和value元組,另一個一般為空 opts,args = getopt.getopt(sys.argv[1:], ’hd:r:u:f:p:t:’, [’help’ ’disk=’, ’directory=’, ’diskUsedLimit=’, ’fileSizeLimit=’, ’filePattern=’, ’beforeDaysRemove=’]) # getopt模塊函數異常錯誤,捕獲異常并打印錯誤 except getopt.GetoptError as err: print err usage() sys.exit(2) if len(opts) < 6: usage() sys.exit(2) for opt,arg in opts: if opt == ’-h’: usage() sys.exit() elif opt in ('-d','--disk'): target_disk_input = arg.replace(’/’,’’) elif opt in ('-r','--directory'): target_dir_input = arg elif opt in ('-u','--diskUsedLimit'): disk_used_limit_input = arg elif opt in ('-f','--fileSizeLimit'): file_size_limit_input = arg translate_file_size_to_kb(file_size_limit_input) elif opt in ('-p','filePattern'): pattern_input = arg elif opt in ('-t','--beforeDaysRemove'): before_days_remove_input = arg translate_time_interval_to_second(before_days_remove_input) print ('{0} Start clean job.target_disk:{1},target_directory:{2},disk_used_limit:{3},' 'file_size_limit:{4},pattern:{5},before_days_remove:{6}'.format(time.ctime(time.time()), target_disk_input, target_dir_input, disk_used_limit_input, file_size_limit_input, pattern_input, before_days_remove_input)) clean_data_release_disk(target_disk_input, target_dir_input, disk_used_limit=disk_used_limit_input, file_size_limit=file_size_limit_input, pattern=pattern_input, before_days_remove=before_days_remove_input)

四、統一調用目錄定時刪除

#!/usr/bin/env python# -*- coding: utf-8 -*-import os # 遍歷目錄def Lisdir(targetdir): list_dirs = os.walk(targetdir) for root,list_dirs,files in list_dirs: for d in list_dirs: yield os.path.join(root,d) def log_dir(targetdir): list_dirs = os.listdir(targetdir) for ph in list_dirs: if os.path.isdir(os.path.join(targetdir,ph)): yield Lisdir(os.path.join(targetdir,ph))for path in log_dir(’/data0/backup_log-bin’): for ppp in path: # 以log-bin結尾 為假 if ppp.endswith(’log-bin’) is False: os.system('db_script/clean_robo.py -d /data0 -r {0} -u 75% -f 501M -p bin -t 5d'.format(ppp))

以上就是python實現磁盤日志清理的示例的詳細內容,更多關于python 磁盤日志清理的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲资源在线| 亚洲午夜视频| 美女网站久久| 国产一区二区高清| 亚洲一区久久| 亚洲视频二区| 日韩av网站免费在线| 91成人精品在线| 亚州精品视频| 日本强好片久久久久久aaa| 国产伦一区二区三区| 亚洲91精品| 免费观看在线综合| 亚洲精品少妇| 国产成人久久精品麻豆二区 | 日韩精品一区二区三区免费观影| 午夜一级在线看亚洲| 中文日韩在线| 在线观看视频免费一区二区三区| 亚洲精品看片| 日韩美女国产精品| 欧美一区成人| 精品视频高潮| 成人看片网站| 国产午夜精品一区二区三区欧美| 亚洲美女久久| 久久精品午夜| 久久国产中文字幕| 色欧美自拍视频| 亚洲国产专区校园欧美| 丝袜亚洲精品中文字幕一区| 亚洲久久一区| 精品视频高潮| 欧美午夜不卡| 日韩国产欧美在线视频| 欧美激情一区| 日韩另类视频| 综合干狼人综合首页| 欧美天堂在线| 特黄毛片在线观看| 亚洲一区二区成人| 91精品国产自产观看在线 | 成年男女免费视频网站不卡| 亚洲精品a级片| 亚洲免费专区| 日韩欧美字幕| 天堂va欧美ⅴa亚洲va一国产| 国产麻豆一区二区三区| 日韩久久精品网| 亚洲精品动态| 91综合视频| 一区二区不卡| 国产成人久久精品麻豆二区| 日韩一区二区免费看| 国产精品美女在线观看直播 | 激情国产在线| 青青青国产精品| 亚洲www啪成人一区二区| 日韩毛片网站| 欧美午夜精彩| 欧美1区2区3| japanese国产精品| 久久a爱视频| 丝袜脚交一区二区| 激情视频网站在线播放色| 婷婷久久免费视频| 国产在线|日韩| 欧美日韩一区二区三区不卡视频 | 欧美一区成人| 国产一区二区三区自拍| 国产日韩欧美一区在线| 日韩在线不卡| 国产欧美日韩视频在线| 亚洲精品91| 久久久久久婷| 日本午夜精品久久久| 欧美aa国产视频| 欧美精品二区| 亚洲精品进入| 国产视频亚洲| av最新在线| 国产欧美自拍| 亚洲日本国产| 午夜久久免费观看| 成人日韩av| 欧美日一区二区在线观看| 免费视频亚洲| 激情久久99| 日本欧美大码aⅴ在线播放| 亚洲精品2区| 日韩久久精品| 激情不卡一区二区三区视频在线| 日韩激情啪啪| 在线一区欧美| 成人看片网站| 超碰成人av| 欧美精品导航| 欧美一区二区三区免费看| 在线一区二区三区视频| 最新亚洲激情| 久久要要av| 老牛国内精品亚洲成av人片| 青青国产精品| 奇米亚洲欧美| 亚洲欧美在线综合| 免费久久99精品国产| 宅男在线一区| 天堂日韩电影| 日韩欧美国产精品综合嫩v| 麻豆国产91在线播放| 国产午夜一区| 欧美亚洲一区二区三区| 日本不卡高清| 日本成人精品| 亚洲福利一区| 成人福利视频| 老司机精品视频在线播放| 91亚洲无吗| 综合干狼人综合首页| 免费观看不卡av| 一区在线免费| 一二三区精品| 亚洲图片久久| 青青草精品视频| 欧美片第1页综合| 久久国产精品免费精品3p| 国产精品啊v在线| 999国产精品| 日韩在线一区二区| 精品国产aⅴ| 久久精品中文| 亚洲夜间福利| 三级一区在线视频先锋| 日本中文字幕一区二区视频| 国产精品国产一区| 激情久久中文字幕| 蜜臀av国产精品久久久久| 精品国产三区在线| 久久av综合| 欧美一区二区三区高清视频| 国产精品久久久久久久免费软件| 视频一区二区三区入口| 国产精品人人爽人人做我的可爱| 欧美91在线| 午夜欧美精品久久久久久久| 日本在线不卡视频| 欧美精品一区二区三区精品| 欧美日韩精品免费观看视完整| 日韩精品欧美| 国产在线不卡| 视频一区国产视频| 97久久超碰| 99视频一区| 亚洲精品麻豆| 国产乱子精品一区二区在线观看 | 日韩精品视频网站| 高清日韩欧美| 久久夜色精品| 国产欧美日韩一区二区三区在线| 99精品电影| 国产精品高清一区二区| 午夜宅男久久久| 中文在线а√天堂 | 免费视频久久| 91精品美女| 在线视频观看日韩| 久久激情婷婷| 日本久久综合| 国产精品视频一区视频二区| 99精品国产一区二区三区| 久久久国产精品网站| 日韩中文字幕无砖| 蜜桃视频欧美| 亚洲国内欧美| 国产精品一区二区中文字幕| 日韩二区三区在线观看| 国产精品一二| 免费久久久久久久久| 亚洲人成网77777色在线播放| 国产在线观看91一区二区三区| 亚洲视频二区| 国产精品普通话对白| 欧美一区二区三区高清视频| 久久久久伊人| 欧美激情五月| 国产精品一区二区三区四区在线观看 | 福利一区二区免费视频| 亚洲成av人片一区二区密柚| 蜜桃伊人久久| 精品深夜福利视频| 欧美亚洲精品在线| 免费看的黄色欧美网站| 国产91一区| 亚洲婷婷在线| 国产精品女主播一区二区三区| 午夜在线精品偷拍| 日韩欧美中文字幕一区二区三区 | 日韩精选在线| 午夜在线一区| 欧美激情99|