簡體   English   中英

python日志yaml配置文件中的通用記錄器名稱

[英]universal logger name in python logging yaml config file

好的,所以情況是我需要使用yaml配置文件進行日志記錄。(不要問-我只需要它:))。 當編寫'loggers:'指令時,我想使用一個logger,並能夠使用getLogger(__name__)從我的應用程序中的多個模塊中獲取它。 如果我使用普通的python配置文件進行日志記錄,我知道該怎么做,但是我找不到找到對yaml文件執行相同操作的方法。 使用python 2.7這么長的話,這就是我所擁有的(這只是我的問題的簡化示例,不屬於實際應用程序的一部分:)):

#this is app.py
import logging.config
import yaml
import os

def init_logging():
    path = 'logging.yaml'
    if os.path.exists(path):
        with open(path, 'r') as f:
            config = yaml.safe_load(f.read())
        logging.config.dictConfig(config['logging'])
    main()


def main():
    logger = logging.getLogger('app')
    logger.debug("done!")


init_logging()

這是logging.yaml配置文件:

logging:
    version: 1
    formatters:
        brief:
            format: '%(message)s'
        default:
            format: '%(asctime)s %(levelname)-8s [%(name)s] %(message)s'
            datefmt: '%Y-%m-%d %H:%M:%S'

    handlers:
        console:
            class: logging.StreamHandler
            level: DEBUG

    loggers:
        app:
            handlers: [console]
            level: DEBUG

所以就在這里-它起作用。 “完成!” 消息顯示在控制台中。 但是我希望能夠在配置中設置的不是某個獨特的記錄器(在這里我稱之為“ app”),而是一個通用的,例如,如果它位於.py配置中,它將是

"loggers": {
    "": {
        "handlers": ["console"],
        "level": "DEBUG",
    },
}

然后我將在不同的模塊中使用logging.getLogger(__name__) ,它將始終使用一個“”記錄器向我顯示消息。 那么有沒有辦法在Yaml中創建通用記錄器? 像“”:在python日志配置中? 我嘗試了(),〜,null-那些沒有做的工作。 基本上,我需要能夠使用我想要的任何名稱來調用記錄器,並獲得一個指定的記錄器。 是的-我可以在yaml中創建根指令,並使用logging.getLogger()調用

訣竅是在其他記錄器列表之外使用一種稱為root的特殊記錄器。

我在Python文檔中找到了這個:

root-這將是root記錄器的配置。 propagate設置不適用外,配置處理將與任何記錄器相同。

這是從您的問題更改為使用root密鑰的配置:

logging:
    version: 1
    formatters:
        brief:
            format: '%(message)s'
        default:
            format: '%(asctime)s %(levelname)-8s [%(name)s] %(message)s'
            datefmt: '%Y-%m-%d %H:%M:%S'

    handlers:
        console:
            class: logging.StreamHandler
            level: DEBUG

    root:
        handlers: [console]
        level: WARN
    loggers:
        app:
            level: DEBUG

這會將app配置為DEBUG級別,並將其他所有配置為WARN級別。

好的,所以我找到了答案(感謝@flyx!)。 我比較了原始的python dict config和從yaml dict config轉換后的結果,發現日志記錄會自動將disable_existing_loggers: False添加到python config。 之后,我將這一行添加到yaml中,並在loggers指令中使用了''。 因此,最終的yaml配置如下所示:

..............
disable_existing_loggers: False

loggers:
    '':
        handlers: [console, sentry]
        level: DEBUG
        propagate: False

現在可以了。 即使我創建了logging.getLogger('something')記錄器,並且記錄器'something'不在配置中,該應用也將使用''記錄器。

如果在文件的開頭定義了記錄器,則@Don Kirkby的答案將不起作用(在配置文件之前)。 但是,如果在配置日志記錄后定義了記錄器,則不會有任何問題。 因此,這是我問題中代碼的解決方案,而不是問題的答案-“那么,有沒有辦法在yaml中創建通用記錄器?例如“”:在python日志記錄配置中?” 這就是為什么我沒有選擇它作為答案的原因。 但他的評論完全合法:)

暫無
暫無

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

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