为什么AI应用需要专用日志管道
AI应用(如RAG问答、模型推理服务)与传统Web服务不同,日志中混杂着推理耗时、token消耗、向量检索命中、Prompt内容等关键指标。直接打印到stdout再人工grep,既无法关联多节点,也无法做实时告警。本文带你用Filebeat + Elasticsearch + Kibana搭建一个轻量级日志收集链路,重点解决结构化JSON日志的采集与可视化。
环境准备
假设你已有一台Linux服务器(Ubuntu 20.04+),Docker可用。我们将用Docker Compose启动ELK(Elasticsearch 8.11 + Kibana 8.11),并在宿主机上运行Filebeat采集Python日志。
# docker-compose.yml(简化版) version: '3' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 environment: - discovery.type=single-node - xpack.security.enabled=false ports: ["9200:9200"] kibana: image: docker.elastic.co/kibana/kibana:8.11.0 ports: ["5601:5601"] environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 depends_on: [elasticsearch]启动后验证:curl localhost:9200应返回集群信息。
第一步:让Python应用输出结构化JSON日志
在AI服务中,我们推荐使用python-json-logger。修改你的日志配置:
import logging from pythonjsonlogger import jsonlogger logger = logging.getLogger("ai_app") handler = logging.StreamHandler() formatter = jsonlogger.JsonFormatter( "%(asctime)s %(levelname)s %(name)s %(message)s %(request_id)s %(model)s %(latency_ms)s %(tokens)s" ) handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) # 使用示例 logger.info("rag_query", extra={ "request_id": "req_123", "model": "gpt-4o", "latency_ms": 1250, "tokens": 850 })输出形如:{"asctime":"2025-01-01 12:00:00","levelname":"INFO","message":"rag_query","request_id":"req_123",...}。这样Elasticsearch能自动映射字段类型,便于后续聚合。
第二步:Filebeat采集与解析
Filebeat读取日志文件并发送到ES。创建filebeat.yml:
filebeat.inputs: - type: filestream id: ai-app-logs paths: - /var/log/ai-app/*.log parsers: - ndjson: # 每行一个JSON对象 target: "" output.elasticsearch: hosts: ["localhost:9200"] index: "ai-logs-%{+yyyy.MM.dd}" setup.template.name: "ai-logs" setup.template.pattern: "ai-logs-*"启动Filebeat(二进制包或Docker均可):filebeat -e -c filebeat.yml。确保日志文件路径存在且应用有写权限。
第三步:在Kibana中验证与可视化
打开http://localhost:5601,进入Management → Index Patterns,创建ai-logs-*索引模式。然后到Discover查看日志:
- 筛选
levelname: ERROR快速定位错误。 - 用
latency_ms > 2000过滤慢请求。
创建可视化面板:
- 在Dashboard中新建聚合查询,按
model桶聚合,展示各模型平均tokens。 - 添加
request_id字段的曲线图,观察并发量。
进阶:关联推理链路
若你的AI应用内部有多个步骤(如检索→Prompt→推理),建议在日志中增加trace_id,并提前打印到所有子步骤。Kibana中可以用trace_id做过滤,查看一次完整请求的时间线。
验证效果
写个测试脚本随机产生日志,5分钟后在Kibana中应能看到:
- 结构化字段(
latency_ms等)可点击排序。 - 搜索
message: rag_query能返回所有推理记录。
至此,一套面向AI应用的轻量级日志监控系统已可用。后续可扩展告警(ElastAlert)或与Prometheus集成。