【问题标题】:Logging Key Error while using 'extra'使用“额外”时记录密钥错误
【发布时间】:2018-06-20 11:19:18
【问题描述】:

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

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' 的“Logging Error”,即使'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'

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

【问题讨论】:

    标签: python python-3.x logging


    【解决方案1】:

    在我(在不知不觉中)为所有记录器设置记录器格式之前,只为我的自定义记录器设置记录器格式化程序修复:

    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
    

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2018-12-22
      • 2014-04-19
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多