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 不仅可以用于普通日志消息,还可以捕获并转发错误,帮助您更好地监控应用行为。这有助于通过邮件、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”中,确保查看的是最近一小时的日志,并设置为每秒自动刷新,以便及时捕获新消息。