如何将 Docker 容器日志转发到 ELK?

nda*_*ess 8 logging syslog docker elk docker-compose

我想知道将我的 docker 容器日志转发到 ELK 服务器的最简单方法是什么,到目前为止,我在搜索互联网后尝试的解决方案根本不起作用。

基本上,我有一个使用 docker-compose 运行的 docker 映像,该容器不会在本地记录任何内容(它由不同的服务组成,但没有一个是 logstash 或其他任何服务),但我看到通过docker logs -tf imageNamedocker-compose logs. 由于我使用 compose 启动容器,因此我无法使用(或至少我不知道如何使用)--logs-driverdocker 选项。

因此,我想知道是否有人可以启发我,例如如何将该日志转发到 ELK 容器。

提前致谢,

问候

解决方案

感谢 madeddie,我可以通过以下方式解决我的问题,提到我使用了 madeddie 在他的帖子中建议的基本 ELK-stack-in-containers。

首先,我更新了docker-compose.yml我的容器文件,以按照 madeddie 告诉我的那样为日志记录引用添加条目,我为每个服务添加了一个条目,我的 docker-compose 片段如下所示

   version: '2'
    services:
      mosquitto:
        image: ansi/mosquitto
        ports:
          - "1883:1883" # Public access to MQTT
          - "12202:12202"  #mapping logs
        logging: 
           driver: gelf
           options: 
             gelf-address: udp://localhost:12202
    redis:
     image: redis
     command: redis-server --appendonly yes
     ports:
       - "6379:6379" # No public access to Redis
       - "12203:12203" #mapping logs
     volumes:
       - /home/dockeruser/redis-data:/data
     logging: 
       driver: gelf
       options: 
         gelf-address: udp://localhost:12203 
Run Code Online (Sandbox Code Playgroud)

其次,我必须为每个服务使用不同的端口号才能转发日志。

最后,我更新了我的 elk 容器docker-compose.yml文件以将我发送日志的每个 upd 端口映射到 logstash 监听的端口

logstash:
  build: logstash/
  command: logstash -f /etc/logstash/conf.d/logstash.conf
  volumes:
    - ./logstash/config:/etc/logstash/conf.d
  ports:
    - "5000:5000"
    - "12202:12201/udp" #mapping mosquitto logs
    - "12203:12201/udp" #mapping redis logs
Run Code Online (Sandbox Code Playgroud)

此配置并添加gelf {}in条目logstash.conf使其工作,正确设置 docker 服务的 IP 地址也很重要。

问候!

mad*_*die 5

Docker compose 有日志关键字: source

logging: 
  driver: syslog
  options: 
    syslog-address: "tcp://192.168.0.42:123"
Run Code Online (Sandbox Code Playgroud)

所以如果你知道从那里去哪里,那就去吧。

如果没有,我可以建议您查看dockergelf日志驱动程序logstash gelf 输入插件

例如,如果您要使用这个基本的 ELK-stack-in-containers 设置,您将更新- "12201:12201/udp"docker -compose 文件并将端口添加到 logstash。

logstash.conf输入部分编辑为:

input {
    tcp {
        port => 5000
    }
    gelf {
    }

}
Run Code Online (Sandbox Code Playgroud)

然后将您的容器配置为使用日志驱动程序gelf(而不是 syslog)和选项gelf-address=udp://ip_of_logstash:12201(而不是 syslog-address)。

您唯一需要注意的是 Docker 如何找到 Logstash 容器的 IP 地址或主机名。您可以通过 docker-compose 命名、Docker 链接或手动解决该问题。

Docker 和 ELK 功能强大、灵活,但因此也是庞大而复杂的野兽。准备投入一些认真的时间,阅读和实验。

在探索所有这些时,不要害怕提出新的(最好是非常具体的)问题。