【问题标题】:Python logging how to track hostname in logs?Python记录如何在日志中跟踪主机名?
【发布时间】:2019-04-09 02:08:19
【问题描述】:

我正在以这种方式使用 Python 日志记录:

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

我有一堆物联网设备都在运行(制作日志)。他们将日志数据流式传输到数据库。为了区分来源,我需要包含源 IP 地址。

有没有办法使用日志来获取主机名?是否在 LogRecords 中跟踪/跟踪 IP 地址或主机名?

一般来说,将主机名添加到 LogRecord 的最佳方法是什么?

【问题讨论】:

  • 他们正在添加自定义过滤器。这就是你所要做的。

标签: python logging python-logging


【解决方案1】:

您可以通过添加将主机名放入日志消息中的自定义日志过滤器和格式化程序来做到这一点。

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

【讨论】:

  • 我从哪里获得hostname 以放入格式化程序?
  • 你没有。日志记录模块会自动将其注入您的日志中。与时间和其他字段相同。
  • 查看日志记录对象的文档:docs.python.org/3/library/logging.html#logging.LogRecord
  • 查看此博客以获取示例 help.papertrailapp.com/kb/configuration/…
  • 在博客中他们似乎使用了外部模块socket.gethostname(),而在 LogRecord 文档中他们手动输入了192.168.0.1。所以基本上,我必须从外部来源获取主机名
【解决方案2】:

更简单的解决方案是使用主机名预先填充格式行。例如:

logging.basicConfig(
   #... your logging configuration,
   format="%(asctime)s {} %(message)s".format(socket.gethostname())
)

会生成类似的格式行

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2013-11-13
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多