我找到了很多文档和教程,例如official logging
config docs,official logging
cookbook和nice tutorial by Fang。
他们每个人都让我接近答案,但并不完全。我的问题是:
为了澄清,这是我的YAML文件的一个例子:
---
version: 1
handlers:
debug_console:
class: logging.StreamHandler
level: DEBUG
.
.
.
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
.
.
.
loggers:
dev:
handlers: [debug_console, info_file_handler]
test:
handlers: [info_file_handler]
root:
handlers: [info_file_handler]
我希望两种方式来运行记录器,其中一种方式(dev
)比另一种方式更详细。 此外,在运行dev
记录器时,我希望它为两个不同的处理程序提供两个不同的级别。
这是尝试启动记录器的代码片段:
with open('logging.yaml', 'r') as f:
log_cfg = yaml.safe_load(f.read())
logging.config.dictConfig(log_cfg)
my_logger = logging.getLogger('dev')
上面的dictConfig
行正常工作。我这样说是因为当我找到要求登录控制台的代码时,我会在日志打印出来时看到dev
作为名称。 (我已编辑了yaml,但格式中包含%(name)s
。)
但是my_logger
有问题。 即使它与dev
的名称相关联,其余属性也似乎都没有设置。具体来说,我明白了:
>>> my_logger
<Logger dev_model (WARNING)>
我不太了解logging
模块,无法理解问题所在。我想要的是:
'dev'
记录器时,我想启动2个处理程序,一个处于DEBUG
级别并写入控制台,另一个处于INFO
级别,写入文件。如何做到这一点?
答案 0 :(得分:2)
如果我正确理解了该问题,则问题是由于记录器本身具有日志级别,而不仅仅是处理程序。记录器的日志级别默认为{ "userId":1234, "role":"hello", "sessionToken":"91da56ba-ac18-409d-8de0-9ec944781b49",
"showWelcomePage":gh, "accountType":0, "businessType":"Enterprise-Location",
"accountCount":3, "accountId":null, "userOutputMessage":null,
"businessOutputMessage":null, "businessId":2345678ggt4, "business":null }
,这似乎是在记录器上设置的。如果生成的消息的优先级低于记录器的级别,则它甚至不会处理处理程序。
因此,请尝试将记录器的WARNING
设置为level
。 DEBUG
应该忽略比其自身级别更详细的任何消息。
至于这部分:
其余属性似乎都没有设置。
调用记录器的info_file_handler
方法会发生什么,以将Logger转换为某种字符串表示形式以进行呈现。不能保证显示对象的所有属性。
答案 1 :(得分:0)
这么长的问题......我太久不能理解了。
但我认为你误解了处理程序的工作原理。实际上,记录器本身并不输出除处理程序之外的任何东西。
因此,如果您在DEBUG
记录器上设置dev
,它会将日志&gt; = DEBUG
传递给所有处理程序。然后debug_console
处理程序将处理日志&gt; = DEBUG
,但info_file_handler
将仅处理日志&gt; = INFO
。在DEBUG
记录器上设置dev
不会让info_file_handler
输出日志&lt; INFO
。所以你可以有两个单独的级别,一个是&gt; = DEBUG
并进入控制台而另一个是&gt; = INFO
并转到文件。
我假设我理解你......