You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 先查看Elasticsearch中docker-*索引的文档,确认存在trace.id、transaction.id、service.name字段
  2. 打开Kibana APM界面,任选一个事务,点击「关联日志」即可看到对应请求的所有日志

内容的提问来源于stack exchange,提问作者maar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:57:04