惰性记录器消息字符串评估

2024-04-24

我在 python 应用程序中使用标准 python 日志记录模块:



import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("log")
while True:
  logger.debug('Stupid log message " + ' '.join([str(i) for i in range(20)]) )
  # Do something
  

问题是,尽管未启用调试级别,但在每次循环迭代时都会评估该愚蠢的日志消息,这会严重损害性能。

有什么解决办法吗?

在 C++ 中我们有log4cxx提供如下宏的包:
LOG4CXX_DEBUG(logger, messasage)
这有效地评估为



if (log4cxx::debugEnabled(logger)) {
    log4cxx.log(logger,log4cxx::LOG4CXX_DEBUG, message)
}
  

但是由于Python中没有宏(AFAIK),是否有一种有效的方法来进行日志记录?


日志记录模块已经部分支持您想要做的事情。做这个:

log.debug("Some message: a=%s b=%s", a, b)

...而不是这个:

log.debug("Some message: a=%s b=%s" % (a, b))

日志记录模块足够智能,不会生成完整的日志消息,除非该消息实际记录在某处。

要将此功能应用于您的特定请求,您可以创建一个惰性连接类。

class lazyjoin:
    def __init__(self, s, items):
        self.s = s
        self.items = items
    def __str__(self):
        return self.s.join(self.items)

像这样使用它(注意生成器表达式的使用,增加了惰性):

logger.info('Stupid log message %s', lazyjoin(' ', (str(i) for i in range(20))))

这是一个展示其工作原理的演示。

>>> import logging
>>> logging.basicConfig(level=logging.INFO)
>>> logger = logging.getLogger("log")
>>> class DoNotStr:
...     def __str__(self):
...         raise AssertionError("the code should not have called this")
... 
>>> logger.info('Message %s', DoNotStr())
Traceback (most recent call last):
...
AssertionError: the code should not have called this
>>> logger.debug('Message %s', DoNotStr())
>>>

在演示中,logger.info() 调用遇到了断言错误,而 logger.debug() 则没有达到这一点。

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

惰性记录器消息字符串评估 的相关文章

  • ipdb 和 pdb++ 之间的区别?

    Python 有一个名为 pdb 的默认调试器 但社区创建了一些替代品 其中两个是ipdb https github com gotcha ipdb and pdb https github com pdbpp pdbpp 它们似乎迎合了相
  • 带有指针数组的 cython

    我在 python 中有一个 numpy ndarrays 列表 具有不同的长度 并且需要非常快速地访问 python 中的列表 我认为指针数组就可以解决问题 我试过 float type t list of arrays no of ar
  • 美丽的汤从谷歌搜索中提取href

    谷歌搜索给出了以下 HTML 的第一个结果 h3 class r a href https rads stackoverflow com amzn click com 0470284889 class l vst em Quantitati
  • 无法在 mysql 表中的值中使用破折号(-)[重复]

    这个问题在这里已经有答案了 我一直在尝试从 python 将数据插入 MYSQL 表 我的sql表中的字段是id token start time end time和no of trans 我想存储使用生成的令牌uuid4在令牌栏中 但由于
  • 创建圆形图像 PIL Tkinter

    Currently I have a zoom feature in my application that works very well however I d like the actual zoom box to be a circ
  • 创建一个打开文件并创建字典的函数

    我有一个正在处理的文件 我想创建一个读取文件并将内容放入字典中的函数 然后该字典需要通过 main 函数传递 这是主程序 它无法改变 我所做的一切都必须与主程序配合 def main sunspot dict file str raw in
  • 如何在Python中的BeautifulSoup4中使用.next_sibling时忽略空行

    由于我想删除 html 网站中重复的占位符 因此我使用 BeautifulSoup 的 next sibling 运算符 只要重复项位于同一行 就可以正常工作 参见数据 但有时它们之间有一个空行 所以我希望 next sibling 忽略它
  • 在 Python 3 中动态导入模块的问题

    我遇到的情况是 在我的 Python 3 项目中 在运行时必须包含某些模块 我在用着importlib import module为了这 第二次更新 我确实找到了一种方法来做一些接近我想要的事情 一些额外的代码可能会使我的一些链接稍微偏离一
  • Python 使用 M2Crypto 通过 S/MIME 对消息进行签名

    我现在花了几个小时 但找不到我的错误 我想要一个简单的例程来创建 S MIME 签名消息 稍后可以与 smtplib 一起使用 这是我到目前为止所拥有的 usr bin python2 7 coding utf 8 from future
  • 向 Python 2.6 添加 SSL 支持

    我尝试使用sslPython 2 6 中的模块 但我被告知它不可用 安装OpenSSL后 我重新编译2 6 但问题仍然存在 有什么建议么 您安装了 OpenSSL 开发库吗 我必须安装openssl devel例如 在 CentOS 上 在
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • Floyd-Warshall 算法:获取最短路径

    假设一个图由一个表示n x n维数邻接矩阵 我知道如何获得所有对的最短路径矩阵 但我想知道有没有办法追踪所有最短路径 Blow是python代码实现 v len graph for k in range 0 v for i in range
  • 为 Python 2.4 改进“with”语句的直接替换

    您能否建议一种方法来编写可在 Python 2 4 中使用的 with 语句的直接替换代码 这将是一个 hack 但它可以让我更好地将我的项目移植到 Python 2 4 EDIT 删除了不相关的元类草图 只需使用 try finally
  • 如何在 Python 中仅列出 zip 存档中的文件夹?

    如何仅列出 zip 存档中的文件夹 这将列出存档中的每个文件夹和文件 import zipfile file zipfile ZipFile samples sample zip r for name in file namelist pr
  • 如何在 Python 中执行相当于预处理器指令的操作?

    有没有办法在 Python 中执行以下预处理器指令 if DEBUG lt do some code gt else lt do some other code gt endif There s debug 这是编译器预处理的特殊值 if
  • 使用 Flask-SQLAlchemy 进行多对多多数据库连接

    我正在尝试使这个多对多联接与 Flask SQLAlchemy 和两个 MySQL 数据库一起工作 并且它非常接近 只是它为联接表使用了错误的数据库 这是基础知识 我有main db and vendor db 表格设置为main db u
  • 从 Python 中编译的正则表达式中提取命名组正则表达式模式

    我有一个 Python 正则表达式 其中包含多个命名组 但是 如果先前的组已匹配 则可能会错过与一组匹配的模式 因为似乎不允许重叠 举个例子 import re myText sgasgAAAaoasgosaegnsBBBausgisego
  • 使 matplotlib 图形默认看起来像 R?

    Is there a way to make matplotlib behave identically to R or almost like R in terms of plotting defaults For example R t
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 在读/写二进制数据结构时访问位域

    我正在为二进制格式编写一个解析器 这种二进制格式涉及不同的表 这些表同样采用二进制格式 通常包含不同的字段大小 其中 50 100 个之间 大多数这些结构都有位域 并且在 C 语言中表示时看起来像这样 struct myHeader uns

随机推荐

  • 使用 javascript 下载时 PDF 为空

    我有一个 Web 服务 可以在其响应中返回 PDF 文件内容 当用户单击链接时 我想将其下载为 pdf 文件 我在UI中编写的javascript代码如下 http get http MyPdfFileAPIstreamURl then f
  • 播放声音 Javascript/Jquery

    我正在构建一个基于 Ajax 的应用程序 它将在我们的本地 Intranet 网络上运行 现在 每次 Ajax 返回请求时 我都需要在客户端浏览器中播放声音 我想将声音文件 mp3 wav 放入我的 Web 服务器 Tomcat 目录中 应
  • React:获取 contentEditable div 内文本的值

    我正在使用一个contentEditablediv 并希望在调用提交时获取其中的文本 我试过this refs textarea value trim 但这似乎不起作用 我的代码在渲染返回中如下 div div
  • 在Python和XML中递归搜索父子组合并构建树

    我正在尝试遍历这个充满父子关系的 XML 数据 并且需要一种方法来构建树 任何帮助将不胜感激 另外 在这种情况下 父 gt 子关系有属性还是节点更好
  • 将原始 Scapy 数据解码为人类可读的数据

    我正在尝试改用 Scapy 而不是 Wireshark 但在解码我收到的数据时遇到问题 在 Wireshark 中 我可以轻松看到过滤数据包的最后一层 标记为 分布式交互式模拟 但在 Scapy 中 最后一层是 原始 我试图以相同的人类可读
  • 使用 jQuery 选择

    1天前我在这里问了一个大问题 但没有得到足够好的答案 所以我把问题分成几个部分 这是其中一部分 看看这段代码 div div div div
  • 如何在现有 UIKit 类(例如 UIColor)的扩展中添加初始值设定项?

    Swift 文档说 在扩展中添加初始值设定项是可能的 文档中的示例是关于将初始值设定项添加到struct Xcode 无法识别UIColor在我的便利初始化程序中指定的初始化程序 extension UIColor convenience
  • document.body.style.marginTop 在 JS 中返回空白字符串

    据我了解 some elem style maginTop 将返回带有元素上边距的字符串 相反 我总是得到一个空字符串 我想在 body 上使用它 但我也尝试在 div 上使用 但这也不起作用 console log document bo
  • 交错顶点提交如何提高性能?

    我已经阅读并看到了其他问题 这些问题通常都指向将顶点位置和颜色等交错到一个数组中的建议 因为这可以最大限度地减少从 cpu 发送到 gpu 的数据 我不清楚的是 即使使用交错数组 您仍然必须对位置和颜色指针进行单独的 GL 调用 OpenG
  • create-react-app/express 代理错误:无法代理请求(ECONNRESET)

    我使用 create react app 创建了一个 React 应用程序 并使用express generator 创建了一个 Express 服务器 我的反应应用程序正在运行http 本地主机 3000 http localhost 3
  • iText 设置加密错误

    我最近不得不升级到 iText 但在让 setEncryption 工作时遇到问题 我正在使用 iText 5 5 6 document new Document PageSize LETTER 36 36 72 72 writer Pdf
  • Servlet和路径参数如/xyz/{value}/test,如何在web.xml中映射?

    servlet是否支持url如下 xyz value test 其中值可以用文本或数字替换 如何在 web xml 中映射它 最好的选择是 URL 模式 xyz The 服务程序接口 https jakarta ee specificati
  • 使用 libgit2sharp 从分支中提取最新版本

    我在 C 解决方案中使用 libgit2sharp 切换到分支并提取最新更改 这是我正在使用的代码 public void FetchAll using var repo new Repository LocalGitPath foreac
  • AngularJS 嵌套指令中的双向数据绑定

    如果您需要更多信息或希望我澄清任何事情 请告诉我 我尝试了很多不同的方法来解决这个问题 但还没有找到解决方案 我对 angularJS 比较陌生 我正在尝试构建一个具有多层数据的应用程序 我在控制器 PageController 的主体范围
  • 如何使用 java.lang.Process 类向另一个进程提供输入

    假设有一个程序从标准输入中获取输入 例如 cin gt gt id 我想弄清楚的是如何执行该流程并向其标准输入提供一些输入 获取过程的输出对我来说不是问题 它工作正常 问题是如何使用以下方法为此类流程提供输入 java lang Proce
  • Laravel 5.2 分割字符串名字姓氏

    我有一个从全名表单传递的字符串 在我的数据库中 我存储名字和姓氏 我使用以下方法分割了字符串 name explode request gt name lastname array pop name firstname implode na
  • 将 InputStream 转换为固定长度字符串的 Stream

    Like in 将 InputStream 转换为给定字符集的 Stream https stackoverflow com questions 30336257 convert inputstream into streamstring
  • 将我的浏览器添加到 Android 的默认浏览器选择列表中?

    遵循以下建议如何将我的浏览器添加到 Android 的默认浏览器选择列表中 https stackoverflow com questions 7394369 how to add my browser in the default bro
  • JPA EntityManager 是否有无状态版本?

    休眠有一个会话的无状态版本 https docs jboss org hibernate orm 3 5 api org hibernate StatelessSession html JPA EntityManager 是否存在类似的东西
  • 惰性记录器消息字符串评估

    我在 python 应用程序中使用标准 python 日志记录模块 import logging logging basicConfig level logging INFO logger logging getLogger log whi