将自定义格式化程序类与 Python 的logging.config 模块结合使用

2024-01-17

我有以下日志记录类,当在代码中指定为格式化程序时,它可以正常工作。它通过在要记录的消息的开头添加一个字符串来扩展现有的格式化程序,以帮助显示消息的重要性。 (我不只是使用%(levelname)s在格式字符串中,因为我不想显示 DEBUG 或 INFO 前缀。)

class PrependErrorLevelFormatter(logging.Formatter):
    def __init__(self, default):
        self._default_formatter = default
    def format(self, record):
        if record.levelno == logging.WARNING:
            record.msg = "[WARNING] " + record.msg
        elif record.levelno == logging.ERROR:
            record.msg = "[ERROR] " + record.msg
        elif record.levelno == logging.CRITICAL:
            record.msg = "[CRITICAL] " + record.msg
        return self._default_formatter.format(record)

现在我希望能够通过logging.config.fileConfig()加载的配置文件来分配它。我尝试过这样的语法:

[formatter_PrependErrorLevelFormatter]
format=%(asctime)s  %(message)s
datefmt=%X
class=PrependErrorLevelFormatter

不幸的是,我在解析此类时遇到错误:

  File "C:\Python27\lib\logging\config.py", line 70, in fileConfig
    formatters = _create_formatters(cp)
  File "C:\Python27\lib\logging\config.py", line 127, in _create_formatters
    c = _resolve(class_name)
  File "C:\Python27\lib\logging\config.py", line 88, in _resolve
    found = __import__(used)
ImportError: No module named PrependErrorLevelFormatter

我尝试在类名前加上它所在模块的名称作为前缀,但得到相同的错误。即使它可以解析该类,由于我需要提供额外的默认格式化程序参数,它也可能无法工作。

如何使用logging.config系统达到我想要的结果?


当您使用 Python 2.7 时,您可以使用基于字典的配置dictConfig() http://docs.python.org/library/logging.config.html#logging.config.dictConfig: 这比fileConfig(),因为它允许使用任意可调用对象作为工厂返回,例如处理程序、格式化程序或过滤器。

If you have to use fileConfig(),你必须构造一个可调用的,它需要format and datefmt字符串值并返回类的实例。这classvalue 只需要解析为可调用的,而不是实际的类。这是一个有效的设置:这个要点 https://gist.github.com/1782815,我有一个文件custfmt.py其中包含格式化程序定义和脚本fcfgtest.py它通过使用它fileConfig()。只需将文件放入临时目录并运行fcfgtest.py- 你应该看到这样的输出:

20:17:59 debug message
20:17:59 info message
20:17:59 [WARNING] warning message
20:17:59 [ERROR] error message
20:17:59 [CRITICAL] critical message

这似乎就是你所需要的。

请注意,您可以为格式化程序使用替代设计,它应该执行相同的工作:

class AltCustomFormatter(logging.Formatter):
    def format(self, record):
        if record.levelno in (logging.WARNING,
                              logging.ERROR,
                              logging.CRITICAL):
            record.msg = '[%s] %s' % (record.levelname, record.msg)
        return super(AltCustomFormatter , self).format(record)

要使用它,您不需要单独的工厂函数,因此您只需使用

class=custfmt.AltCustomFormatter

代替

class=custfmt.factory

它应该可以工作 - 当我刚刚使用 Python 2.7.1 测试时它对我有用:-)

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

将自定义格式化程序类与 Python 的logging.config 模块结合使用 的相关文章

