Como encaminhar logs do contêiner Docker para ELK?

Eu gostaria de saber qual é a maneira mais fácil de encaminhar meus logs de contêiner do docker para um servidor ELK, até agora as soluções que tentei depois de ter pesquisado na internet não funcionaram.

Basicamente, tenho uma imagem docker que executo usando docker-compose, este contêiner não registra nada localmente (é composto de serviços diferentes, mas nenhum deles é logstash ou qualquer outra coisa), mas vejo o log docker logs -tf imageName ou docker-compose logs. Como estou iniciando os contêineres com compose, não posso fazer uso (ou pelo menos não sei como) do --logs-driver opção do docker.

Portanto, gostaria de saber se alguém pode me esclarecer um pouco sobre como encaminhar esses logs para um contêiner ELK, por exemplo.

Obrigado antecipadamente,

Cumprimento

SOLUCAO:

Graças ao madeddie, consegui resolver meu problema da seguinte maneira, mencione que usei os contêineres básicos ELK-stack-in-containers que madeddie sugeriu em seu post.

Primeiro eu atualizo o docker-compose.yml arquivo do meu contêiner para adicionar entradas para a referência de registro como madeddie me disse, incluí uma entrada por serviço, um trecho do meu docker-compose se parece com isso

   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 

Em segundo lugar, tive que usar um número de porta diferente por sevice para poder encaminhar os logs.

Finalmente, atualizei meu contêiner elk docker-compose.yml arquivo para mapear cada uma das portas upd onde eu estava enviando meus logs para aquela que o logstash escuta

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

Esta configuração e adicionando a entrada de gelf {} em logstash.conf fez funcionar, é importante também configurar corretamente o endereço IP do serviço docker.

Cumprimentos!

Docker compose tem a palavra-chave logging:fonte

logging:   driver: syslog  options:     syslog-address: "tcp://192.168.0.42:123"

Então, se você sabe para onde ir a partir daí, vá em frente.

Se não, eu posso aconselhá-lo a olhar para o gelf driver de registro para docker e o Logstash gelf input plugin

Se você, por exemplo, usar presente configuração básica de ELK-stack-in-containers, você atualizaria o arquivo docker-compose e adicionaria porta - "12201:12201/udp" para logstash.

Editar o logstash.conf seção de entrada para:

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

Em seguida, configure seus contêineres para usar o driver de registro gelf (não syslog) e a opção gelf-address=udp://ip_of_logstash:12201 (em vez de syslog-address).

A única mágica que você terá que cuidar é como o Docker encontrará o endereço IP ou o nome do host do contêiner Logstash. Você pode resolver isso por meio de nomenclatura docker-compose, links Docker ou apenas manualmente.

Docker e ELK são bestas poderosas, flexíveis, mas, portanto, também grandes e complexas. Prepare-se para colocar em algum tempo sério, na leitura e experimentação.

Não tenha medo de abrir novas (e de preferência muito específicas) perguntas que você encontrar enquanto explora tudo isso.

você configura a porta 12201 por serviço? porque você não deveria

Não entendo completamente, você quer dizer que minha opção ‘logging’ deve estar no mesmo nível de tag` services ’ por contêiner?

a palavra-chave de registro não abre uma porta para ouvir, ela configura onde o docker se conecta to. Estou falando sobre os mapeamentos de porta que você faz em cada contêiner, você só pode abrir uma porta uma vez, mas você não deve abrir uma porta para fazer logon each container, apenas o Logstash. O problema está no uso de " localhost “como host do Endpoint geld, em vez de localhost você deve usar o IP da máquina onde o contêiner logstash está sendo executado ou 172.17.0.1 se todos os contêineres estiverem no mesmo host ou usar” logstash " se todos os contêineres forem iniciados com o mesmo arquivo de composição.

@ madeddie estou enfrentando um pequeno problema com essa pilha elk, posso ver que kibana ou elasticsearch reinicializa cerca de 2 horas ou mais, Você também viu esse comportamento? Se eu definir minhas imagens para as mais recentes, em vez das de compilação, essa pilha ainda funcionaria?

Eu sei o que você quer dizer agora, acho que tentei isso antes de obter o erro de que a porta já estava em uso, mas posso dar uma segunda tentativa. Obrigado novamente

@ madeddie para ter menos carga no meu servidor, eu queria alterar o destino da porta, no entanto, não consigo maneage para fazê-lo funcionar. Eu adicionei uma linha como esta ’ gelf-address: udp://172.17.0.1: 12201em cada serviço, obtendo erro ao iniciar os Serviços devido à porta em usoerro : para redis driver falhou na programação conectividade externa no endpoint ttnbackend_redis_1:Bind para 0.0.0.0: 12201 falhou: a porta já está alocada
Erro: para o driver do corretor falhou programação conectividade externa no endpoint ttnbackend_broker_1: Bind para 0.0.0.0: 12201 falhou: a porta já está alocada`

Tentei fazer isso, mas ao executar docker-compose up, vi uma reclamação de que a porta já estava em uso.

sim, porque você abre uma porta para logstash em _todos os seus contêineres, enquanto você só deve abri-lo para o contêiner logstash. não há necessidade de todos os outros contêineres ouvirem conexões logstash, portanto, eles não precisam abrir uma porta para isso.

Acho que sim, devo adicionar apenas uma linha como ‘gelf-address: udp: / / 172.17.0.1’? Então ele vai reclamar que precisa de um porto

Hoje em dia eu continuo usando a solução" o encaminhamento de porta"…