我正在使用python标准日志记录配置,并与yaml
结合使用dictConfig()
函数来加载配置文件:
import logging
import yaml
with open('logging.yaml','r') as f:
logConfig = yaml.safe_load(f.read())
logging.config.dictConfig(logConfig)
自an incremental logging configuration in python limits the capabilities起,每个日志文件都必须包含最少数量的信息,如下所示:
version: 1
formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
loggers:
my_module:
level: ERROR
root:
level: INFO
handlers: [console]
要么强迫人们亲自学习,要么将其存储在某个地方,或者每次查找。由于这两种方法都不适合我,因此我想找到一种生成方法。这使我想到了一个问题:
有没有办法将当前(或基本)日志记录配置作为字典?
只需运行以下代码一次,即可轻松创建初始配置文件,只需删除/编辑所需内容即可。
import logging
import yaml
logConfig = logging.get_current_config_as_a_dictionary()
with open('logging.yaml','w') as f:
f.write(yaml.dump(logConfig))
Yaml当然只是我个人的喜好,对于类似JSON的问题,可能会发布相同的问题。
答案 0 :(得分:1)
我不确定是否可以通过任何公共logging
函数来做到这一点。仔细查看CPython source包,并没有在任何结构(例如dict)中都很好地定义默认值。相反,它们被硬编码到函数logging.basicConfig
中。具体来说,此函数包含一些常见的“默认”设置关键字,但是不幸的是,出于您的目的,这些关键字已硬编码到该函数中。例如:
style = kwargs.pop("style", '%')
这使用root
记录器(本身是root = RootLogger(logging.WARNING)
)并向其中添加一些配置。
使用该方法的一种方法(实际上并不理想)是在调用logging.root
*之前和之后查看与logging.basicConfig()
关联的“ before and after”配置。例如:
>>> root = logging.root
>>> root.handlers
[]
>>> logging.basicConfig()
>>> root.handlers
[<StreamHandler <stderr> (NOTSET)>]
最后,我要提到默认样式来自:
logging._STYLES['%']
适用于%(levelname)s:%(name)s:%(message)s
。
*如果不带任何参数调用此函数,实际上并没有完成很多工作;主要变化是在根记录器中添加了StreamHandler
(标准输出),然后在根记录器中添加了Formatter
。
答案 1 :(得分:1)
我没有为您找到完整的解决方案,但是logging_tree package似乎是朝着正确方向迈出的一步。如果您查看其源代码,则可以更改其输出以匹配您要查找的字典。
这是它当前从其主页生成的输出:
>>> logging.getLogger('a')
>>> logging.getLogger('a.b').setLevel(logging.DEBUG)
>>> logging.getLogger('x.c')
>>> from logging_tree import printout
>>> printout()
<--""
Level WARNING
|
o<--"a"
| Level NOTSET so inherits level WARNING
| |
| o<--"a.b"
| Level DEBUG
|
o<--[x]
|
o<--"x.c"
Level NOTSET so inherits level WARNING