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磁盘日志清理的资料请关注毛票票其它相关文章!