我正在使用Python的logging模块,并且希望将socket.hostname()添加到每条日志消息中,我必须运行此查询来处理每个消息,无法使用
name = socket.hostname()
然后使用名称格式记录日志
我正在研究this使用日志过滤器的示例,但我需要的不是过滤器,而是对每个日志消息的简单操作。
我该如何实现所需的结果?
我正在使用Python的logging模块,并且希望将socket.hostname()添加到每条日志消息中,我必须运行此查询来处理每个消息,无法使用
name = socket.hostname()
然后使用名称格式记录日志
我正在研究this使用日志过滤器的示例,但我需要的不是过滤器,而是对每个日志消息的简单操作。
我该如何实现所需的结果?
在使用dictConfig
的基础上,借鉴了Philippe的回答。该回答中演示的上下文过滤器使用psutil
将当前CPU和内存使用率百分比记录在每个日志消息中。
将此文件保存在例如mypackage/util/logging.py
:
"""logging utiliies."""
import logging
from psutil import cpu_percent, virtual_memory
class PsutilFilter(logging.Filter):
"""psutil logging filter."""
def filter(self, record: logging.LogRecord) -> bool:
"""Add contextual information about the currently used CPU and virtual memory percentages into the given log record."""
record.psutil = f"c{cpu_percent():02.0f}m{virtual_memory().percent:02.0f}" # type: ignore
return True
LOGGING_CONFIG = {
...,
"filters": {"psutil": {"()": "mypackage.util.logging.PsutilFilter"}},
"handlers": {"console": {..., "filters": ["psutil"]}},
"formatters": {
"detailed": {
"format": "%(asctime)s %(levelname)s %(psutil)s %(process)x:%(threadName)s:%(name)s:%(lineno)d:%(funcName)s: %(message)s"
}
},
}
尝试记录一些内容,查看类似于以下示例输出:
2020-05-16 01:06:08,973 INFO c68m51 3c:MainThread:mypackage.mymodule:27:myfunction: This is my log message.
c68m51
表示 68% 的 CPU 和 51% 的内存使用率。import logging
import socket
class ContextFilter(logging.Filter):
def filter(self, record):
record.hostname = socket.gethostname()
return True
if __name__ == '__main__':
levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)-15s hostname: %(hostname)-15s : %(message)s')
a1 = logging.getLogger('a.b.c')
f = ContextFilter()
a1.addFilter(f)
a1.debug('A debug message')