如何在单个模块中设置多个文件的日志记录

时间:2019-11-14 19:17:54

标签: python logging

我有一个PyQt表单,该表单根据单击的按钮运行多个进程。所有过程都是同一模块中类的一部分。

我已经导入了带有setup_logging函数的单独模块,该函数创建了basicConfigStreamHandler属性。

我的挑战:我需要将每个过程输出到单独的日志文件。

setup_logging代码如下:

def setup_logging(main_file, log_dir='', suffix=''):
    if not log_dir:
        log_dir = __get_log_dir()

    filename = main_file.strip('./')
    head, tail = os.path.split(filename)
    base_name, extension = os.path.splitext(tail)
    if suffix:
        suffix = '_' + suffix
    log_file = base_name + suffix + time.strftime("-%Y_%m_%d-%H_%M_%S") + '.log'
    abs_log_file = os.path.join(log_dir, log_file)

    logging.basicConfig(filename=abs_log_file, level=logging.DEBUG,
                        format='%(asctime)s - %(message)s')
    root = logging.getLogger()
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    formatter = logging.Formatter('%(message)s')
    console.setFormatter(formatter)
    root.addHandler(console)
    return abs_log_file

一个示例调用如下:

def my_function(self):
    setup_logging(__file__, log_dir=logfile_path), suffix='My_Function')
    logger = logging.getLogger('My_Function')
    ... [more code]
    [need to shut down the logger here]

对于我的困境,以下情况并不令人鼓舞:

  

记录器从不直接实例化,而是始终通过模块级函数logging.getLogger(name)实例化。对具有相同名称的getLogger()的多次调用将始终返回对同一Logger对象的引用。 https://docs.python.org/2/library/logging.html

这是真的,我需要“重置”记录器实例并从新的记录器重新开始,但是我还没有找到一种可以“取消实例化”记录器并释放文件以便新实例的方法。当在同一模块中调用不同的过程时,可以初始化记录器的日志并生成新文件。如代码中所述,我试图在每个函数中使用不同的名称调用logging.get_logger(),但是setup_logging函数似乎并未创建新文件。

是否可以从一个模块中包含多个记录器文件,或者是否需要为每个进程创建单独的模块?我非常希望不必这样做...

0 个答案:

没有答案