Python日志如何跟踪主机名?

8

我正在这样使用Python日志:

logger = logging.getLogger("my_logger")
logger.info("Some text.")

我有一堆运行中的物联网设备(制作日志)。它们将其日志数据流式传输到数据库。为了区分来源,我需要包括源IP地址。
在日志记录中是否有获取主机名的方法?IP地址或主机名是否可以被跟踪在LogRecords中?
一般来说,添加主机名到LogRecord的最佳方式是什么?

他们正在添加一个定制的过滤器。你只需要做这些。 - rdas
4个回答

13

通过添加自定义日志过滤器和格式化程序,将主机名放入日志消息中,您可以实现此操作。

import logging, platform

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

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

handler = logging.StreamHandler()
handler.addFilter(HostnameFilter())
handler.setFormatter(logging.Formatter('%(asctime)s %(hostname)s: %(message)s', datefmt='%b %d %H:%M:%S'))

logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)

logger.info('Hello, world!')

我应该从哪里获取主机名以放入格式化程序中? - Intrastellar Explorer
你不需要手动注入日志模块,它会自动将信息添加到日志中,时间和其他字段同理。 - rdas
请查看日志记录对象的文档:https://docs.python.org/3/library/logging.html#logging.LogRecord - rdas
请查看此博客以获取示例 https://help.papertrailapp.com/kb/configuration/configuring-centralized-logging-from-python-apps/#examples - rdas
在博客中,他们似乎使用外部模块 socket.gethostname(),而在 LogRecord 文档中,他们手动输入 192.168.0.1。因此,基本上我必须从外部源获取主机名。 - Intrastellar Explorer
看起来@gobernador几个月后编辑了问题,并更新了实际主机名。 - Intrastellar Explorer

7
一个更简单的解决方案是在格式行中预先填充主机名。例如:
logging.basicConfig(
   #... your logging configuration,
   format="%(asctime)s {} %(message)s".format(socket.gethostname())
)

会生成类似格式的一行:

"%(asctime)s some-hostname %(message)s"

缺点是如果主机名更改,您需要重新启动服务/应用程序。对于大多数应用程序来说,这通常不是问题,特别是如果在docker / k8s上运行。


1
import logging
from logging import Formatter
from logging.handlers import SysLogHandler
from socket import gethostname

hostname = socket.gethostname()
syslog = SysLogHandler(('my.logging.domain', 601))
syslog.setFormatter(
    Formatter(
        '{asctime} %s {name}: {levelname:8} {message}' % hostname,
        datefmt='%b %d %H:%M:%S',
        style='{'
    )
)

logger = logging.getLogger('myident')
logger.addHandler(syslog)
logger.setLevel(logging.DEBUG)
logger.info('Hello, world!')

基于12,但跳过过滤器/动态主机名。使用Python 3.9.15和Papertrail进行测试。


0

最简单的方法是通过Polog库来实现。

安装它:

$ pip install pip

并使用:

from polog import log, config, file_writer

config.add_handlers(file_writer())
config.set(service_name='my_host_name')

log('message')

执行代码后,您将在控制台中看到类似以下内容:

[2022-10-26 19:26:04.759310] |    1    | UNKNOWN | MANUAL | "message" | where: my_host_name.?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接