python日志记录:将格式化程序动态设置为记录器名称

时间:2021-03-13 03:30:58

标签: logging python-3.7

我有三个记录器,用于三种不同的格式,但所有记录器都将使用相同的旋转文件处理程序。

from logging.handlers import RotatingFileHandler
def create_handler(filename):
    handler = RotatingFileHandler(filename, mode='a', maxBytes=10000, backupCount=100, encoding='utf-8', delay=0)
    handler.setLevel(logging.INFO)
    return handler


def get_logger1(handler):
    logger = logging.getLogger('name1')
    logger.setLevel(logging.INFO)
    for hdlr in logger.handlers[:]:  # remove all old handlers
        logger.removeHandler(hdlr)
    handler.setFormatter(logging.Formatter("\n%(asctime)s::LOG1::%(levelname)-8s:::%(message)s"))
    logger.addHandler(handler)
    return logger

def get_logger2(handler):
    logger = logging.getLogger('name2')
    logger.setLevel(logging.INFO)
    for hdlr in logger.handlers[:]:  # remove all old handlers
        logger.removeHandler(hdlr)
    handler.setFormatter(logging.Formatter("\n%(asctime)s::LOG2::%(levelname)-8s:::%(message)s"))
    logger.addHandler(handler)
    return logger


def get_logger3(handler):
    logger = logging.getLogger('name3')
    logger.setLevel(logging.INFO)
    for hdlr in logger.handlers[:]:  # remove all old handlers
        logger.removeHandler(hdlr)
    handler.setFormatter(logging.Formatter("\n%(asctime)s::LOG3::%(levelname)-8s:::%(message)s"))
    logger.addHandler(handler)
    return logger


handler = create_handler("file.log")
logger1 = get_logger1(handler)
logger2 = get_logger2(handler)
logger3 = get_logger3(handler)


logger1.info("from logging1")
logger2.info("from logging2")
logger3.info("from logging3")

结果是

2021-03-12T22:18:41.631-05:00::::LOG3::INFO    :::from logging1
2021-03-12T22:18:41.631-05:00::::LOG3::INFO    :::from logging2
2021-03-12T22:18:41.631-05:00::::LOG3::INFO    :::from logging3

代替

2021-03-12T22:18:41.631-05:00::::LOG1::INFO    :::from logging1
2021-03-12T22:18:41.631-05:00::::LOG2::INFO    :::from logging2
2021-03-12T22:18:41.631-05:00::::LOG3::INFO    :::from logging3

我认为唯一的选择是检查记录器名称,比如它来自 name1 然后使用 "\n%(asctime)s::LOG1::%(levelname)-8s:::%(message)s"

我可以创建三个不同的处理程序,然后问题是旋转文件处理程序不起作用

我需要将来自三个不同格式的不同记录器的消息发送到旋转文件处理程序

0 个答案:

没有答案
相关问题