【问题标题】:Docker: Ship log files being written inside containers to ELK stackDocker:将写入容器内的日志文件发送到 ELK 堆栈
【发布时间】:2020-02-21 00:19:12
【问题描述】:

我正在使用docker 运行django 应用程序,并使用python 登录django 设置在日志文件夹中写入api 日志。当我重新启动容器时,我的日志文件也会被删除(这是可以理解的)。

我想将我的日志(例如/path/to/workdir/logs/django.log)发送到elasticsearch。我很困惑,因为我的搜索告诉我发送这条路径/var/lib/docker/containers/*/*.log,但我认为这不是我想要的。

关于如何将容器内的日志发送到 ELK Stack 有什么想法吗?

【问题讨论】:

  • /path/to/workdir/logs/django.log 是容器内的位置,/var/lib/docker/containers/<container>/.log 指的是docker 主机上的位置(我不确定该路径在docker 的最新版本中是否相关) - 可能是过时的资源(?)。我会将django 日志输出到stdout / stderr,使用gelf 日志驱动程序配置docker 服务,使用logstash 使用输出到ES 的logstash 插件。
  • 做出正确的答案。
  • @PaulBecotte 确定,等我有时间我会发布一个功能示例。

标签: docker elasticsearch docker-container


【解决方案1】:

您可以使用 gelf 日志驱动程序将日志从 docker 容器 stdout / stderr 发送到 elasticsearch。

使用 gelf 日志记录驱动程序 (docker-compose.yml) 配置服务:

version: '3.7'
x-logging:
  &logstash
  options:
    gelf-address: "udp://localhost:12201"
  driver: gelf
services:
  nginx:
    image: 'nginx:1.17.3'
    hostname: 'nginx'
    domainname: 'example.com'
    depends_on:
    - 'logstash'
    ports:
    - '80:80'
    volumes:
    - '${PWD}/nginx/nginx.conf:/etc/nginx/nginx.conf:ro'
    logging: *logstash
  elasticsearch:
    image: 'elasticsearch:7.1.1'
    environment:
    - 'discovery.type=single-node'
    volumes:
    - 'elasticsearch:/usr/share/elasticsearch/data'
    expose:
    - '9200'
    - '9300'
  kibana:
    image: 'kibana:7.1.1'
    depends_on:
    - 'elasticsearch'
    ports:
    - '5601:5601'
    volumes:
    - '${PWD}/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml'
  logstash:
    build: 'logstash'
    depends_on:
    - 'elasticsearch'
    volumes:
    - 'logstash:/usr/share/logstash/data'
    ports:
    - '12201:12201/udp'
    - '10514:10514/udp'
volumes:
  elasticsearch:
  logstash:

注意:以上示例使用extension fields 配置日志记录。

本例使用的minimal nginx.conf:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log debug;

pid /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
  server {
    listen 80;
    server_name _;

    location / {
      return 200 'OK';
    }
  }
}

logstash 图像是使用以下Dockerfile 自定义构建的:

FROM logstash:7.1.1

USER 0
COPY pipeline/gelf.cfg /usr/share/logstash/pipeline
COPY pipeline/pipelines.yml /usr/share/logstash/config
COPY settings/logstash.yml /usr/share/logstash/config
COPY patterns /usr/share/logstash/patterns

RUN rm /usr/share/logstash/pipeline/logstash.conf
RUN chown -R 1000:0 /usr/share/logstash/pipeline /usr/share/logstash/patterns /usr/share/logstash/config
USER 1000

...相关的logstashgelf plugin配置:

input {
  gelf {
    type => docker
    port => 12201
  }
}

filter { }

output {
  if [type] == "docker" {
    elasticsearch { hosts => ["elasticsearch:9200"] }
    stdout { codec => rubydebug }
  }
}

...和pipelines.yml:

- pipeline.id: "gelf"
  path.config: "/usr/share/logstash/pipeline/gelf.cfg"

...和logstash.yml 来持久化数据:

queue:
  type: persisted
  drain: true

容器中运行的进程将日志记录到stdout/stderr,docker 使用gelf 日志驱动程序将日志推送到logstash(注意:logstash地址是localhost,因为docker 服务发现不可用于解析服务名称 - 端口必须映射到主机,并且必须使用localhost 配置日志驱动程序,它将日志输出到elasticsearch你可以索引kibana:

【讨论】:

  • 自定义logstash Dockerfile中引用的文件logstash/settings/logstash.yml的内容是什么?
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多