我使用带有YAML配置文件的python日志记录模块。 在那里我定义了2个格式化程序。 如何动态访问这些格式化程序? 如果发生某个事件,我想动态地覆盖附加到我的一个处理程序的标准格式化程序。
根据要求,一个小例子:
我的日志配置:
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')
但是,似乎没有任何与处理程序无关的格式化程序的引用。
答案 0 :(得分:0)
在编写示例时,我实际上想出了一个解决方案。它不是那么好,因为它依赖于为每个与处理程序无关的格式化程序创建虚拟处理程序,但似乎有效。
因此,基本上对于每个格式化程序,只需添加一个虚拟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)
答案 1 :(得分:0)
您cad使用适当的格式化程序动态创建处理程序,并将其附加到记录器
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)