Python脚本提示缺少/缺少日志

2024-04-25 01:04:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在一个项目中检查一个文件目录,并在创建日志文件时自动添加它们。每五分钟生成一个文件,但有些文件的文件大小为“0”,我希望在发生这种情况时发出警报。在

因此,我想采取的步骤基本上是:

  • 获取时间(MM:DD:YY HH:MM:SS)*不确定是否需要执行此操作。。。在
  • CD到文件夹目录/Netflow/YY/MM/DD
  • 搜索文件名“nfcapd.YYYYMMDDHHMM“其中MM增量为5。在
  • 如果文件大小为0,请发送电子邮件给Johnny、Sally和Jimmy
  • 等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)

Tags: 文件path项目truetimeos情况storage
1条回答
网友
1楼 · 发布于 2024-04-25 01:04:56

除了枚举给定路径中的文件并随后过滤长度为零的文件之外,您可能还需要保持某种类型的状态,以确保不会多次收到同一个零长度文件的通知。也就是说,您可能不希望收到同一文件无限期为零长度的通知(尽管您可以修改下面的示例,如果您想要所述行为)。在

您可以选择执行诸如验证文件名是否严格符合命名约定之类的操作。您可能还需要验证文件名中包含的字符串日期戳是否为有效的日期时间。在

下面的示例使用glob模块(本身利用os.listdir()fnmatch.fnmatch())来构建一组可能包含的文件。[1]

该示例有意简化,并利用单个类来存储日志示例“state”。KEEP_SAMPLES样本被维护(在log_states列表中,logState()的实例,通过使用列表切片来实现。在

一个单独的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")

相关问题 更多 >