python实现磁盘日志清理的示例
一、描述:
以module的方式组件python代码,在磁盘文件清理上复用性更好
二、达到目标:
清空过期日志文件,清理掉超过自定大小日志文件
三、原码
#!/usr/bin/envpython #-*-coding:utf-8-*- importcommands importos importtime importre importgetopt importsys #commands.getstatusoutput返回两个元素的元组tuple(status,result),status为int类型,result为string类型 defexecute_local_shell_cmd(cmd): status,result=commands.getstatusoutput(cmd) result=result.split("\n") returnstatus,result defsend_alert_mail(): pass ''' 获取某一磁盘的空间使用率 ''' defget_disk_used(disk_name): status,result=execute_local_shell_cmd("df|grep%s|awk'{print$5}'"%disk_name) returnstatus,result[0] #print(get_disk_used('/data0')) ''' 判断文件是否在指定时间内修改过 ''' deffile_modify_in(file_path,time_interval='1d'): current_time=time.time() #os.path.getmtime返回最后修改时间。返回从unix纪元开始的跳秒数 ifcurrent_time-os.path.getmtime(file_path)before_seconds_remove\ andcandidate_file.find(pattern)!=-1\ andnotprobable_current_log_file(candidate_file_fullpath): #yield就是return一个值,并且记住这个返回值的位置,下次迭代就从这个位置后开始 yieldcandidate_file_fullpath ''' 获取超过大小的日志文件(注意默认不会返回修改时间小于1天的文件) ''' defget_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) forcandidate_fileinos.listdir(target_dir): candidate_file_fullpath="%s/%s"%(target_dir,candidate_file) ifos.path.isfile(candidate_file_fullpath): #stat返回相关文件的系统状态信息 file_stat=os.stat(candidate_file_fullpath) ifcandidate_file.find(pattern)!=-1and\ file_stat.st_size>=file_size_limit_byte: yieldcandidate_file_fullpath #如果文件在modify_in之内修改过,则不返回 #ifnot(modify_inandfile_modify_in(candidate_file_fullpath,time_interval=modify_in))and\ #notprobable_current_log_file(candidate_file_fullpath): #yieldcandidate_file_fullpath ''' remove文件列表 ''' defremove_file_list(file_list,pattern='log',roll_back=False): forfile_iteminfile_list: ifroll_backorprobable_current_log_file(file_item,pattern=pattern,modify_in='1d'): print('rollbackfile%s'%file_item) execute_local_shell_cmd("cat/dev/null>{0}".format(file_item)) else: print('removefile%s'%file_item) #os.remove删除指定路径文件。如果指定的路径是一个目录,将抛出OSError os.remove(file_item) ''' 清理掉超过日期的日志文件 ''' defremove_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) ''' 清理掉超过大小的日志文件 ''' defremove_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}方式 ''' defclean_curren_log_file(target_dir,file_size_limit='10g',pattern='log'): forcandidate_fileinos.listdir(target_dir): candidate_file_fullpath='%s/%s'%(target_dir,candidate_file) ifcandidate_file.endswith(pattern)andos.path.isfile(candidate_file_fullpath): file_stat=os.stat(candidate_file_fullpath) iffile_stat.st_size>=translate_file_size_to_kb(file_size_limit): remove_file_list([candidate_file_fullpath],roll_back=True) defclean_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('Steponeremovefiles{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('%','')) ifcurrent_disk_used>int(disk_used_limit): print("Disk{0}'scurrentused{1}%greatthaninputusedlimit{2}%," "sowewillremovefilesbiggerthan{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('%','')) ifcurrent_disk_used>int(disk_used_limit): print("Disk{0}'scurrentused{1}%greatthaninputusedlimit{2}%," "sowewillrollbackcurrentlogfile". 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) #如果还是没有,alertmail ifint(get_disk_used(disk_name)[1].replace('%',''))>int(disk_used_limit): send_alert_mail() defusage(): print('clean.py-d -r ' '-f -p ' '-t ') 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模块函数异常错误,捕获异常并打印错误 exceptgetopt.GetoptErroraserr: printerr usage() sys.exit(2) iflen(opts)<6: usage() sys.exit(2) foropt,arginopts: ifopt=='-h': usage() sys.exit() elifoptin("-d","--disk"): target_disk_input=arg.replace('/','') elifoptin("-r","--directory"): target_dir_input=arg elifoptin("-u","--diskUsedLimit"): disk_used_limit_input=arg elifoptin("-f","--fileSizeLimit"): file_size_limit_input=arg translate_file_size_to_kb(file_size_limit_input) elifoptin("-p","filePattern"): pattern_input=arg elifoptin("-t","--beforeDaysRemove"): before_days_remove_input=arg translate_time_interval_to_second(before_days_remove_input) print("{0}Startcleanjob.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/envpython #-*-coding:utf-8-*- importos #遍历目录 defLisdir(targetdir): list_dirs=os.walk(targetdir) forroot,list_dirs,filesinlist_dirs: fordinlist_dirs: yieldos.path.join(root,d) deflog_dir(targetdir): list_dirs=os.listdir(targetdir) forphinlist_dirs: ifos.path.isdir(os.path.join(targetdir,ph)): yieldLisdir(os.path.join(targetdir,ph)) forpathinlog_dir('/data0/backup_log-bin'): forpppinpath: #以log-bin结尾为假 ifppp.endswith('log-bin')isFalse: os.system("db_script/clean_robo.py-d/data0-r{0}-u75%-f501M-pbin-t5d".format(ppp))
以上就是python实现磁盘日志清理的示例的详细内容,更多关于python磁盘日志清理的资料请关注毛票票其它相关文章!