python日志yaml配置文件中的通用记录器名称
好的,现在的情况是我需要使用一个yaml配置文件来记录日志(不要问-我只需要它:))。在编写“loggers:”指令时,我希望使用一个记录器,并能够使用python日志yaml配置文件中的通用记录器名称,python,python-2.7,logging,configuration,yaml,Python,Python 2.7,Logging,Configuration,Yaml,好的,现在的情况是我需要使用一个yaml配置文件来记录日志(不要问-我只需要它:))。在编写“loggers:”指令时,我希望使用一个记录器,并能够使用getLogger(\uuu name\uuu)从我的应用程序中的多个模块获取它。如果我使用一个普通的python配置文件进行日志记录,我知道该怎么做,但是我找不到一种方法来对yaml文件进行同样的操作。 使用Python2.7 长话短说,这就是我所拥有的(这只是我问题的一个简化示例,而不是实际应用程序的一部分:): 下面是logging.yam
getLogger(\uuu name\uuu)
从我的应用程序中的多个模块获取它。如果我使用一个普通的python配置文件进行日志记录,我知道该怎么做,但是我找不到一种方法来对yaml文件进行同样的操作。
使用Python2.7
长话短说,这就是我所拥有的(这只是我问题的一个简化示例,而不是实际应用程序的一部分:):
下面是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(\uuuu name\uuuu)
,它总是使用一个“”记录器并向我显示消息。
那么有没有办法在yaml中创建一个通用记录器呢?类似于python日志记录配置中的“”:吗?
我试过了(),~,null-它们不起作用。
基本上,我需要能够调用任何名称的记录器,我想得到一个指定的记录器。
是的-我可以在yaml中创建一个root指令,并通过使用
logging.getLogger()
调用它。诀窍是在其他记录器列表之外使用一个名为root
的特殊记录器
我在以下文件中发现:
根-这将是根记录器的配置。配置的处理将与任何记录器相同,但传播
设置不适用
以下是您的问题中的配置,已更改为使用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
在
DEBUG
级别配置app
,在WARN
级别配置其他所有内容。诀窍是在其他记录器列表之外使用名为root
的特殊记录器
我在以下文件中发现:
根-这将是根记录器的配置。配置的处理将与任何记录器相同,但传播
设置不适用
以下是您的问题中的配置,已更改为使用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
它在
调试级别配置应用程序,在警告级别配置所有其他内容。好的,所以我找到了答案(感谢@flyx!)。
我比较了原始python dict配置和从yaml dict配置转换而来的配置,发现日志记录会自动将disable\u existing\u loggers:False
添加到python配置中。之后,我将这一行添加到yaml中,并在loggers指令中使用“”。。成功了!
因此,生成的yaml配置如下所示:
..............
disable_existing_loggers: False
loggers:
'':
handlers: [console, sentry]
level: DEBUG
propagate: False
现在它开始工作了。即使我创建了一个类似于logging.getLogger('something')
的记录器,并且记录器'something'不在配置中,那么应用程序将使用''记录器
@如果记录器是在文件的开头定义的(在配置之前),Don Kirkby的答案将不起作用。但是,如果在配置日志记录之后定义了记录器,那么它就可以正常工作。因此,这是我问题中代码的解决方案,而不是问题的答案——“那么有没有办法在yaml中创建一个通用记录器?比如“:在python日志配置中?”这就是为什么我没有选择它作为答案。但他的评论是完全合法的:)好的,所以我找到了答案(感谢@flyx!)。
我比较了原始python dict配置和从yaml dict配置转换而来的配置,发现日志记录会自动将disable\u existing\u loggers:False
添加到python配置中。之后,我将这一行添加到yaml中,并在loggers指令中使用“”。。成功了!
因此,生成的yaml配置如下所示:
..............
disable_existing_loggers: False
loggers:
'':
handlers: [console, sentry]
level: DEBUG
propagate: False
现在它开始工作了。即使我创建了一个类似于logging.getLogger('something')
的记录器,并且记录器'something'不在配置中,那么应用程序将使用''记录器
@如果记录器是在文件的开头定义的(在配置之前),Don Kirkby的答案将不起作用。但是,如果在配置日志记录之后定义了记录器,那么它就可以正常工作。因此,这是我问题中代码的解决方案,而不是问题的答案——“那么有没有办法在yaml中创建一个通用记录器?比如“:在python日志配置中?”这就是为什么我没有选择它作为答案。但是他的评论是完全合法的:)那么你是否尝试了'
而不是~
或null
?是的-也没有运气。这似乎很奇怪,因为包含'
的YAML会产生与Python相同的结构。您应该尝试通过转储和检查Python结构和加载的YAML来找出它们之间的差异。那么您是否尝试了'
而不是~
或null
?是的-也没有运气。这似乎很奇怪,因为包含'
的YAML会产生与您在Python中给出的相同的结构。您应该尝试通过转储和检查Python结构与加载的YAML之间的差异。