Python logging.conf重新加载配置

时间:2019-07-08 10:06:38

标签: python logging filter configuration handler

在我的python代码中,我从文件中读取了日志记录配置,在该文件中,我已将想要的格式放入了代码中。
当我尝试在运行时重新加载配置时,我放入格式化程序中的某些额外环境似乎丢失了,并且出现以下错误。

Traceback (most recent call last):
  File "/usr/lib64/python2.7/logging/__init__.py", line 861, in emit
    msg = self.format(record)
  File "/usr/lib64/python2.7/logging/__init__.py", line 734, in format
    return fmt.format(record)
  File "/usr/lib64/python2.7/logging/__init__.py", line 469, in format
    s = self._fmt % record.__dict__
KeyError: 'hostname'
Logged from file conn.py, line 304

要注意我的logging.conf是以下内容:

[formatter_simpleFormatter]
format=[%(levelname)s] %(asctime)s [ThId-%(threadName)-10s] [%(filename)s:%(funcName)s:%(lineno)s] [%(hostname)s] %(message)s
datefmt=%m/%d/%Y %I:%M:%S %p

其中通过以下代码在代码中设置了主机名

class HostnameFilter(logging.Filter):
    hostname = platform.node()

    def filter(self, record):
        record.hostname = HostnameFilter.hostname
        return True

## Log Logger.
class Logger:
    """!@brief
    Logger wrapper
    """
    def __init__(self):
        self.log = logging.getLogger("MYCONF")
        self.log.addFilter(HostnameFilter())

奇怪的是,错误似乎出现在类(conn.py)中,而不是我的,这也许是我正在使用的某些正在记录的库的代码。

这是流程吗?我还能做点什么吗?

1 个答案:

答案 0 :(得分:0)

因为格式化发生在处理程序中,并且记录到记录器中的事件会传递到该记录器的处理程序以及记录器层次结构中更进一步的处理程序中,因此您需要确保始终将hostname属性添加到记录-如果使用其他记录器来记录消息,则可能不是这种情况。尝试将过滤器附加到相关的处理程序,而不是记录程序。