在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ python使用配置文件配置logging, 如何方便的將多個(gè)logger打印到

python使用配置文件配置logging, 如何方便的將多個(gè)logger打印到不同的文件?

我目前只知道可以這樣:

handlers:
    file_a:
        formatter: standard
        filename: /var/log/a.log
    file_b:
        formatter: standard
        filename: /var/log/b.log
loggers:
    logger_a:
        level: DEBUG
        handlers: [file_a]
    logger_b:
        level: DEBUG
        handlers: [file_b]

又沒有什么方法可以根據(jù)logger的名稱來(lái)決定文件名?
比如這樣:

handlers:
    multi_file:
        filename: /var/log/{name}.log

目前考慮可用的就是包裝下logging.getLogger方法, 在拿logger的時(shí)候去配置它的fileHandler, 又沒有更簡(jiǎn)單易用的方式?

回答
編輯回答
離殤

反正我的經(jīng)驗(yàn)就是能不寫wrapper就不寫,因?yàn)槟悴恢篮竺婢S護(hù)這份代碼的人能不能看懂你寫的嵌套。

我覺得可以簡(jiǎn)單繼承一下logging的Manager類來(lái)實(shí)現(xiàn):

import logging


class CustomManger(logging.Manager):
    def getLogger(self, name, format=None):
        logger = super(CustomManger, self).getLogger(name)
        # 簡(jiǎn)單寫一下,F(xiàn)ormatter你自己實(shí)現(xiàn)吧
        filename = '{}.log'.format(name)
        logger.addHandler(logging.FileHandler(filename))
        return logger


manager = CustomManger(logging.root)
if __name__ == '__main__':
        
    logger_a = manager.getLogger('a')
    logger_b = manager.getLogger('b')
    logger_a.error('111')
    logger_b.error('222')
2017年7月21日 15:48
編輯回答
晚風(fēng)眠

實(shí)現(xiàn)了一下我說的那種方式, 感覺這樣太笨重了...

class MyFileHandlerFactory(logging.handlers.RotatingFileHandler):
    def __init__(self, filename, **kwargs):
        FileUtils.ready_file_dir(filename)
        super(MyFileHandlerFactory, self).__init__(filename, **kwargs)


def wrap_logger():
    _raw_getLogger = logging.getLogger

    def getLogger(name=None):
        logger = _raw_getLogger(name)
        if name is None:
            return logger
        for i in range(len(logger.handlers)):
            old_handler = logger.handlers[i]
            if not isinstance(old_handler, logging.handlers.RotatingFileHandler):
                continue
            base_file_name = old_handler.baseFilename
            if '{logger_name}' not in base_file_name:
                continue
            new_handler = MyFileHandlerFactory(base_file_name.format(logger_name=logger.name.replace('.', '_')),
                                               mode=old_handler.mode,
                                               maxBytes=old_handler.maxBytes,
                                               backupCount=old_handler.backupCount,
                                               encoding=old_handler.encoding,
                                               delay=old_handler.delay)
            new_handler.setFormatter(old_handler.formatter)
            new_handler.setLevel(old_handler.level)
            new_handler.set_name(logger.name + '.' + old_handler.name)
            logger.handlers[i] = new_handler
        return logger

    if logging.getLogger.__module__ != 'logging':
        # 已經(jīng)被包裝過了
        return
    logging.getLogger = getLogger


def init():
    import yaml
    with open(config.get_resource_path('logger.yml')) as f_conf:
        dict_conf = yaml.load(f_conf)
    logging.config.dictConfig(dict_conf)
    wrap_logger()
2017年7月3日 17:25