每次调用 python 中的日志记录模块时调用一个函数

Call a function everytime logging module in python is called

我想每次都调用一个函数,我使用 python 中的 logging 模块进行任何类型的日志记录。

如下所示,我不想在每个日志记录实例中调用 copyfiles,而是想看看是否有办法以某种方式甚至包装器将复制文件注入文件处理程序。

from sys import argv
import shutil
import logging
logger = logging.getLogger('')

sh = logging.StreamHandler(sys.stdout)
logfile = 'logs/log-run-{}.log'.format(date.today().strftime('%d-%m-%Y'))
fh = logging.FileHandler(logfile)

formatter = logging.Formatter('[%(asctime)s] %(levelname)s \
                            [%(filename)s.%(funcName)s:%(lineno)d] \
                            %(message)s', datefmt='%a, %d %b %Y %H:%M:%S')
logger.setLevel(logging.INFO)

sh.setFormatter(formatter)
fh.setFormatter(formatter)

logger.addHandler(sh)
logger.addHandler(fh)

LOGPATH = args[1]
def copyfiles():
    """
    Copy files to azure blob storage
    """
    fh.flush()
    shutil.copy(logfile, LOGPATH)

logging.info('test')
copyfiles()
logging.info('foobar')
copyfiles()

我尝试深入研究每次调用日志记录时调用复制文件,但我最终无处可去。

如果您想知道我为什么要从日志中复制文件,

目前我能想到的是:

  • 通过将 FileHandler 的 flush() 继承到实用程序中来覆盖它 class 类似于下面代码中显示的 FlushCopyFileHandler class。
  • 不使用 FileHandler,而是使用 FlushCopyFileHandler class 你所要做的就是调用这个覆盖的 flush()。

"""

from logging import FileHandler
from shutil

class FlushCopyFileHandler(FileHandler):
    
    # These arguments are passed along to the parent class FileHandler.
    def __init__(self, *args, **kwargs):
        super(FlushCopyFileHandler, self).__init__(filename, *args, **kwargs)
        self.copy_destination = "some default destination path"   # can also be set from args.
        
    # When this flush() is called it will call the flush() of FileHandler class.
    # After that it will call the shutil.copy() method.
    def flush(self):
        super().flush()
        shutil.copy(self.filename, self.copy_destination)
        
    # Use this to change destination path later on.
    def set_copy_path(self, destination):
        self.copy_destination = destination 

"""