python - 如何将自定义字段添加到 Python 日志格式字符串?

标签 python logging

我当前的格式字符串是:

formatter = logging.Formatter('%(asctime)s : %(message)s')

我想添加一个名为 app_name 的新字段,该字段在包含此格式化程序的每个脚本中都有不同的值。

import logging
formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')
syslog.setFormatter(formatter)
logger.addHandler(syslog)

但我不确定如何将该 app_name 值传递给记录器以插入到格式字符串中。我显然可以通过每次传递它来让它出现在日志消息中,但这很困惑。

我试过了:

logging.info('Log message', app_name='myapp')
logging.info('Log message', {'app_name', 'myapp'})
logging.info('Log message', 'myapp')

但没有任何作用。

最佳答案

您可以使用 LoggerAdapter因此您不必在每次记录调用时都传递额外的信息:

import logging
extra = {'app_name':'Super App'}

logger = logging.getLogger(__name__)
syslog = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')
syslog.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(syslog)

logger = logging.LoggerAdapter(logger, extra)
logger.info('The sky is so blue')

日志(类似)

2013-07-09 17:39:33,596 Super App : The sky is so blue

Filters也可用于添加上下文信息。

import logging

class AppFilter(logging.Filter):
    def filter(self, record):
        record.app_name = 'Super App'
        return True

logger = logging.getLogger(__name__)
logger.addFilter(AppFilter())
syslog = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s')
syslog.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(syslog)

logger.info('The sky is so blue')

产生类似的日志记录。

关于python - 如何将自定义字段添加到 Python 日志格式字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17558552/

相关文章:

python - 在 Python 中将函数分配给带有函数名称的字符串

python - 在声明中指定时如何自动验证字符串/Unicode 列最大长度?

python - Pandas 数据透视表中的多维乘法

python - Celery 日志被写入旧日志文件中

java - 通过 HTTP 为 Java 应用程序远程登录

python - virtualenv : ERROR - Failed to load fernet while encrypting value 上的 apache Airflow

python - 按类别计数

logging - 如何配置 WildFly 8.2.0 日志记录以仅显示调试级别的应用程序

java - 将 log4j.xml 转换为 log4j2.xml 的惰性方法

python - 使用 Flask 和 RotatingFileHandler 进行原子日志文件轮换