Graylog: 使用 Python 发送日志

如何将日志从 Python 发送到 Graylog

👋 欢迎使用 Stackhero 文档!

Stackhero 提供即用型 Graylog 云 解决方案,具有众多优势,包括:

  • 包含无限制和专用的 SMTP 电子邮件服务器
  • 只需点击即可轻松完成更新
  • 使用 HTTPS 保护的可定制域名(例如,https://logs.your-company.com)。
  • 专用私有 VM提供的最佳性能和强大安全性

节省时间简化您的生活:只需 5 分钟即可试用 Stackhero 的 Graylog 云托管 解决方案!

将日志从 Python 发送到 Graylog 是一个简单的过程。本指南将介绍如何使用 graypylogging 包,将您的 Python 应用日志转发到 Graylog 实例。

首先,您需要在 Graylog 服务器上配置一个 GELF TCP 输入。

请进入 Graylog 管理面板。在“System” > “Inputs”下,创建一个类型为“GELF TCP”的新输入。请勾选“global”选项,为输入填写一个“title”,并确认端口设置为 12201。

不要在此处启用任何 TLS 选项。TLS 加密将由实例自带的反向代理处理。

输入配置输入配置

在 Stackhero 控制台中,选择您的 Graylog 服务并点击“Configure”。

确保 TCP 端口 12201 已正确设置,并且该端口已启用“TLS encryption”。保存更改以应用配置。

输入端口配置输入端口配置

请在服务的“Firewall”中检查,至少允许您的 IP 向 TCP 端口 12201 发送数据。测试时,建议临时允许所有 IP(0.0.0.0/0),这是默认设置。

本示例将使用 graypy 库。首先,使用 pip install graypy 安装该库。

然后,新建一个名为 graylog-example.py 的文件,并将 <XXXXXX>.stackhero-network.com 替换为您自己的服务器主机名。以下是一个示例脚本:

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

my_logger.debug('This is a test from a Python script!')

要查看日志,请打开 Graylog 管理面板,进入“Search”标签页,点击播放图标,并设置为每秒自动刷新。您可以通过以下命令运行脚本:

python graylog-example.py

脚本运行后,您的日志消息将被发送到 Graylog,您应该能在搜索结果中看到它。

Graylog 收到的第一条日志Graylog 收到的第一条日志

点击“This is a test from a Python script!”消息,可以查看详细信息,如脚本名称和生成日志的具体代码行。

日志详情日志详情

Graylog 不仅可以用于普通日志消息,还可以捕获并转发错误,帮助您更好地监控应用行为。这有助于通过邮件、Slack 或 Mattermost 等渠道及时收到问题通知。

下面的示例中,我们故意调用一个不存在的函数以生成错误。请记得将“<XXXXXX>.stackhero-network.com”替换为您的实例主机名。

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

try:
    unknown_function()
except NameError:
    my_logger.debug('The "unknown_function" raised an error', exc_info=1)

您可以像之前一样运行该脚本。在 Graylog 管理面板中,您会看到错误消息“NameError: name 'unknown_function' is not defined”以及完整的堆栈跟踪。

错误日志示例错误日志示例

虽然前面的示例已使用 TLS 加密,但并未进行证书校验。测试环境下这样做没问题,但在生产环境中,务必验证证书的有效性

您可以通过添加 validateca_certs 选项来启用证书校验,示例如下:

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201, validate=True, ca_certs='/etc/ssl/certs/ca-certificates.crt')

请确保 /etc/ssl/certs/ca-certificates.crt 文件在您的系统中存在:

  • Ubuntu/Debian 上,可通过 sudo apt install ca-certificates 安装。
  • Alpine Linux 上,使用 apk add ca-certificates 安装。
  • macOS 上,系统默认已安装,但文件名为 /etc/ssl/cert.pem

如果您的日志没有出现在 Graylog 中,请检查以下几点:

  1. 确认 Graylog 已有一个监听 12201 端口的 GELF TCP 输入,并且该输入启用 TLS。
  2. 在 Stackhero 控制台的“Configure”中,确认 12201 端口已配置为 TCP,并在“Input ports”下启用了 TLS。
  3. 检查 Stackhero 的防火墙设置,确保“12201/tcp”端口为“ACCEPT”,建议测试时将其置于规则首位,来源设置为 0.0.0.0/0。
  4. 在 Graylog 管理面板的“Search”中,确保查看的是最近一小时的日志,并设置为每秒自动刷新,以便及时捕获新消息。