2014-09-16 5 views
0

Я работаю над проектом, чтобы проверить каталог файлов и автоматически добавлять файлы журналов по мере их создания. Файл создается каждые пять минут, но некоторые файлы создаются с размером файла «0», и я хотел бы предупредить, когда это произойдет.Python скрипт для предупреждения о пустых/отсутствующих журналах

Таким образом, последовательность шагов, которые я хотел бы иметь, по существу:

  • Получить время (MM: DD: YY HH: MM: SS) * Не уверен, что если мне нужно сделать это ...
  • CD в папку Каталог/Netflow/YY/MM/DD
  • Поиск имени файла "nfcapd.YYYYMMDDHHMM", где с шагом ММ на 5.
  • Если размер файла равен 0, то по электронной почте Джонни, Салли и Джимми
  • Wait 6 минут и повторение

Это то, что я собрал вместе до сих пор. Как я могу получить желаемую функциональность?

import os 
def is_non_zero_file(fpath): storage/Netflow/ 
return True if os.path.isfile(fpath) and os.path.getsize(fpath) > 0 else False 

# I need to check storage/Netflow for files named by time e.g 13_56_05.txt 

while True: 
time.sleep(360) 
+0

'os.listdir()' является вашим другом, как это 'модуль stat' – user2085282

+0

Я думаю, что я имею больше трудностей выясняя, как искать имя файла в зависимости от времени. –

+0

'os.listdir()' дает вам список всех имен файлов, 'x in y' сообщает вам, есть ли строка x в строке y. Получите список имен и строковое представление времени. Прочтите документацию для модуля 'time' для этого последнего. Этого должно быть достаточно. – user2085282

ответ

1

В дополнение к перечислении файлов в указанном пути, а затем фильтровать файлы, которые только нулевой длины, вы, вероятно, хотите сохранить некоторый тип государства, чтобы обеспечить вы не уведомляются несколько раз того же файла нулевой длины. То есть вы, вероятно, не хотите получать уведомление о том, что один и тот же файл имеет длину до бесконечности (хотя вы можете изменить приведенный ниже пример, если хотите это поведение).

Возможно, вы захотите сделать что-то вроде проверки того, что имя файла строго соответствует вашему соглашению об именах. Вы также можете подтвердить, что строковая метка даты, включенная в имя файла, является допустимым дата-временем.

В приведенном ниже примере используется модуль glob (сам по себе использует os.listdir() и fnmatch.fnmatch()) для создания набора возможных файлов для включения. [1]

Пример преднамеренно прост и использует один класс для хранения журнала «состояние». KEEP_SAMPLES образцов сохраняются (экземпляры logState() в log_states списке, достигаются с помощью списка нарезки

Одна alert(msg) функции поставляются в виде заглушки на то, что может отправить почту, и т.д ...

Ссылки:.

[1] https://docs.python.org/3.2/library/glob.html

#!/usr/bin/python3 

import os 
import glob 
import re 
from datetime import datetime, timezone 
import time 
from pprint import pprint 

class logState(): 

    def __init__(self, log_path, glob_patt, re_patt, dt_fmt): 

     self.dt = datetime.now(timezone.utc) 
     self.log_path = log_path 
     self.glob_patt = glob_patt 
     self.re_patt = re_patt 
     self.dt_fmt = dt_fmt 
     self.empty_logs = [] 
     self.nonempty_logs = [] 

     # Retrieve only files from glob 
     self.files = [ f for f in 
       glob.glob(self.log_path + self.glob_patt) 
       if os.path.isfile(f) ] 

     for f in self.files: 

      unq_fname = f.split('/')[-1] 

      if unq_fname == None: 
       continue 

      # Tighter pattern matching 
      if re.match(re_patt, unq_fname) == None: 
       continue 

      # Get the datetime portion of the file name 
      f_dtstamp = unq_fname.split('.')[-1] 

      # Make sure the datetime stamp represents 
      # a valid date 
      if datetime.strptime(f_dtstamp, self.dt_fmt) == None: 
       continue 

      # Check file size, add to the appropriate 
      # list 
      if os.path.getsize(f) <= 0: 
       self.empty_logs.append(f) 
      else: 
       self.nonempty_logs.append(f) 

def alert(msg): 
    print("ALERT!: {0}".format(msg)) 

if __name__ == "__main__": 

    # How long to sleep 
    SLEEP_SECS = 5 

    # How many samples to keep 
    KEEP_SAMPLES = 5 

    log_states = [] 

    # Definition for what logs states we'll look for 
    log_path = './' 
    glob_patt = 'nfcapd.[0-9]*' 
    re_patt = 'nfcapd.([0-9]{12})' 
    dt_fmt = "%Y%m%d%H%M" 

    print("-- Setup --") 
    print("Sample files in '{0}'".format(log_path)) 
    print("\t{0} samples kept:".format(KEEP_SAMPLES)) 
    print("\tglob pattern: '{0}'".format(glob_patt)) 
    print("\tregex pattern: '{0}'".format(re_patt)) 
    print("\tdatetime string: '{0}'".format(dt_fmt)) 
    print("") 

    # Collect the initial state 
    log_states.append(logState(log_path, 
           glob_patt, 
           re_patt, dt_fmt)) 

    while True: 

     # Print state inventory and current state detail 
     print("-- Log States Stored --") 
     for i, log_state in enumerate(log_states): 
      print("Log state {0} @ {1}".format(i, log_state.dt)) 

     print(" -- Logs size > 0 --") 
     pprint(log_states[-1].nonempty_logs) 
     print(" -- Logs size <= 0 --") 
     pprint(log_states[-1].empty_logs) 
     print("") 

     time.sleep(SLEEP_SECS) 
     log_states = log_states[-KEEP_SAMPLES+1:] 

     log_states.append(logState(log_path, 
            glob_patt, 
            re_patt, 
            dt_fmt)) 

     # p = previous sample, c = current 
     p = set(log_states[-2].empty_logs) 
     c = set(log_states[-1].empty_logs) 

     # only report the items in the current sample 
     # not in the last 
     if len(c.difference(p)) > 0: 
      alert("\nNew zero length logs: " + str(c.difference(p)) + "\n") 
+0

ничего себе ... мне понадобится время, чтобы пробиться через это. Я действительно ценю это. Я бы поднял голову, если бы мог. Большое спасибо! –