Atualmente, estou usando o runit + svlogd para supervisionar alguns aplicativos, mas ao implantar em várias máquinas, tenho a necessidade de centralizar / unifique os logs em um único lugar para simplificar as coisas, caso contrário, o login em cada máquina torna as coisas muito complicadas.
Em vez de enviar todos os registros do host via syslog com algo como:
*.* remote.log.host
Gostaria de enviar apenas os logs relacionados ao aplicativo, em teoria, o svlogd é capaz de fazer isso, a partir dos documentos :
ua.b.c.d[:port]
tells svlogd to transmit the first len characters of selected log messages to the IP address a.b.c.d, port number port. If port isn’t set, the default port for syslog is used (514). len can be set through the -l option, see below. If svlogd has trouble sending udp packets, it writes error messages to the log directory. Attention: logging through udp is unreliable, and should be used in private networks only.
Ua.b.c.d[:port]
is the same as the u line above, but the log messages are no longer written to the log directory, but transmitted through udp only. Error messages from svlogd concerning sending udp packages still go to the log directory.
O conteúdo do meu arquivo de configuração /service/my-service/log/main/config
:
u127.0.0.1:5514
ou
U127.0.0.1:5514
Para testes, criei um servidor / cliente UDP muito básico, mas por uma razão desconhecida svlogd
não está enviando os logs, eu também dou uma chance com netcat
usando isto:
nc -ul 5514
O script de execução de log que estou usando para este /service/my-service/log/run
:
#!/bin/sh
exec svlogd -tt ./main
A única mensagem de erro que recebo é:
warning: failure sending through udp:
Um trabalho que tenho usado é chamar logger
dentro do script de execução de log, algo como:
#!/bin/sh
exec chpst -u nobody logger -i -h remote.host.tld -P 42060 -t my-app
Mas com essa abordagem eu perco toda a vantagem do svlogd além do sv status .
estar sempre ligado / desligado (1,0) já que o logger não roda como daemon.
No final, eu gostaria de continuar tendo os logs do svlogd, mas disponíveis para fazer funcionar a opção ua.b.c.d[:port]
.
Atualizar : Fazendo um ktrace é isso que eu recebo:
4909 svlogd CALL socket(PF_INET,SOCK_DGRAM,IPPROTO_IP)
4909 svlogd RET socket 7
4909 svlogd CALL fcntl(0x7,F_GETFL,0)
4909 svlogd RET fcntl 2
4909 svlogd CALL fcntl(0x7,F_SETFL,0x6<O_RDWR|O_NONBLOCK>)
4909 svlogd RET fcntl 0
4909 svlogd CALL sendto(0x7,0x609580,0x3c,0,0x609c3c,0x10)
4909 svlogd STRU struct sockaddr { AF_UNSPEC, unknown address family }
4909 svlogd RET sendto -1 errno 47 Address family not supported by protocol family
4909 svlogd CALL write(0x6,0x609760,0x62)
4909 svlogd GIO fd 6 wrote 98 bytes
"warning: failure sending through udp:
STRU struct sockaddr { AF_UNSPEC, unknown address family }
Alguma idéia?