随机推荐

  • RubyMine 文件夹树不刷新

    今天首次在 Mac OSX Leopard 上使用 RubyMine 2 0 2 如果我在文件系统中创建文件 例如 使用脚本 生成 这些新文件不会出现在 ruby mine 中 我在重新启动程序时取得了有限的成功 因为 db 文件夹中的文件
  • 如何在 pandas DataFrame 中允许重复的列名

    我有一个数据框 我想更新该数据框的列名称 列名有重复的条目 下面的代码给出错误 无法从重复的轴重新索引 list alpha beta gamma alpha df pd DataFrame datframe columns list No
  • Spotify 最新更新:Autohotkeys 脚本损坏

    我曾经使用 AutoHotKey 脚本作为 Spotify 快捷方式 内置快捷方式有限 只有在应用程序处于焦点状态时才有效 我通常在工作时将其保留在后台 不管怎样 它之前已经更新了一百万次了 没有任何问题 但是我下载了最新的 Spotify
  • AVAssetExportSession 卡住(未启动)导出

    我尝试从照片库导出视频 但导出回调从未执行 我定期检查导出进度 进度始终为零 下面的代码在 99 9 的情况下都有效 但有时在某些设备上 绝对随机 它会停止工作 只有重新启动 iPhone 才有帮助 AVAssetExportSession
  • 为什么这封邮件会直接进入垃圾邮件箱?

    我正在使用以下脚本发送邮件 但这总是最终进入垃圾邮件文件夹 为什么 您在发送邮件时必须使用标头 以证明邮件是来自真实来源而不是机器人 尝试这个
  • 使用 CQRS 在 DDD 中进行命令验证

    我正在学习 DDD 并利用 CQRS 模式 我不明白如何在不从数据存储中读取的情况下验证命令处理程序中的业务规则 例如 克里斯想给阿什利一件礼物 该命令可能是 GiveGiftCommand 我什么时候才能验证克里斯确实拥有他想要赠送的礼物
  • PHP 购物车中买一送半价总计

    我正在用 PHP 创建一个购物车 其中一个特定的商品是买一送一半价 当用户购买该商品时 我希望从总数中扣除报价 但我坚持如何从数学上做到这一点 到目前为止 我在 if 循环中从数据库获取数据有类似的内容 total total arrayc
  • 内嵌显示单选按钮列表

    我的页面上有一些广播列表 我面临的问题是单选按钮的文本没有显示在单选按钮的内联中 我已将重复布局放入表和流中 但两者都不起作用 我尝试添加一种显示样式 内联 但这也不起作用 尽管它在复选框上起作用 并且我认为也许它在这里也起作用 这只是一个
  • 增强 Jquery 拖放演示

    我有一个非常匹配的要求这个 Jquery 演示 http jqueryui com demos droppable shopping cart 这是一个简单的购物车演示 基本上我需要对该演示进行两项增强 我需要文本输入以及可用的 产品 因此
  • BizTalk 内部和外部架构

    我在网上读到 您将 外部模式 与 内部模 式 分开 并且永远不要将 内部模式 暴露给任何外部参与者 如果我的解决方案仅充当消息总线来在两个现有系统之间创建松散耦合 我真的需要任何内部模式吗 System A makes a Request
  • 无法验证 Google 访问令牌(段数错误)

    我有非常简单的代码直接来自 Google 网站 https developers google com identity sign in web backend auth using a google api client library
  • 将执行动态查询的结果插入表中

    我有一个动态查询 strQuery执行时会产生包含很多列的结果 我想将此动态查询的结果插入到临时表中 我这样做是因为我想对临时表执行一些过滤并获得所需的结果 之前的帖子也问过类似的问题HERE https stackoverflow com
  • FileSystemWatcher 一段时间后停止引发事件

    我们构建了一个窗口服务来监听文件夹FileSystemWatcher 创建后我们处理文件等等 但几天后该活动停止工作 它有可能被垃圾收集器 GC 收集吗 GC 是否收集它的持有类 这是一个单例 我应该使用弱事件吗 我是否存在导致事件未注册的
  • 如何检测grails中渲染了哪个视图文件

    我必须知道grails 渲染时的视图文件 一种方法是过滤器中的 grails afterView 操作 在这里 我找不到一种方法来知道哪个视图文件已被渲染 那么 有没有什么方法可以让我知道哪个视图文件已被渲染方法渲染 这不太漂亮 但在大多数
  • 从 Word 中提取嵌入的 Excel 工作表数据

    我有一批嵌入了 Excel 工作表的 Word 文档 用户通过双击工作表图像并打开嵌入的 Excel 对象在 Excel 工作表中输入数据 我需要获取用户输入的数据 下面是 WORD VBA 其中引用了 Microsoft Excel 15
  • 预编译方面的语句与准备语句

    我理解使用Statement和PreparedStatement之间的主要区别 PreparedStatements允许传入参数 但我读到了两者之间的细微差别 即PreparedStatement 可以比通用语句更快 因为PreparedS
  • 使用对象的浅拷贝时出现双重释放错误...如何修复?

    如何从浅复制对象与原始对象中删除双重 删除 错误 一个简单的例子 class INT int p dynamic define here fancy constructors etc set int i p new int p i INT
  • 基于 WPF 和 MVVM 模式中的嵌套模型实体构建 ViewModel

    我在理解如何基于以下模型构建视图模型时遇到问题 我简化了模型以便更清晰 public class Hit public bool On get set public Track Track get set public class Trac
  • 使用 docker link 时拒绝连接到 RabbitMQ

    我有一个微服务应用程序 它有两个服务和一个用作它们之间通信的消息队列的rabbit mq 现在 我想将它们部署在docker上 我在以下代码中docker compose yml file 版本 3 服务 rabbitmq build Ra
  • 将自定义格式化程序类与 Python 的logging.config 模块结合使用

    我有以下日志记录类 当在代码中指定为格式化程序时 它可以正常工作 它通过在要记录的消息的开头添加一个字符串来扩展现有的格式化程序 以帮助显示消息的重要性 我不只是使用 levelname s在格式字符串中 因为我不想显示 DEBUG 或 I