Python3添加日志级别

2023-11-25

我有这段代码,对我来说效果很好。

import logging
import logging.handlers

logger = None


def create_logger():
    global logger
    logger = logging.getLogger('Logger')
    logger.setLevel(logging.DEBUG)
    handler = logging.handlers.RotatingFileHandler("C:/Users/user/Desktop/info.log", maxBytes=1000000, backupCount=20)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)


create_logger()
logger.info("Text info")
logger.debug("Text debug")
logger.warning("Text warning")
logger.error("Text error")
logger.critical("Text critical")

输出看起来很棒:

2017-12-19 15:06:43,021 - 记录器 - 信息 - 文本信息
2017-12-19 15:06:43,021 - 记录器 - 调试 - 文本调试
2017-12-19 15:06:43,022 - 记录器 - 警告 - 文本警告
2017-12-19 15:06:43,022 - 记录器 - 错误 - 文本错误
2017-12-19 15:06:43,022 - 记录器 - 关键 - 文本关键

好吧,我想添加一个新的日志记录级别,如下所示:

logger.message("Text message")  

输出应该是这样的

2017-12-19 15:06:43,022 - 记录器 - 消息 - 短信


From 记录文档(强调):

定义自己的级别是可能的,但应该不是必要的, 作为 现有水平是根据实际情况选择的 经验。但是,如果您确信需要自定义级别, 这样做时应格外小心,并且这可能是一个 如果您正在开发库,则定义自定义级别是非常糟糕的主意。 那是因为如果多个库作者都定义了自己的自定义 级别,有可能来自这样多个的日志输出 一起使用的库对于使用开发人员来说将很难 控制和/或解释,因为给定的数值可能意味着 不同的图书馆有不同的东西。

默认概述日志记录级别:

enter image description here

但如果您仍然愿意,您可以设置自己的日志级别:

In the logging-模块,_levelToName and _nameToLevel是日志名称和级别之间的映射。无需手动添加,addLevelName()函数会为你做这件事。

这里,一个新的日志记录级别称为MESSAGE添加了日志级别25:

import logging

# Define MESSAGE log level
MESSAGE = 25

# "Register" new loggin level
logging.addLevelName(MESSAGE, 'MESSAGE')  # addLevelName(25, 'MESSAGE')

# Verify
assert logging.getLevelName(MESSAGE) == 'MESSAGE'

如果您不想创建自己的记录器类但仍想记录其他日志级别,那么您可以使用Logger.log(level, msg)-传统记录器上的方法:

logging.log(MESSAGE, 'This is a message')

编辑:直接添加消息

 def message(self, msg, *args, **kwargs):
    if self.isEnabledFor(MESSAGE):
        self._log(MESSAGE, msg, args, **kwargs) 

使message()- 可用功能logging:

 logging.message = message
 # or setattr(logging, 'message', message)

使message()-记录器中可用的功能:

 logging.Logger.message = message
 # or setattr(logging.Logger, 'message', message)

制作自定义 Logger 类

您可以创建自己的记录器类来制作message(msg)- 方法,与其他方法类似地使用(例如info(msg), warning(msg), etc.)

在下面的示例中,一个新的记录器是用message(msg)- 记录方法MESSAGE:

class MyLogger(logging.Logger):
    def message(self, msg, *args, **kwargs):
        if self.isEnabledFor(MESSAGE):
            self._log(MESSAGE, msg, args, **kwargs)

获取记录器

我不确定让它工作的最佳方法是什么logging.getLogger(name),但下面有两种方法。 参考号评论,我相信第一种方法更好:

Either使新记录器成为默认记录类,这意味着新记录器实例将属于MyLogger类而不是默认类logging.Logger class:

logging.setLoggerClass(MyLogger)
logger = logging.getLogger('A new logger name')
logger.message('This seems to work')
assert isInstance(logger, MyLogger)

Or只需创建一个记录器实例并将其添加到loggerDict在活跃的logging.Manager实例 (EDIT:不推荐,见评论):

my_logger = MyLogger('Foo')
logging.Logger.manager.loggerDict['Foo'] = my_logger
logger = logging.getLogger('Foo')
logger.message('This is the same instance as my_logger')
assert logger is my_logger

使用新的日志级别

# Use the new logger class
logger.warning('Custom log levels might be a bad idea')
logger.message('Here is a message')
# Log with custom log level:
logger.log(MESSAGE, 'This is a message')

这假设MESSAGE被预定义为表示日志级别的整数数值。 (例如。25就像之前提到的)

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

Python3添加日志级别 的相关文章

