为什么 basicConfig 中的 python 日志记录级别没有效果?

2023-12-24

import logging

# root logger
root = logging.getLogger()      # root
ch = logging.StreamHandler()
ch.setLevel(logging.WARN)
formatter = logging.Formatter('[root] %(levelname)s - %(message)s')
ch.setFormatter(formatter)
root.addHandler(ch)

# logging as child
c = logging.getLogger('mod')
c.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('[mod] - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
c.addHandler(ch)

c.error('foo')
c.warning('foo')
c.info('foo')
c.debug('foo')

output:

[mod] - ERROR - foo
[root] ERROR - foo
[mod] - WARNING - foo
[root] WARNING - foo
[mod] - INFO - foo
[mod] - DEBUG - foo

没关系。根的级别是WARN, so INFO and DEBUG不打印根。 但是当我使用basicConfig:

import logging

# config root logger
logging.basicConfig(level=logging.WARN, format='[root] %(levelname)s - %(message)s')

# logging as child
c = logging.getLogger('mod')
c.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('[mod] - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
c.addHandler(ch)

c.error('foo')
c.warning('foo')
c.info('foo')
c.debug('foo')

output:

[mod] - ERROR - foo
[root] ERROR - foo
[mod] - WARNING - foo
[root] WARNING - foo
[mod] - INFO - foo
[root] INFO - foo
[mod] - DEBUG - foo
[root] DEBUG - foo

水平basicConfig is WARN, 为什么级别INFO and DEBUG可以打印 root 吗?

当我使用logging.info,有效果。


你正在看到那些[root]信息和调试消息,因为您调用logging.basicConfig创建一个根Handler具有水平NOTSET。处理程序级别为NOTSET将输出它收到的任何消息(参见处理程序.setLevel https://docs.python.org/3.5/library/logging.html#logging.Handler.setLevel).

>>> import logging
>>> logging.basicConfig(level=logging.WARN, format='[root] %(levelname)s - %(message)s')
>>> [handler.level == logging.NOTSET for handler in logging.getLogger().handlers]
[True]

这与您的第一个示例不同,因为在您的第一个示例中,您正在创建一个级别为WARN.

The level=参数为logging.basicConfig用于设置根的级别Logger没有任何根Handler.

日志消息传播

日志消息向上传播到父 Logger,但不考虑任何父 Logger 的级别。这是任何水平Handlers这决定了“输出”什么。

从文档中日志记录器传播 https://docs.python.org/3.5/library/logging.html#logging.Logger.propagate:

消息直接传递到祖先记录器的处理程序 - 不考虑相关祖先记录器的级别或过滤器。

那么 Logger.level 是做什么用的呢?

记录器使用其级别来决定是否将消息传播到其以及任何父记录器的处理程序。

如果 Logger 没有设置级别,那么它会向其祖先 Logger 询问其级别并使用该级别(请参阅logging.Logger.setLevel https://docs.python.org/3.5/library/logging.html#logging.Logger.setLevel).

因此,仅当您未在子记录器上设置级别时,根记录器的级别才相关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 basicConfig 中的 python 日志记录级别没有效果? 的相关文章

随机推荐

  • 在显示用户数据的视图表中更改和保存 mysql 用户数据

    我有一个表 显示从 mysql 表中获取的用户数据 我希望使其可以在该表的单元格内编辑 我已经使用 php 在 文本 类型输入字段中显示数据 如代码所示 为了重新提交更改的数据 我将表行包装在表单中 但问题是表单数据没有重新提交 我想让用户
  • Fluent nHibernate 自动映射属性为 nvarchar(max)

    使用流畅的 nhibernate 和自动映射 nhibernate 创建我的数据库模式 我如何让 nhibernate 基于以下类在数据库中创建 nvarchar max 列 public class VirtualPage BaseEnt
  • C# 中的动态字符串格式化

    我创建了接受字符串的 log 方法 当我想使用它时 我会写这样的内容 Log string Format Message 0 AdditionalInfo 我应该如何实施Log方法以便能够使用字符串Format但不必在方法参数中显式编写 L
  • 404 Not Found,但 Laravel 5.4 中存在路由

    我正在使用 PhpStorm 我可以运行并打开index php 但是当我想按提交按钮 登录后 时 它显示 404 未找到 在 Windows 10 上运行的 Web 服务器 Apache 2 4 这是我的家 这是我的路线 我不完全确定为什
  • .dynamicType 已弃用。使用“类型(...)”代替

    我刚刚更新到 Xcode 8 和 iOS 10 使用旧版 Swift 语言版本 尝试再次编译我的项目一直是一种痛苦 即使仍然使用旧的 Swift 语法 这次我的函数之一使用NSBundle forClass self dynamicType
  • 如何调试从完全信任进程启动器启动的 .exe

    我在同一解决方案中构建了一个 UWP 应用程序和一个 WPF 应用程序 我正在使用 FullTrustProcessLauncher 类从 UWP 应用程序启动 WPF 应用程序 我还使用 App Service Connection 类来
  • 查找嵌套数组中符合条件的第一个元素

    我有以下文件 doc1 array field ABC enabled false field BCD enabled true field DEF enabled false field XYZ enabled true doc2 arr
  • 使用 ADO.net 和 SQL 中的特殊字符

    我想在 Winforms 中编写一个小型应用程序 我可以在其中编写一些单词并使用 ADO net 将它们写入 SQL 数据库 当我想编写带有占位符的字符串时遇到麻烦 例如 Give me your s right now 我的数据库中记录的
  • AlertDialog 与 EditText,自动打开软键盘并聚焦于 EditText 不起作用

    我正在尝试编写一段代码 该代码应在 AlertDialog 中显示 EditText 后立即将其聚焦 然后自动打开软键盘 相反 它只会使屏幕变暗 Builder builder new Builder this final EditText
  • 防止快速点击视图

    我正在 Xcode 和 swift 中工作 我创建了一个视图 充当点击时切换的菜单 当菜单出现时 我仍然可以单击其下方的测试按钮 我不希望这种事发生 我希望禁用视图后面的所有内容 优先考虑菜单视图 查看下图 示例应用程序的屏幕截图 http
  • Azure Service Fabric 中的可靠 blob 状态?

    是否有推荐的方法将 blob 用作 Azure Service Fabric 中的可靠状态 我看到两个选择 实现分块机制并将块存储在可靠的集合中 不过 这个选项的开发 维护负担相当重 外部存储 Blob Azure Blob 存储 不过 此
  • 使用 BeautifulSoup 解析嵌套 div

    我正在尝试解析许多包含文本 表格和 html 的网页 每个页面都有不同数量的段落 但每个段落都以一个开头开头 div 闭幕式 div 直到最后才发生 我只是想获取内容 过滤掉某些元素并用其他元素替换它们 期望的结果 text1 b text
  • sort() 的自定义比较函数无需参数即可工作(c++)[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 为什么 sort 的自定义比较函数无需参数即可工作 c void show int a cout lt
  • 我在 Chrome 中收到“画布已被污染”错误,但在 FF 中则没有

    我的 Javascript 实现有问题 该脚本将在 Firefox 中运行 但在 Chrome 中它会显示 Unable to get image data from canvas because the canvas has been t
  • 将 jQuery 与 Typescript 2 结合使用

    我是 Typescript 2 的新手 我想做的是将 jQuery 与 Typescript 结合使用 在this https stackoverflow com questions 32050645 how to use jquery w
  • 如何在mysql中加载数据INFILE,并且第一个列是自动增量?

    目前 我们有一个与此类似的表 ID AField BField ID自增 如何创建一个 CSV 让数据库自动填充 ID 字段并自动递增数字 我们尝试了以下 CSV 但不起作用 afieldvalue bfieldvalue With Col
  • “KeyPress”和“Paste”上的 Javascript 触发器

    我有一个 JavaScript 来检查字段是否等于 15 个字符 如果不是 提交按钮将显示为灰色 如果我手动输入 15 个字符 则效果很好 但如果我粘贴 15 个字符 则效果不佳 即使内容粘贴到字段中 我怎样才能让它检查 我可以让它定期 秒
  • URL 解析 NodeJS 已弃用

    如何在 Node v14 和 Express v4 上转换以下已弃用的 URL 解析 我尝试了一些改变 但仍然失败 url require url var url parts url parse req url true var query
  • 查找数组中重复数字的算法 ---最快的方法

    我需要最快且简单的算法来查找数组中的重复数字 也应该能够知道重复数字的数量 例如 如果数组是 2 3 4 5 2 4 6 2 4 7 3 8 2 我应该能够知道有四个2 两个3和三个4 创建一个哈希表 其中键是数组项 值是计数器相应数组项在
  • 为什么 basicConfig 中的 python 日志记录级别没有效果?

    import logging root logger root logging getLogger root ch logging StreamHandler ch setLevel logging WARN formatter loggi