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 不仅仅用于普通日志消息。您还可以捕获并转发错误日志,以便更好地了解应用程序的运行状况。这有助于您通过 Email、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” 页面,确保查看的是最近一小时的日志,并设置为每秒自动刷新,以便及时看到新消息。