Como fazer o svlogd enviar logs via UDP

1

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?

    
por nbari 30.01.2016 / 11:44

1 resposta

0

Adicionando ld->udpaddr.sin_family =AF_INET; a svlogd.c

link

Patch do FreeBSD: link

Patch:

--- src/svlogd.c.orig   2016-03-06 13:48:35 UTC
+++ src/svlogd.c
@@ -430,6 +430,7 @@ unsigned int logdir_open(struct logdir *
   ld->name =(char*)fn;
   ld->ppid =0;
   ld->match ='+';
+  ld->udpaddr.sin_family =AF_INET;
   ld->udpaddr.sin_port =0;
   ld->udponly =0;
   while (! stralloc_copys(&ld->prefix, "")) pause_nomem();

UPDATE : Como uma alternativa para esse problema que está atualmente usando o link

    
por 06.03.2016 / 15:42