gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:02:06 24 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以从 docker 发送日志容器stdout/stderrelasticsearch使用 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 用于此示例:
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配置:
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将日志推送到 logstash使用 gelf日志记录驱动程序( 注意 : logstash 地址是 localhost 因为 docker 服务发现不能用于解析服务名称 - 端口必须映射到主机并且日志记录驱动程序必须是使用 localhost 配置)将日志输出到 elasticsearch您可以在 kibana 中编制索引:

enter image description here

关于Docker:将写入容器内的日志文件发送到 ELK 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58545087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com