文章 · 2022-03-25

Python应用日志采集到ELK排查实录

排查过程

1. 验证 Filebeat inputs

filebeat.inputs:
  - type: log
    paths:
      - /var/log/my_service/*.log
    fields:
      project: my_service

2. 临时软链压测

ln -s /var/log/my_service-neo /var/log/my_service

3. 溯源"后缀 -neo"

工程名改动 如果没同步到所有配置,就一定埋雷。

根因分析

解决方案

下文以方案 B 为例。

Python 端结构化日志

import logging
import logging.config
import json_log_formatter

formatter = json_log_formatter.JSONFormatter()

LOG_CONFIG = {
    "version": 1,
    "formatters": {
        "json": {
            "class": "json_log_formatter.JSONFormatter",
            "format": "%(asctime)s %(levelname)s %(name)s %(message)s"
        }
    },
    "handlers": {
        "file": {
            "class": "logging.handlers.TimedRotatingFileHandler",
            "filename": "/var/log/my_service-neo/app.log",
            "when": "midnight",
            "backupCount": 7,
            "formatter": "json"
        }
    },
    "root": {
        "handlers": ["file"],
        "level": "INFO"
    }
}

logging.config.dictConfig(LOG_CONFIG)
logger = logging.getLogger(__name__)

logger.info({"event": "service_start", "version": "1.2.3"})

Filebeat 动态拾取

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true
      templates:
        - condition:
            equals:
              kubernetes.labels.app: my_service-neo
          config:
            - type: log
              paths:
                - /var/log/my_service-neo/*.log
              json.keys_under_root: true
              json.add_error_key: true

日志落 ES

经验总结

© 2026 Yuxu Ge ·