Django APM场景下如何在Kibana关联Filebeat容器日志与ElasticAPM数据
问题根因及修复方案
核心问题梳理
你目前的配置存在3个关键问题,导致日志无法注入APM跟踪字段,最终无法和APM数据关联:
- APM Agent配置的
SECRET_TOKEN和APM Server的secret_token不一致,Agent无法正常和Server通信,不会生成跟踪上下文 - Python日志配置未添加ElasticAPM的日志过滤器,无法将当前请求的
trace.id/transaction.id/span.id注入到日志记录中 - Filebeat配置错误,修改Elasticsearch模块的pipeline对自定义的docker日志索引完全无效,且JSON字段解析配置错误
修复步骤
1. 修复Python Django侧配置
第一步:修正APM Agent密钥
将base.py中ELASTIC_APM的SECRET_TOKEN改为和apm-server.yml一致的token:
ELASTIC_APM = { "SERVICE_NAME": "app", "SECRET_TOKEN": "token", # 此处和APM Server配置对齐 "SERVER_URL": "http://192.168.100.100:8200", "ENVIRONMENT": "test", "LOG_ECS_REFORMATTING": "override", }
第二步:给日志Handler添加APM日志过滤器
修改setting/loggers/__init__.py的日志配置,给所有需要关联APM的Handler加上elasticapm.handlers.logging.LoggingFilter:
import os import ecs_logging from elasticapm.handlers.logging import LoggingFilter # 引入过滤器 LOG_LEVEL = os.environ.get("LOG_LEVEL") or "INFO" BASIC_LOGGER = { "handlers": ["console"], "level": LOG_LEVEL, "propagate": False, } LOGGING = { "version": 1, "disable_existing_loggers": False, "formatters": { "ecs_logging": {"()": ecs_logging.StdlibFormatter} }, "filters": { "elasticapm": {"()": LoggingFilter} # 声明APM过滤器 }, "handlers": { "file": { 'level': LOG_LEVEL, 'class': 'logging.FileHandler', 'filename': 'file.log', "formatter": "ecs_logging", "filters": ["elasticapm"] # 绑定过滤器 }, "console": { 'level': LOG_LEVEL, 'class': 'logging.StreamHandler', "formatter": "ecs_logging", "filters": ["elasticapm"] # 绑定过滤器 } }, "loggers": { **{logger: BASIC_LOGGER for logger in LOGGERS_LIST}, "django": {"handlers": ["file", "console"], 'level': LOG_LEVEL, "propagate": False} }, }
修改完成后重启Django服务,发送测试请求,此时本地file.log中会出现trace.id、transaction.id字段。
2. 修复Filebeat配置
修改/etc/filebeat/filebeat.yml,调整JSON解析配置,直接将日志字段展开到根目录,和APM字段对齐:
filebeat.inputs: - type: container paths: - '/var/lib/docker/containers/*/*.log' processors: - add_docker_metadata: host: "unix:///var/run/docker.sock" - decode_json_fields: fields: ["message"] target: "" # 此处改为空,将JSON字段直接展开到根目录,不放在json子对象下 overwrite_keys: true - add_fields: # 可选,补充service.name字段,加速Kibana关联 fields: service.name: app output.elasticsearch: hosts: ["192.168.100.100:9200"] indices: - index: "docker-%{[agent.version]}-%{+yyyy.MM.dd}" username: "elastic" password: "password" logging.json: true logging.metrics.enabled: false
你之前修改的/usr/share/filebeat/module/elasticsearch/server/ingest/pipeline-json.yml是Elasticsearch服务日志模块的配置,和当前的容器应用日志无关,可以改回原有配置。
3. 验证关联
配置完成后重启Filebeat:
- 先查看Elasticsearch中
docker-*索引的文档,确认存在trace.id、transaction.id、service.name字段 - 打开Kibana APM界面,任选一个事务,点击「关联日志」即可看到对应请求的所有日志
内容的提问来源于stack exchange,提问作者maar
相关产品推荐
相关产品推荐

