Logstash 本身是一个数据处理管道工具(主要通过配置文件运行),官方并没有提供专门的 Python SDK。不过,Python 应用程序可以通过多种方式与 Logstash 交互(如 TCP/UDP 协议发送数据、调用 Logstash 的 HTTP API 等),其中最常用的是通过第三方库简化日志发送流程。
常用的 Python 第三方库:python-logstash
python-logstash
是一个轻量级库,可帮助 Python 应用程序向 Logstash 发送结构化日志,支持标准的 logging
模块集成。
详细安装与使用教程
步骤 1:安装 python-logstash
通过 pip 安装库:
bash
pip install python-logstash
步骤 2:配置 Logstash 接收数据
Logstash 需要配置输入插件(Input)来接收 Python 发送的数据。这里以 TCP 输入插件 为例(最常用),创建一个 Logstash 配置文件(例如 logstash-python.conf
):
conf
input {
# 配置 TCP 输入,监听 5959 端口(可自定义)
tcp {
port => 5959
codec => json_lines # 解析 JSON 格式的日志
}
}
filter {
# 可选:添加过滤规则(如添加字段、转换格式等)
mutate {
add_field => { "source" => "python-app" } # 增加一个来源标识字段
}
}
output {
# 输出到控制台(测试用)
stdout { codec => rubydebug }
# 可选:输出到 Elasticsearch(需提前部署)
# elasticsearch {
# hosts => ["http://localhost:9200"]
# index => "python-logs-%{+YYYY.MM.dd}"
# }
}
步骤 3:启动 Logstash
使用上述配置文件启动 Logstash(确保已安装 Logstash 并配置环境变量):
bash
logstash -f logstash-python.conf
启动成功后,Logstash 会监听 5959
端口,等待接收 JSON 格式的日志数据。
步骤 4:Python 代码发送日志到 Logstash
使用 python-logstash
库结合 Python 标准 logging
模块发送日志,示例代码如下:
python
import logging
import logstash
import time
# 配置日志记录器
logger = logging.getLogger('python-logstash-logger')
logger.setLevel(logging.INFO)
# 连接到 Logstash(参数说明:
# host:Logstash 服务器 IP(本地为 localhost)
# port:Logstash 配置中 tcp 输入的端口(即 5959)
# version:Logstash 日志格式版本(1 或 0,默认 0)
logger.addHandler(logstash.TCPLogstashHandler(
host='localhost',
port=5959,
version=1
))
# 发送不同级别和格式的日志
if __name__ == "__main__":
# 基本文本日志
logger.info('这是一条普通信息日志')
# 带额外字段的结构化日志
extra = {
'user_id': '12345',
'action': 'login',
'duration': 1.23 # 操作耗时(秒)
}
logger.warning('用户登录警告', extra=extra)
# 错误日志
try:
1 / 0
except Exception as e:
logger.error('发生计算错误', exc_info=True, extra={'error_type': 'division_by_zero'})
time.sleep(1) # 确保日志发送完成
步骤 5:验证结果
运行 Python 代码后,查看 Logstash 启动窗口的输出,会看到类似以下的日志信息(rubydebug 格式):
ini
{
"message" => "这是一条普通信息日志",
"@version" => "1",
"@timestamp" => "2025-10-01T08:00:00.000Z",
"host" => "localhost",
"source" => "python-app",
"level" => "INFO"
}
# 带额外字段的日志会包含 user_id、action 等字段
其他交互方式
如果不想使用第三方库,也可以通过 Python 直接向 Logstash 发送数据:
- TCP 直接发送 :使用
socket
库建立 TCP 连接,发送 JSON 字符串。 - HTTP 发送 :若 Logstash 配置了
http
输入插件,可通过requests
库发送 POST 请求。
示例(TCP 直接发送,无需 python-logstash
):
python
import socket
import json
import time
# 连接 Logstash 的 TCP 端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 5959))
# 发送 JSON 格式日志
log_data = {
'message': '直接通过 TCP 发送的日志',
'level': 'DEBUG',
'timestamp': time.time()
}
s.sendall((json.dumps(log_data) + '\n').encode('utf-8'))
s.close()
注意事项
- Logstash 的端口和 IP 需与 Python 代码中的配置一致。
- 确保 Logstash 服务在 Python 程序运行前已启动。
- 生产环境中建议添加异常处理(如连接失败重试)。
- 若需发送大量日志,可考虑批量发送或使用异步方式。
通过以上方式,Python 应用程序可以高效地与 Logstash 集成,实现日志的收集和处理。