python - 使用 'extra' 时记录 key 错误

标签 python python-3.x logging

我有一个简单的日志记录设置:

extra = {'hostname': socket.gethostname(), 'ip': socket.gethostbyname(socket.gethostname()), 'user': getpass.getuser()}


def get_logger():
    logging.basicConfig(
        format='%(asctime)s # %(user)s # %(hostname)s # %(ip)s # %(message)s',
        datefmt='%m/%d/%Y %I:%M:%S')

    crawler_logger = logging.getLogger("crawler")
    crawler_logger.setLevel(logging.INFO)
    crawler_logger = logging.LoggerAdapter(crawler_logger, extra)
    return crawler_logger

我在所有日志中都使用此设置。一些例子:

logger.warning("Harmful URL # Potentially harmful url # %s" % url["url"])

logger.info("URL already exists: %s ", url_dict["url"])

logger.error("ERROR # ERROR while crawling url. %s" % e)

但是,每当我使用的任何库(例如 aiokafka)发生错误时,我的代码都会抛出“日志错误”,并带有 KeyError: 'user',即使'user' 键在额外字典中存在并被赋值。

错误的堆栈跟踪:

--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.6/logging/__init__.py", line 992, in emit
    msg = self.format(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 838, in format
    return fmt.format(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 578, in format
    s = self.formatMessage(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 547, in formatMessage
    return self._style.format(record)
  File "/usr/lib/python3.6/logging/__init__.py", line 391, in format
    return self._fmt % record.__dict__
KeyError: 'user'

我找不到任何解决方案,所以在这里询问。

最佳答案

通过仅为我的自定义记录器设置记录器格式化程序来修复,然后我(不知不觉地)为所有记录器设置记录器格式,如下所示:

logging.basicConfig(
        format='%(asctime)s # %(user)s # %(hostname)s # %(ip)s # %(message)s',
        datefmt='%m/%d/%Y %I:%M:%S')

修复版本:

extra = {'hostname': socket.gethostname(), 'ip': socket.gethostbyname(socket.gethostname()), 'user': getpass.getuser()}


def get_logger():
    app_logger = logging.getLogger(__name__)
    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s # %(user)s # %(hostname)s # %(ip)s # %(message)s',
    datefmt='%d/%m/%Y %I:%M:%S')
    handler.setFormatter(formatter)
    app_logger.addHandler(handler)
    app_logger.setLevel(logging.INFO)
    app_logger = logging.LoggerAdapter(app_logger, extra)
    return app_logger

关于python - 使用 'extra' 时记录 key 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50947000/

相关文章:

Python-3.x SIMPLE XPath 库

java - 如何在 $TOMCAT_HOME/logs 中为我的 servlet 创建命名日志?

python - 为什么在我的代码中 np.array**3 会导致与 (np.array/1)**3 不同的解决方案?

android - 为什么这个 shell 脚本将自己称为 python 脚本?

python - Keras `fit_generator` 验证准确度低,但 `fit` 验证准确度低

从加密的 PDF 中提取 Python 数据

python - 如何在 magic __getattr__ 中获取实例属性?

python - 如何在 debian stretch 中安装 pyqt5

java - 在 logging.properties 中自定义日志格式

java - quartz 调度器 : Log output of separate jobs to different log files