Graylog: 使用 Python 发送日志
如何将日志从 Python 发送到 Graylog
👋 欢迎阅读 Stackhero 文档!
Stackhero 提供现成的 Graylog 云 解决方案,具有众多优势,包括:
- 包含无限制和专用的 SMTP 电子邮件服务器。
- 只需点击即可轻松完成更新。
- 使用 HTTPS 保护的可定制域名(例如,https://logs.your-company.com)。
- 由专用私有 VM提供的最佳性能和强大安全性。
节省时间并简化您的生活:只需 5 分钟即可试用 Stackhero 的 Graylog 云托管 解决方案!
从 Python 向 Graylog 发送日志是一个简单的过程。本指南将介绍如何使用 graypy 和 logging 包,将您的 Python 应用程序日志转发到 Graylog 实例。
配置 Graylog
首先,您需要在 Graylog 服务器上配置一个 GELF TCP 输入。
请进入 Graylog 管理面板。在 “System” > “Inputs” 下,您可以创建一个类型为 “GELF TCP” 的新输入。请确保勾选 “global” 选项,为输入填写一个 “title”,并确认端口设置为 12201。
请不要在这里启用任何 TLS 选项。TLS 加密将由实例自带的反向代理处理。
输入配置
在 Stackhero 中配置您的服务
在 Stackhero 控制台中,选择您的 Graylog 服务并点击 “Configure”。
请确保 TCP 端口 12201 已正确设置,并且该端口已启用 “TLS encryption”。保存更改以应用配置。
输入端口配置
您需要在服务的 “Firewall” 中检查,至少允许您的 IP 向 TCP 端口 12201 发送数据。为了测试,您可以临时允许所有 IP(0.0.0.0/0),这是默认设置。
示例:从 Python 发送日志
本示例将使用 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 收到的第一条日志
点击消息 “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 加密,但并未进行证书校验。测试环境下这样做没问题,但在生产环境中,务必验证证书的有效性。
您可以通过添加 validate 和 ca_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 中没有看到日志,请检查以下几点:
- 确认 Graylog 已有一个监听 12201 端口的 GELF TCP 输入,并且该输入未启用 TLS。
- 在 Stackhero 控制台的 “Configure” 页面,确认 12201 端口已配置为 TCP 且在 “Input ports” 下启用了 TLS。
- 检查 Stackhero 的防火墙设置,确保 “12201/tcp” 端口为 “ACCEPT”,最好排在第一位,来源设置为 0.0.0.0/0(测试时)。
- 在 Graylog 管理面板的 “Search” 页面,确保查看的是最近一小时的日志,并设置为每秒自动刷新,以便及时看到新消息。