python日志yaml配置文件中的通用记录器名称

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

好的,现在的情况是我需要使用一个yaml配置文件来记录日志(不要问-我只需要它:))。在编写“loggers:”指令时,我希望使用一个记录器,并能够使用
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之间的差异。