python日志重复打印

Python日志重复打印问题

用Python的logging模块记录日志时,出现了重复输出日志的问题。这里我是把logger封装了一层:

def init_logger(log_name, file_log_level=logging.DEBUG, stream_log_level=logging.INFO,
                max_bytes=200 * 1024 * 1024, backup_count=10):
    log_dir_path = os.path.join(CONST.PROJECT_DIR, 'logs')
    if not os.path.isdir(log_dir_path):
        os.makedirs(log_dir_path)
    log_file_path = os.path.join(log_dir_path, '{}.log'.format(log_name))
    logger = logging.getLogger(log_name)

    fmt = '[%(name)s]' + '-[%(filename)s:%(lineno)s]' +  \
          '-[%(asctime)s]' + '-[%(levelname)s]' + '-[%(process)d]'  + '-[%(thread)d]' + '\t%(message)s'

    formatter = logging.Formatter(fmt)

    file_handler = handlers.RotatingFileHandler(log_file_path, maxBytes=max_bytes,
                                                backupCount=backup_count, encoding='utf-8')
    file_handler.setLevel(file_log_level)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(stream_log_level)
    stream_handler.setFormatter(formatter)
    # logger.addHandler(stream_handler)

    log_queue = Queue()
    queue_handler = handlers.QueueHandler(log_queue)
    # queue_handler.setLevel(stream_log_level)
    # queue_handler.setFormatter(formatter)
    queue_listener = handlers.QueueListener(log_queue, stream_handler)
    logger.addHandler(queue_handler)
    queue_listener.start()

    logger.setLevel(file_log_level)
    logger.propagate = False
    return logger


logger = init_logger(PROJECT_NAME)

其他地方要用到logger直接导入。

logging日志输出重复一般都是因为多次addHandler的问题,代码里调用addHandler的地方只有init_logger,那么肯定是init_logger函数重复调用了,在init_logger后面输出调用栈:

logger = init_logger(PROJECT_NAME)
traceback.print_stack()

从调用栈中看到有两处import了logger这个模块,回溯到上一层调用发现有一处:

from src.common.logger import logger

另一处:

from common.logger import logger

统一成from common.logger import logger,问题解决。

你可能感兴趣的:(杂记)