首页 > 解决方案 > Python 记录 YAML 格式与文字字符串连接的对齐方式

问题描述

我正在尝试使用 YAML 配置格式在 Python 3 应用程序中设置我的日志记录格式。但是,我发现自己无法按照我想要的方式对其进行格式化。

该格式使用 f 字符串插值来解释来自记录器的值。我想向这个解释值添加一个文字字符串,然后对齐并填充它。

这是我当前的配置:

formatters:
    complex:
        format: '{asctime} {name:<16} [{levelname:^9}] {funcName:16} {message}'
        datefmt: "%d/%m/%Y %H:%M:%S"
        style: '{'

我想要做的是将字符串附加():到 funcName 所以结果将是例如。

<somestuff> myfunction(): <somemessage>

YAML 允许我使用{funcName:16}():,但这会导致

myFunction (): <somemessage>

在随机 .py 文件中使用简单的打印函数时,我已经能够找到一种使用嵌套 f 字符串的方法

funcName = "myFunction"
print(f"<somestuff> {'f{funcName}():':16} <somemessage>")

这正确打印了消息

<somestuff> myfunction(): <somemessage>

但是将 YAML 格式化程序更改为相同只会给我带来一堆错误并且不起作用。

'{asctime} {name:<16} [{levelname:^9}] {"f{funcName}():":16} {message}'

我还尝试按照 f 字符串规范将 (): 符号放在双花括号中,但这也会导致错误。

有什么方法可以将字符串文字加入到解释的字符串中?

编辑:给出的错误是ValueError: unexpected '{' in field name

标签: pythonpython-3.xloggingyamlpyyaml

解决方案


PyYAML 源中没有field name(甚至field),因此 ValueError 不是来自不正确的 YAML 源。无论如何,PyYAML 通常会给出更容易识别的错误。

如果你这样做:

print("<somestuff> {'f{funcName}():':16} <somemessage>".format())

你得到错误:

ValueError: unexpected '{' in field name

这就是日志模块正在尝试做的事情。它不会将该字符串解释为 f 字符串,而是format()在内部使用该字符串,并带有适当的参数。


推荐阅读