簡體   English   中英

Python 日志記錄模塊:動態設置格式化程序

[英]Python logging module: Set formatter dynamically

我正在使用帶有 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')

然而,似乎沒有提到任何與處理程序無關的格式化程序。

在編寫示例時,我實際上想出了一個解決方案。 這不是很好,因為它依賴於為每個尚未與處理程序關聯的格式化程序創建虛擬處理程序,但似乎有效。

所以,基本上每個格式化程序都可以添加一個虛擬的 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)

您使用適當的格式化程序 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM