Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python日志记录新样式格式字符串_Python 3.x_Python Logging - Fatal编程技术网

Python 3.x Python日志记录新样式格式字符串

Python 3.x Python日志记录新样式格式字符串,python-3.x,python-logging,Python 3.x,Python Logging,我正在使用包含日志库的Python 3.8.8。为了在Python中使用通用字符串格式,我还想使用{}记录新的格式字符串变量。我还希望使用日志字符串的延迟求值(因此没有“{}”.format(var)或f“{var}”) 根据关于pylint的堆栈溢出帖子(因此pylintlogging format style=new),以下变体应该可以工作。但是,logging.info中有一个异常 import logging logging.basicConfig(level=logging.INFO

我正在使用包含日志库的Python 3.8.8。为了在Python中使用通用字符串格式,我还想使用
{}
记录新的格式字符串变量。我还希望使用日志字符串的延迟求值(因此没有
“{}”.format(var)
f“{var}”

根据关于pylint的堆栈溢出帖子(因此pylint
logging format style=new
),以下变体应该可以工作。但是,
logging.info
中有一个异常

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()

var1 = "foo"
var2 = "blub"

logger.info("var1 {}, var2 {}", var1, var2) # Exception thrown!
最后一行中的例外情况如下:

--- Logging error ---
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/logging/__init__.py", line 1081, in emit
    msg = self.format(record)
  File "/usr/local/lib/python3.8/logging/__init__.py", line 925, in format
    return fmt.format(record)
  File "/usr/local/lib/python3.8/logging/__init__.py", line 664, in format
    record.message = record.getMessage()
  File "/usr/local/lib/python3.8/logging/__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: not all arguments converted during string formatting
我从异常消息推断,日志记录仍然需要使用
%s
的旧式格式


如何在登录Python 3.8.8时使用带有
{}
的新格式字符串变量,而不使用任何额外的包装函数(如其他一些有关堆栈溢出的文章所建议的)?虽然可以在pylint中定义,但如果没有任何包装函数,这可能是不可能的吗?

我认为Python字符串插值更容易使用:

logger.info(f“var1{var1},var2{var2}”)
实现,

if logger.isenablefor(logging.INFO):
logger.info(f“var1{var1},var2{var2}”)

这忽略了问题的全部要点。将一个不相关的字符串传递给
logger.X
将仅在该字符串发出no时插入该字符串。下一个最好的方法是继续使用
%s
或创建自定义样式:报告中没有提到需要延迟求值OP@MikeSlinn谢谢你的建议。你是对的,懒散的评估并不是我这边提到的,但这是我想要的。我已经更新了我的问题。关于您的答案,是的,它是有效的,但对我来说,使用
记录器。isEnabledFor
听起来不是一个优雅的解决方案,但更像是一个解决方案(特别是如果日志消息不只是一条,而且可能有很多条),这是否回答了您的问题?基本上,这仍然是事实:@jornsharpe感谢您的建议。在问这个问题之前,我已经看过了,但这并没有回答我的问题,因为首先,它是Python 2.7,其次,它使用了一些包装函数,通过已经使用的Python 3.8,我希望不再需要了。我发布的引用来自3.0最新文档,现有的日志调用没有使用%的情况并没有突然发生。你不喜欢这些答案并不意味着它们不是答案。@jonrsharpe我的第一个评论是对你第一个评论的回答。到目前为止,我还没有时间从日志文档中详细查看您的报价,但我现在检查了它。诚然,我希望从2.7到3.8已经有一些变化,但对我来说,这仍然不起作用,这也是一个完全有效和可接受的答案。请随意写下这个问题的答案,我会接受的。否则我会自己写问题的答案。