本文目录导读:

好问题!用ELK做Python日志收集,在大型项目里很常见,我来帮你分析一下是不是一定要用以及具体怎么用。
是不是一定要用ELK?
不一定,但推荐,根据场景不同,你可以有几种选择:
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 单机/小项目 | 文件日志 + tail -f |
简单够用 |
| 微服务/容器化 | ELK (Elasticsearch + Logstash + Kibana) | 集中化、可搜索 |
| 云原生 | EFK (Elasticsearch + Fluentd/Fluent Bit + Kibana) | 替代Logstash,更轻量 |
| 极简方案 | Graylog / Loki + Grafana | 更轻量或更视觉化 |
ELK的优点:强大的全文搜索、聚合分析和可视化,能快速定位问题。
缺点:资源消耗较大,配置稍复杂。
Python日志收集到ELK的完整流程
结构化的Python日志(推荐JSON格式)
import logging
import json
from datetime import datetime
class JsonFormatter(logging.Formatter):
def format(self, record):
log_entry = {
"timestamp": datetime.utcnow().isoformat(),
"level": record.levelname,
"logger": record.name,
"message": record.getMessage(),
}
if hasattr(record, 'extra_fields'):
log_entry.update(record.extra_fields)
return json.dumps(log_entry)
logger = logging.getLogger("my_app")
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logger.addHandler(handler)
logger.setLevel(logging.INFO)
# 使用
logger.info("用户登录成功", extra={"user_id": 123, "ip": "192.168.1.1"})
传输到Logstash(最直接的方式)
方式A:使用TCP/UDP直接发送(推荐)
# 安装依赖
# pip install python-logstash
import logging
from logstash import TCPLogstashHandler
logger = logging.getLogger("my_app")
handler = TCPLogstashHandler("localhost", 5000, version=1)
logger.addHandler(handler)
方式B:通过Filebeat采集文件日志(适合已有日志文件)
# filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/myapp/*.log
json.keys_under_root: true
json.overwrite_keys: true
output.logstash:
hosts: ["localhost:5044"]
Logstash接收配置
input {
beats {
port => 5044
}
tcp {
port => 5000
codec => json
}
}
filter {
# 可以解析时间、添加标签等
date {
match => ["timestamp", "ISO8601"]
}
mutate {
add_tag => ["python_app"]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "python-logs-%{+YYYY.MM.dd}"
}
}
快速测试(Docker一建启动ELK)
# 在项目目录创建 docker-compose.yml
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
logstash:
image: docker.elastic.co/logstash/logstash:7.17.0
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5000:5000"
- "5044:5044"
kibana:
image: docker.elastic.co/kibana/kibana:7.17.0
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
更现代化的替代方案
如果你觉得ELK太重,可以试试:
Loki + Grafana
- 更轻量、更便宜(基于对象存储)
- 主要做日志聚合,搜索能力稍弱
# 使用 promtail 或直接HTTP发送
import requests
import json
logs = [{
"streams": [{
"stream": {"app": "my_python_app", "env": "prod"},
"values": [[str(int(time.time() * 1e9)), json.dumps({
"message": "Hello from Python",
"level": "info"
})]]
}]
}]
requests.post("http://loki:3100/loki/api/v1/push", json=logs)
Graylog
- 比ELK简单,自带Web界面
- 支持GELF协议,Python集成方便
# pip install graypy
import graypy
handler = graypy.GELFUDPHandler("localhost", 12201)
logger.addHandler(handler)
总结建议
| 你的情况 | 推荐方案 |
|---|---|
| 个人项目/微服务 < 10个 | EFK(Fluentd替代Logstash) |
| 公司内部监控需求 | ELK(功能最全) |
| 云原生/K8s环境 | Loki + Grafana(成本低) |
| 快速搭建,不想折腾 | Graylog(开箱即用) |
一句话结论:ELK在Python日志收集里是成熟且强大的方案,但不是唯一方案,如果项目规模不大,可以先用Grafana Loki或者Graylog,更轻量,如果已经用了Elasticsearch做搜索,那ELK自然是不二之选。
有什么具体的使用场景或环境吗?我可以帮你进一步细化方案。