Python日志记录:从主模块

时间:2018-06-12 19:33:55

标签: python python-2.7 logging

我能从主模块为记录器提供文件名吗?

我正在使用以下方式,但它不起作用。所有日志都转到 xyz.log 文件而不是 main.log

根据nosklo的建议更新

logger.py

formatter = logging.Formatter(fmt='[%(asctime)s] - {%(filename)s:%(lineno)d} %(levelname)s - %(message)s')


def _get_file_handler(file_name="xyz.log"):
    file_handler = logging.FileHandler(file_name)
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(formatter)
    return file_handler


def get_logger(name):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    logger.addHandler(_get_file_handler())
    return logger

parser.py

log = logger.get_logger(__name__)


def parse():
    log.info("is there anyway this could go to main.log and xyz.log")

main.py

log = logger.get_logger(__name__)
if __name__ == '__main__':

    for handler in log.handlers:
        if isinstance(handler, logging.FileHandler):
            log.removeHandler(handler)
            log.addHandler(logger._get_file_handler())

    log.info("is there anyway this could go to main.log and xyz.log?")
    parser.parse()

我可以通过main.py模块设置日志文件名而不是logger.py模块吗?

2 个答案:

答案 0 :(得分:1)

您首先调用get_logger(),因此当您在FileName.file_name = "main.log"中设置class属性时,get_logger函数已经完成,并且已经定义了记录器以写入{{1} }};稍后更改变量将不再更改记录器,因为它已经定义。

要更改以前选择的文件,您必须检索记录器,删除以前的处理程序并添加新的文件处理程序。另一个选项是在调用xyz.log之前设置变量,因此当您调用它时,变量已经具有正确的值。

答案 1 :(得分:0)

日志记录实例可以有多个文件处理程序。使用这样的函数只添加另一个处理程序以及您想要的其他输出路径。日志消息将发送到添加到实例的两个(或所有)文本日志。您甚至可以将处理程序配置为具有不同的日志记录级别,以便您可以将消息过滤到不同的日志中以查找严重错误,信息消息等。

import logging
def add_handler(output_log_path, log):
    # Set up text logger and add it to logging instance
    file_logger = logging.FileHandler(output_log_path)
    file_logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s | logger name: %(name)s | module: %(module)s | lineno: %(lineno)d | %(message)s')
    file_logger.setFormatter(formatter)
    log.addHandler(file_logger)
    return log