Docker:将正在容器中写入的日志文件发送到ELK堆栈中

问题描述 投票:1回答:1

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

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

关于如何将容器中的原木运送到ELK Stack的任何想法?

docker elasticsearch docker-container
1个回答
0
投票

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

使用gelf日志记录驱动程序(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

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 配置:

logstash

...和gelf plugin

gelf

在容器中运行的进程将日志记录到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" 使用stdout日志记录驱动程序将日志推入stderrnotedocker地址为[C0 ],因为无法使用logstash服务发现来解析服务名称-必须将端口映射到主机,并且必须使用gelf配置日志记录驱动程序),这会将日志输出到logstash,您可以在其中建立索引localhost

docker

© www.soinside.com 2019 - 2024. All rights reserved.