Python:多个记录器将日志写入类似的文件

时间:2013-12-28 06:56:54

标签: python logging

根据要求,我需要为所有输入生成单独的日志文件,这将转到单独的目录。代码如下 -

def setup_logger(logger_name, log_filename):
    import logging
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)
    file_handler = logging.FileHandler(log_filename, 'w')
    formatter = logging.Formatter(_FORMAT)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    return logger

在处理输入之前将调用此函数 -

logger = None

def foo(input_string):
    global logger
    logger = setup_logger('app', '/opt/data/'+input_string+'.log')

    # do processing and dumping into logs
    # this function will call one recursive function to process data
    logger = None # destroying logger object

if __name__ == "__main__":
    import sys

    for inp in sys.argv[1:]:
        foo(inp)

现在我的问题是 - 在一个日志文件中,有预期的input_string的日志,但随之而来的是其他input_strings的日志 - 最后附加。 这些日志也会出现在他们的日志文件中。

对这个奇怪的问题有什么想法?

1 个答案:

答案 0 :(得分:3)

logger = logging.getLogger(logger_name)调用将始终为给定的Logger返回相同的logger_name对象。这里发生的事情是,每次拨打FileHandler时,您都会向“app”记录器添加一个setup_logger

首先尝试并删除所有处理程序,例如:

def setup_logger(logger_name, log_filename):
    import logging
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)
    file_handler = logging.FileHandler(log_filename, 'w')
    formatter = logging.Formatter(_FORMAT)
    file_handler.setFormatter(formatter)

    # Replace the previous handlers with the new FileHandler
    for old_handler in logger.handlers:
        logger.removeHandler(old_handler)
    logger.addHandler(file_handler)

    return logger