随机推荐

  • Resharper 8.1 测试运行器减慢 Visual Studio 文本编辑速度

    我有一个相当小的 C 解决方案 其中包含大约 5 个项目 我正在使用带有 Update 4 的 Visual Studio 2012 和 Resharper 8 1 内部版本 8 1 23 546 它采用配备 SSD 和 16GB RAM
  • Ruby on Rails 多态关系的优点和缺点 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 您知道 Ruby on Rails 多态关系有哪些优点和缺点 优点 您可以轻松地将任何东西链接到任何东西 适应性强的关系有助于适应不可预见的情况 很容易建立关系 非常适合临时系统
  • 如何使用 from_json 和 schema 作为字符串(即 JSON 编码的 schema)?

    我正在从 Kafka 读取一个流 并将 Kafka 的值 即 JSON 转换为 Structure from json有一个采用类型模式的变体String 但我找不到样本 请指出下面的代码有什么问题 Error Exception in t
  • Jboss 在根上下文中部署

    是的 我知道enable welcome root false 但在文件中找不到这个 使用 Wildfly Final 或 jboss eap 6 2 在哪儿 为什么我需要在 WEB INF 中添加 jboss web xml 有问题的文件
  • “@Transactional”应该放在服务层或 DAO 的哪里

    首先 我可能正在问一些以前被问过并回答过的问题 但我无法返回搜索结果 我们在服务层定义事务注释 典型的 Spring Hibernate CRUD 通常是 控制器 gt 管理器 gt Dao gt Orm 我现在遇到的情况是 我需要根据客户
  • 在谷歌地图android上实现落针动画

    我正在我的 Android 应用程序中实现谷歌地图 在此过程中我想添加落针动画 我已经搜索了所有内容 但找不到执行此操作的确切方法 任何人都可以帮助我如何做 这将是一个很大的帮助 将标记添加到地图中的所需位置 然后使用该标记调用此函数 pr
  • Python - PyQt - QTable Widget - 添加行

    我是 PyQt 的新手 无论如何仍然有点困惑 我有一个像这样的文本文件结构 姓名 姓氏 电话 电子邮件 空格实际上是制表符 t 现在当我用我的方法读取这个文件时 我希望填充 QTableWidget 我的 QTable Widget 有 4
  • C Int 和 Long 32 - 64 位中的值范围

    我对 C 中 Int 变量的值范围感到困惑 我知道 32 位 unsigned int 的范围是 0 到 65 535 那么只要有0到4 294 967 295 这在 32 位机器上没问题 但现在在 64 位机器中一切都保持不变吗 或者也许
  • 连接两个 gatsby 节点

    所以 我正在使用盖茨比 mdx用于从 MDX 文件创建站点的插件 我想在 SitePage 对象和 Mdx 对象之间创建关联 以便我可以对 SitePage 边缘执行一个 graphQL 查询来构建站点导航 我的大部分代码都是用 TypeS
  • 如何链接没有字幕的 YouTube 视频?

    可以链接吗youtubeHTML 代码中的视频不显示其字幕 字幕 假设我有以下视频 http www youtube com watch v kTvHIDKLFqc 它有默认的英文字幕 但是 当链接该视频时 我想在没有它们的情况下加载它 是
  • C++ 中正态分布的随机数

    作为 C 的完全初学者 我想从正态分布生成一个随机数 使用以下代码 源自此post 我能够这样做 include
  • 我可以在 Windows 7 上使用 C# .NET 开发 Blackberry 应用程序吗

    嘿 我非常有兴趣为黑莓操作系统构建一个应用程序 我可以用 C 来做吗 Blackberry 还推出了 Visual Studio 插件 但您将如何将其与模拟器一起使用 不 你做不到 你必须使用Java来做黑莓开发 黑莓曾经有一个 C C A
  • 使用 ggplot2 以粗体显示各个轴标签

    改编自这个问题和解决方案的问题 使用 ggplot2 以粗体突出显示各个轴标签 我想根据满足标准有选择地证明水平轴标签的合理性 因此 借用上述问题和答案 我设置了一个示例 require ggplot2 require dplyr set
  • 如何在 CSS 中用 div 制作尖箭头

    如何在 CSS 中制作尖箭头 不只是一个三角形 而是一个有茎的三角形 就像用弓射出的传统箭一样 我试图通过创建一个 div 容器来做到这一点 其中包含两个容器 左容器和右容器 右侧将包含三角形 左侧将包含三个 div 其中心将被着色以创建主
  • AdMob 在 Android 中需要哪些权限

    On 谷歌的网站他们只提到其中两个
  • 记录 Excel 自动完成的 VBA 代码

    使用VBA编写要在Excel中使用的自定义函数时 如何编写文档注释以便在自动填充公式期间自动显示Excel 例如 当我们开始输入 VLookUp 时 它会显示 Vlookup 作为工具提示的作用 显示输入变量名称 如果我们按功能区中的 插入
  • 静态变量被初始化两次

    考虑我在编译单元中有一个静态变量 它最终出现在static库 libA 然后我有另一个编译单元访问这个变量 最终出现在shared库 libB so 因此 libA 必须链接到 libB 最后我有一个 main 函数也直接从 A 访问静态变
  • iOS 7 - 调整状态栏

    我无法确定如何调整 iOS7 中的状态栏 我的视图控制器有一个tableView 我想要tableView在状态栏下启动 目前 它与状态栏重叠 顶部的标签是headerView in the tableView 我已通过 IB 在视图控制器
  • 矩阵列表中每个元素的平均值

    我有一个包含三个矩阵的列表 a lt matrix runif 100 b lt matrix runif 100 c lt matrix runif 100 mylist lt list a b c 我想获得三个矩阵中每个元素的平均值 我
  • Python3添加日志级别

    我有这段代码 对我来说效果很好 import logging import logging handlers logger None def create logger global logger logger logging getLog