将信息添加到Python日志记录中的每个日志消息中

时间:2020-03-15 10:09:41

标签: python python-3.x logging

我正在将Python与日志记录模块一起使用,并想将socket.hostname()添加到每条日志消息中,我必须对每条消息都运行此查询,并且不能使用

name = socket.hostname() 

,然后以名称

记录日志格式

我正在研究使用日志过滤器的this示例,但是我这里不需要过滤器,它是对每个日志消息的简单操作。

我如何获得想要的结果?

3 个答案:

答案 0 :(得分:2)

您可以使用过滤器向每封邮件添加信息:

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')

答案 1 :(得分:0)

您可以通过添加这样的自定义格式选项来配置logging模块

import logging

name = socket.hostname() 
logMessageFormat = '{}: %(levelname)s:%(message)s'.format(name)
logging.basicConfig(format=logMessageFormat, level=logging.DEBUG)

# Test new configuration
logger = logging.getLogger()
logger.info('Hello world')

# should print to the console
# <socketHostName>: INFO:Hello world

您可以在此处阅读有关自定义显示消息格式的更多信息 https://docs.python.org/3/howto/logging.html#changing-the-format-of-displayed-messages

答案 2 :(得分:0)

这是基于Philippe在使用dictConfig时的回答。此答案中演示的contextual filter使用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

请注意,过滤功能对我不起作用;只有过滤器类起作用。

接下来,基于this answer更新日志记录配置字典,如下所示:

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%的虚拟内存使用率。