[英]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.