Tenho um Docker Swarm com vários serviços em execução. Adicionei um serviço OSE syslog-ng usando https://github.com/linuxserver/docker-syslog-ng . A pilha syslog-ng tem o seguinte docker-compose.yml:
---
services:
syslog:
image: registry.local.net/syslog-ng:latest
ports:
- 514:514
volumes:
- /path/on/host/syslog-ng/config:/config
- /path/on/host/log:/log
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- LOG_TO_STDOUT=1
# healthcheck:
# test: ["CMD-SHELL", "/usr/sbin/syslog-ng-ctl healthcheck -c /config/syslog-ng.ctl || exit 1"]
# interval: 10s
# timeout: 2s
# retries: 3
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
update_config:
parallelism: 1
delay: 10s
networks:
syslog:
networks:
syslog:
external: true
e meu arquivo syslog-ng.conf é este:
@version: 4.2
@include "scl.conf"
options {
chain_hostnames(no);
flush_lines(0);
use_dns(no);
time_reopen(1);
};
source net {
tcp(ip(0.0.0.0) port(514));
};
template my_log_format {
template("$MSG\n");
};
filter f_access_log { program("httpd.access") };
destination d_logs {
file(
"/log/TEST"
owner("1000")
group("1000")
perm(0664)
template(my_log_format)
);
};
log {
source(net); filter(f_access_log); destination(d_logs);
};
Configurei um serviço Apache no Docker Swarm para enviar seus logs para o serviço syslog-ng usando logger -T -t httpd.accept -n syslog -P 514 --rfc3164
.
O Syslog-ng cria o arquivo de log configurado, recebe as linhas de log do Apache e as anexa ao arquivo de log configurado regularmente. Tudo parece estar funcionando do jeito que eu quero. O único problema é que o contêiner Docker syslog-ng continua saindo e reiniciando a cada 70-80 segundos. Tentei adicionar uma verificação de integridade (comentada acima), mas não mudou nada. A inspeção dos contêineres encerrados mostra que todas as verificações de integridade passam até o contêiner sair com o código de saída 137, e o log do Docker dos contêineres encerrados não exibe nada obviamente errado.
O arquivo de log atual do syslog-ng mostra o seguinte (menos os registros de data e hora no início de cada linha):
Accepting connections; addr='AF_INET(0.0.0.0:514)'
syslog-ng starting up; version='4.8.1'
Syslog connection accepted; fd='14', client='AF_INET(10.0.6.244:37126)', local='AF_INET(0.0.0.0:514)'
Segundos antes de um dos contêineres sair, top
dentro do contêiner estava escrito o seguinte:
top - 08:31:26 up 169 days, 17:44, 0 user, load average: 1.13, 1.05, 1.05
Tasks: 15 total, 1 running, 14 sleeping, 0 stopped, 0 zombie
%Cpu(s): 23.8 us, 1.8 sy, 0.0 ni, 73.9 id, 0.0 wa, 0.2 hi, 0.2 si, 0.0 st
MiB Mem : 7652.9 total, 405.8 free, 2924.0 used, 4968.6 buff/cache
MiB Swap: 8192.0 total, 7883.4 free, 308.6 used. 4728.9 avail Mem
EDIT: Achei que tinha encontrado uma solução adicionando
time-reap(30);
mark-freq(10);
para as opções globais do syslog-ng. O contêiner Docker ficou ativo por quase 5 minutos depois que eu fiz essa alteração inicialmente, mas agora ele voltou a sair e reiniciar a cada minuto ou mais, mesmo com essas opções.