亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python實(shí)現(xiàn)磁盤日志清理的示例

 更新時(shí)間:2020年11月05日 11:42:32   作者:py3study  
這篇文章主要介紹了python實(shí)現(xiàn)磁盤日志清理的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

一、描述:

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

二、達(dá)到目標(biāo):

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

三、原碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import commands
import os
import time
import re
import getopt
import sys
 
# commands.getstatusoutput 返回兩個(gè)元素的元組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'))
 
 
'''
判斷文件是否在指定時(shí)間內(nèi)修改過
'''
 
def file_modify_in(file_path,time_interval='1d'):
  current_time = time.time()
  # os.path.getmtime 返回最后修改時(shí)間。返回從unix紀(jì)元開始的跳秒數(shù)
  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):
  # 將字符串所有大寫字符轉(zhuǎn)為小寫
  file_size = str(file_size.lower())
  # 創(chuàng)建匹配數(shù)字1次或多次的數(shù)字且小數(shù)點(diǎn)出現(xiàn)一次或者不出現(xiàn)的;小數(shù)點(diǎn)后數(shù)字重復(fù)0次或多次模式對(duì)象
  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() 方法用于判斷字符串是否以指定后綴結(jié)尾,如果以指定后綴結(jié)尾返回True,否則返回False。
  # 可選參數(shù)"start"與"end"為檢索字符串的開始與結(jié)束位置。
  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'))
'''
關(guān)斷文件是否可能是當(dāng)前l(fā)og文件
1) 修改改時(shí)間1天內(nèi)
2) 以pattern結(jié)尾
'''
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)
 
'''
獲取超過天數(shù)設(shè)置log,注意不會(huì)返回可能是當(dāng)前正在修改的文件,查看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)
    # 是否存在一個(gè)普通文件
    if os.path.isfile(candidate_file_fullpath):
      candidate_file_mtime = os.path.getmtime(candidate_file_fullpath)
 
      # find\(\)根據(jù)是否包含字符串,如果包含有,返回開始的索引值,否則返回-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一個(gè)值,并且記住這個(gè)返回值的位置,下次迭代就從這個(gè)位置后開始
        yield candidate_file_fullpath
 
'''
獲取超過大小的日志文件(注意默認(rèn)不會(huì)返回修改時(shí)間小于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返回相關(guān)文件的系統(tǒng)狀態(tài)信息
      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之內(nèi)修改過,則不返回
      # 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 刪除指定路徑文件。如果指定的路徑是一個(gè)目錄,將拋出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)
 
'''
清空當(dāng)前的日志文件,使用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('%', '')
  # 第一步執(zhí)行按時(shí)間的日志清理
  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)
 
  # 如果磁盤空間還是沒有充分釋放,則執(zhí)行按大小的日志清理
  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)
 
  # 如果磁盤空間開沒有釋放,清空當(dāng)前正在寫的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 命令解析,有短選項(xiàng)和長(zhǎng)選項(xiàng)
    # getopt 返回兩人個(gè)參數(shù):一個(gè)對(duì)應(yīng)參數(shù)選項(xiàng)和value元組,另一個(gè)一般為空
    opts,args = getopt.getopt(sys.argv[1:], 'hd:r:u:f:p:t:', ['help' 'disk=', 'directory=',
                                  'diskUsedLimit=', 'fileSizeLimit=',
                                  'filePattern=', 'beforeDaysRemove='])
  # getopt模塊函數(shù)異常錯(cuò)誤,捕獲異常并打印錯(cuò)誤
  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)

四、統(tǒng)一調(diào)用目錄定時(shí)刪除

#!/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結(jié)尾 為假
    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實(shí)現(xiàn)磁盤日志清理的示例的詳細(xì)內(nèi)容,更多關(guān)于python 磁盤日志清理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • django聯(lián)系人登錄界面案例詳解

    django聯(lián)系人登錄界面案例詳解

    在本案例中,將介紹如何使用Django框架創(chuàng)建一個(gè)簡(jiǎn)單的聯(lián)系人登錄界面,案例涉及前端HTML頁(yè)面設(shè)計(jì),CSS和JS的應(yīng)用,以及后端views.py的編寫,在后端處理中,密碼將通過MD5進(jìn)行加密,保證安全性,本文給大家介紹了django聯(lián)系人登錄界面案例詳解,感興趣的朋友一起看看吧
    2024-10-10
  • python使用 HTMLTestRunner.py生成測(cè)試報(bào)告

    python使用 HTMLTestRunner.py生成測(cè)試報(bào)告

    這篇文章主要介紹了python使用 HTMLTestRunner.py生成測(cè)試報(bào)告 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Python 實(shí)現(xiàn)字符串中指定位置插入一個(gè)字符

    Python 實(shí)現(xiàn)字符串中指定位置插入一個(gè)字符

    下面小編就為大家分享一篇Python 實(shí)現(xiàn)字符串中指定位置插入一個(gè)字符,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-05-05
  • Python如何配置環(huán)境變量詳解

    Python如何配置環(huán)境變量詳解

    今天帶大家學(xué)習(xí)python如何配置環(huán)境變量,文中有非常詳細(xì)的步驟,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器

    Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)定時(shí)精度可調(diào)節(jié)的定時(shí)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分

    Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分

    這篇文章主要介紹了Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分,下文我們介紹一些下面是加載內(nèi)置訓(xùn)練數(shù)據(jù)集的常見操作,需要的小伙伴可以參考一下
    2022-02-02
  • Python字節(jié)單位轉(zhuǎn)換(將字節(jié)轉(zhuǎn)換為K M G T)

    Python字節(jié)單位轉(zhuǎn)換(將字節(jié)轉(zhuǎn)換為K M G T)

    這篇文章主要介紹了Python字節(jié)單位轉(zhuǎn)換(將字節(jié)轉(zhuǎn)換為K M G T),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python3.9最新版下載與安裝圖文教程詳解(Windows系統(tǒng)為例)

    Python3.9最新版下載與安裝圖文教程詳解(Windows系統(tǒng)為例)

    這篇文章主要介紹了Python3.9最新版下載與安裝圖文教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python卸載模塊的方法匯總

    Python卸載模塊的方法匯總

    本文給大家匯總介紹了3種卸載Python已安裝模塊的方法,推薦大家使用easy_install或者pip的方式來(lái)進(jìn)行,簡(jiǎn)單方便
    2016-06-06
  • 基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法

    基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法

    今天小編就為大家分享一篇基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-07-07

最新評(píng)論