获取当前(或基本)的Python日志记录配置作为字典

时间:2018-10-28 18:22:02

标签: python logging configuration yaml

我正在使用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的问题,可能会发布相同的问题。

2 个答案:

答案 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