当前位置: 首页 > 面试题库 >

使用新的格式字符串记录变量数据

杨征
2023-03-14
问题内容

我将记录工具用于python
2.7.3。此Python版本的文档说:

日志记录包会早于较新的格式设置选项,例如str.format()和string.Template。这些更新的格式选项受支持…

我喜欢大括号的“新”格式。所以我正在尝试做类似的事情:

 log = logging.getLogger("some.logger")
 log.debug("format this message {0}", 1)

并得到错误:

TypeError:并非在字符串格式化期间转换了所有参数

我在这里想念什么?

PS我不想使用

log.debug("format this message {0}".format(1))

因为在这种情况下,无论记录器级别如何,消息总是被格式化。


问题答案:

编辑:
与这个答案不同,看看StyleAdapter@Dunes答案中的方法;它允许在调用记录器的方法(debug(),info(),error()等)时使用其他格式样式而无需样板。

更简单的解决方案是使用出色的logbook模块

import logbook
import sys

logbook.StreamHandler(sys.stdout).push_application()
logbook.debug('Format this message {k}', k=1)

或更完整的:

>>> import logbook
>>> import sys
>>> logbook.StreamHandler(sys.stdout).push_application()
>>> log = logbook.Logger('MyLog')
>>> log.debug('Format this message {k}', k=1)
[2017-05-06 21:46:52.578329] DEBUG: MyLog: Format this message 1

来自文档-使用其他格式样式:

记录调用(logger.debug(),logger.info()等)仅采用实际记录消息本身的位置参数,而关键字参数仅用于确定如何处理实际记录调用的选项(例如exc_info关键字参数)表示应该记录回溯信息,或extra关键字参数指示要添加到日志的其他上下文信息。因此,您不能使用str.format()或string.Template语法直接进行日志记录调用,因为日志记录包在内部使用%-formatting来合并格式字符串和变量参数。在保留向后兼容性的同时,不会进行任何更改,因为现有代码中存在的所有日志记录调用都将使用%格式的字符串。

和:

但是,有一种方法可以使用{}-和$-格式构造您的单个日志消息。回想一下,对于一条消息,您可以使用任意对象作为消息格式字符串,并且日志记录程序包将对该对象调用str()以获取实际的格式字符串。

复制粘贴到wherever模块:

class BraceMessage(object):
    def __init__(self, fmt, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

然后:

from wherever import BraceMessage as __

log.debug(__('Message with {0} {name}', 2, name='placeholders'))

注意:实际格式化会延迟到必要时才进行,例如,如果未记录DEBUG消息,则根本不会执行格式化。



 类似资料:
  • 我正在使用Python 3.8.8和包含的日志库。要在Python中使用通用字符串格式,我还想使用记录新的格式字符串变体。我还想使用日志字符串的延迟评估(因此没有或)。 根据这篇关于pylint的堆栈溢出帖子(因此pylint日志格式样式=new),以下变体应该可以工作。但是,日志记录中有一个异常。信息。 最后一行的例外情况如下: 我从异常消息推断,日志记录仍然需要使用旧式格式,即。 如何在登录P

  • 我想使用静态定义的模板来构建URL。 我正在尝试为此使用 ES6 字符串插值功能 预期结果:http://example.com/?name=John 实际结果:http://example.com/?name=${name} 如果这不能用字符串插值来实现,那么还有比<code>string.prototype更好的方法。替换like

  • 问题内容: SonarQube抱怨“ 字符串不包含格式说明符” 。使用时,尤其是方法“ ”。例如 它指的是这个规则:https : //wiki.sei.cmu.edu/confluence/display/c/FIO47-C.+Use+valid+format+strings 但是,在此规则中,我们可以找到以下引号: 每个转换规范都以%字符开头,后跟(按顺序) 零个或多个标志(以任何顺序),这些

  • 问题内容: 我想知道是否有可能在Java中使用String.format方法给出一个在零之前的整数? 例如: 1将变为001 2将变为002 … 11将变为011 12将变为012 … 526将保留为526 … 目前,我尝试了以下代码: 不幸的是,它在数字之前带有3个空格。可以在数字前加零吗? 问题答案: 使用格式说明为整数。的装置,该数目将是零填充,如果它是少于三个(在这种情况下)位。 有关其他

  • 问题内容: 如果我有一个字符串变量,谁的值是如何使用空格作为分隔符来对此进行标记?我会用吗? 问题答案: 使用外壳程序对未加引号的变量的自动标记化: 如果要更改定界符,则可以设置变量,该变量代表内部字段分隔符。的默认值是(空格,制表,换行)。 (请注意,在第二个示例中,我在第二行周围添加了括号。这创建了一个子shell,因此对的更改不会持续。您通常不想永久更改,因为它可能会对毫无疑问的shell命

  • 问题内容: 我有一个分配了字符串的变量,我想根据该字符串定义一个新变量。 问题答案: 你可以使用exec: