Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志模块:动态设置格式化程序_Python_Logging_Formatter - Fatal编程技术网

Python日志模块:动态设置格式化程序

Python日志模块:动态设置格式化程序,python,logging,formatter,Python,Logging,Formatter,我将python日志模块与YAML配置文件一起使用。 在这里我定义了两个格式化程序。 如何动态访问这些格式化程序? 如果发生某个事件,我希望动态覆盖附加到某个处理程序的标准格式化程序 根据要求,举一个小例子: 我的日志记录配置: version: 1 disable_existing_loggers: False formatters: console: class: colorlog.ColoredFormatter format: "%(log_col

我将python日志模块与YAML配置文件一起使用。 在这里我定义了两个格式化程序。 如何动态访问这些格式化程序? 如果发生某个事件,我希望动态覆盖附加到某个处理程序的标准格式化程序

根据要求,举一个小例子:

我的日志记录配置:

version: 1
disable_existing_loggers: False
formatters:
    console:
        class: colorlog.ColoredFormatter
        format: "%(log_color)s[%(asctime)s] [%(levelname)-8s] --- %(message)s (%(filename)s:%(lineno)s)"
        datefmt: "%Y-%m-%d %H:%M:%S"
    console_user:
        class: colorlog.ColoredFormatter
        format: "%(log_color)s[%(levelname)-8s] --- %(message)s"
handlers:
    console:
        class: logging.StreamHandler
        level: INFO
        formatter: console
        stream: ext://sys.stdout
root:
    level: DEBUG
    handlers: [console]
在我的脚本中,我有如下内容:

    import logging
    logging.config.dictConfig(logging_config)
    logger = logging.getLogger()
现在我想做一些类似的事情

    logger.handlers[0].setFormatter('console_user')

但是,似乎没有引用任何与处理程序无关的格式化程序。

在编写示例时,我实际上想出了一个解决方案。这不是很好,因为它依赖于为每个尚未与处理程序关联的格式化程序创建虚拟处理程序,但似乎可以工作

因此,基本上每个格式化程序都可以添加一个伪NullHandler,例如:

version: 1
disable_existing_loggers: False
formatters:
    simple:
        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    info:
        format: "[%(asctime)s] [%(levelname)-8s] --- %(message)s (%(filename)s:%(lineno)s)"
        datefmt: "%Y-%m-%d %H:%M:%S"
    console:
        class: colorlog.ColoredFormatter
        format: "%(log_color)s[%(asctime)s] [%(levelname)-8s] --- %(message)s (%(filename)s:%(lineno)s)"
        datefmt: "%Y-%m-%d %H:%M:%S"
    console_user:
        class: colorlog.ColoredFormatter
        format: "%(log_color)s[%(levelname)-8s] --- %(message)s"
handlers:
    console:
        class: logging.StreamHandler
        level: INFO
        formatter: console
        stream: ext://sys.stdout
    dummy:
        class: logging.NullHandler
        formatter: console_user


root:
    level: DEBUG
    handlers: [console, dummy]
后来在片场

logger.handlers[0].setFormatter(logger.handlers[1].formatter)

您可以使用适当的格式化程序动态创建处理程序,并将其附加到记录器

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create file handler which logs even debug messages
file_handler = logging.FileHandler('spam.log')
file_handler.setLevel(logging.DEBUG)

# create console handler with a higher log level
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.ERROR)

# create formatter and add it to the handlers
formatter = logging.Formatter('%(levelname)s - %(asctime)s - %(name)s: %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# add the handlers to logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# or remove corent handlers and set new
# logger.handlers = [console_handler, file_handler]
或者甚至更改记录器处理程序中的格式化程序:

formatter = logging.Formatter('%(levelname)s - %(asctime)s - %(name)s: %(message)s')
for handler in my_logger.handers:
    handler.setFormatter(formatter)

# also you may need to do it in logger parent logger
if my_logger.parent
for handler in my_logger.parent.handers:
    handler.setFormatter(formatter)

你试过什么?请编辑您的问题以包括