我正在这样使用Python日志:
logger = logging.getLogger("my_logger")
logger.info("Some text.")
我有一堆运行中的物联网设备(制作日志)。它们将其日志数据流式传输到数据库。为了区分来源,我需要包括源IP地址。
在日志记录中是否有获取主机名的方法?IP地址或主机名是否可以被跟踪在LogRecords中?
一般来说,添加主机名到LogRecord的最佳方式是什么?
我正在这样使用Python日志:
logger = logging.getLogger("my_logger")
logger.info("Some text.")
通过添加自定义日志过滤器和格式化程序,将主机名放入日志消息中,您可以实现此操作。
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!')
socket.gethostname()
,而在 LogRecord 文档中,他们手动输入 192.168.0.1
。因此,基本上我必须从外部源获取主机名。 - Intrastellar Explorerlogging.basicConfig(
#... your logging configuration,
format="%(asctime)s {} %(message)s".format(socket.gethostname())
)
会生成类似格式的一行:
"%(asctime)s some-hostname %(message)s"
缺点是如果主机名更改,您需要重新启动服务/应用程序。对于大多数应用程序来说,这通常不是问题,特别是如果在docker / k8s上运行。
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!')
最简单的方法是通过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.?