如何在python日志记录中的格式化程序之间切换?

时间:2021-02-15 18:44:14

标签: python python-3.x logging

我已经定义了一个记录器配置 -

logconfig: dict = {
        'version': 1,
        'formatters': {
            'default': {
                'format': '[%(asctime)s][%(name)s][%(levelname)s] %(message)s',
                'datefmt': '%Y-%m-%dT%H:%M:%S%z'
            },
            'withuuid': {
                'format': '[%(asctime)s][%(name)s][%(levelname)s] %(message)s (message2)s',
                'datefmt': '%Y-%m-%dT%H:%M:%S%z'
            }
        },
        'handlers': {
            'console': {
                'class': 'logging.StreamHandler',
                'formatter': 'default'
            }
        },
        'loggers': {
            '': {  # root logger
                'level': log_level,
                'handlers': ['console']
            },
            'prm_example_agent': {  # Our module
                'level': log_level,
                'handlers': ['console'],
                'propagate': False
            },
            'prm': {  # The PRM library
                'level': log_level,
                'handlers': ['console'],
                'propagate': False
            }
        }
    }

这是我的 py 文件中的示例日志行。 self.logger.info("Destroying fgs " + resource.metadata.id)。 这是默认选择默认格式化程序。我想改用我自己的 withuuid 格式化程序。我怎样才能在 py 文件本身实现这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用 logging.setFormatter() 将新格式“推送”和“弹出”到 streamHandler 上。假设您设置了一个 self.log,并说只有一个流处理程序可以执行

# Assuming self.log exists, and is setup
oldFormatter = self.log.handlers[0].formatter # get the old formatter
self.log.handlers[0].setFormatter(newFormat) # push the new format
self.log.info("Very informative message")
self.log.handlers[0].setFormatter(oldFormat) # push the old formatter back on

包含在一个处理多个流处理程序的漂亮函数中:

def logWithFormatter(logger, newFormatter, message):
    for i in range(len(logger.handlers)):
        oldFormatter = logger.handlers[i].formatter
        logger.handlers[i].setFormatter(newFormatter)
        logger.info(message)
        logger.handlers[i].setFormatter(oldFormatter)