首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python: Logging TypeError:在字符串格式化过程中并非所有参数都已转换

Python: Logging TypeError:在字符串格式化过程中并非所有参数都已转换
EN

Stack Overflow用户
提问于 2012-10-11 23:23:30
回答 4查看 42.6K关注 0票数 52

下面是我正在做的事情

代码语言:javascript
复制
>>> import logging
>>> logging.getLogger().setLevel(logging.INFO)
>>> from datetime import date
>>> date = date.today()
>>> logging.info('date={}', date)
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 846, in emit
    msg = self.format(record)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 723, in format
    return fmt.format(record)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 464, in format
    record.message = record.getMessage()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 328, in getMessage
    msg = msg % self.args
TypeError: not all arguments converted during string formatting
Logged from file <stdin>, line 1
>>> 

我的python版本是

代码语言:javascript
复制
$ python --version
Python 2.7.3

我该如何让它工作呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-11 23:48:32

您可以自己进行格式化:

代码语言:javascript
复制
logging.info('date={}'.format(date))

正如Martijn所指出的,这将始终运行字符串格式化,而使用日志记录模块将导致只有在消息实际被记录时才执行格式化。

票数 35
EN

Stack Overflow用户

发布于 2012-10-11 23:25:17

在使用日志记录模块时,不能使用新型格式;请使用%s而不是{}

代码语言:javascript
复制
logging.info('date=%s', date)

日志记录模块使用老式的%操作符来格式化日志字符串。有关更多详细信息,请参阅debug method

如果您确实想要使用str.format()字符串格式,请考虑使用在实际转换为字符串时应用格式“late”的自定义对象:

代码语言:javascript
复制
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)

__ = BraceMessage

logging.info(__('date={}', date))

这是Python 3 logging module documentation proposes的一种方法,它碰巧也适用于Python2。

票数 62
EN

Stack Overflow用户

发布于 2013-11-08 00:39:23

Martijn的答案是正确的,但如果您更喜欢使用日志记录的新样式格式,可以通过对Logger进行子类化来实现。

代码语言:javascript
复制
import logging

class LogRecord(logging.LogRecord):
    def getMessage(self):
        msg = self.msg
        if self.args:
            if isinstance(self.args, dict):
                msg = msg.format(**self.args)
            else:
                msg = msg.format(*self.args)
        return msg

class Logger(logging.Logger):
    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None):
        rv = LogRecord(name, level, fn, lno, msg, args, exc_info, func)
        if extra is not None:
            for key in extra:
                rv.__dict__[key] = extra[key]
        return rv

然后只需设置日志记录类:

代码语言:javascript
复制
logging.setLoggerClass(Logger)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12843099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档