Я сейчас использую runit + svlogd для наблюдения за некоторыми приложениями, но при развертывании на нескольких машинах мне необходимо централизовать / унифицировать журналы в одном месте, чтобы упростить работу, иначе вход на каждую машину очень усложняет задачу.
Вместо отправки всех журналов хоста через системный журнал с чем-то вроде:
*.* remote.log.host
Я хотел бы отправлять только журналы, относящиеся к приложению, теоретически svlogd может это делать из документы:
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.
Содержание моего файла конфигурации /service/my-service/log/main/config
:
u127.0.0.1:5514
или
U127.0.0.1:5514
Для тестирования я создал очень простой UDP-сервер / клиент, но по неизвестной причине svlogd
не отправляет журналы, я также пробую с netcat
используя это:
nc -ul 5514
Скрипт запуска журнала, который я использую для этого /service/my-service/log/run
:
#!/bin/sh
exec svlogd -tt ./main
Единственное сообщение об ошибке, которое я получаю:
warning: failure sending through udp:
Работа, которую я использовал, - это позвонить logger
в сценарии запуска журнала, что-то вроде:
#!/bin/sh
exec chpst -u nobody logger -i -h remote.host.tld -P 42060 -t my-app
Но при таком подходе я теряю все преимущества svlogd, кроме sv status .
всегда включен / выключен (1,0), поскольку регистратор не работает как демон.
В конце я хотел бы сохранить журналы из svlogd, но они были доступны для работы ua.b.c.d[:port]
вариант.
Обновить: Выполнение ktrace вот что я получаю:
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 }
Любые идеи ?
Добавление ld->udpaddr.sin_family =AF_INET;
к svlogd.c
http://skarnet.org/cgi-bin/archive.cgi?2:mss:1163:201602:gpiglpbjdemlioaeabbn
Патч FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207747
Патч:
--- 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();
ОБНОВИТЬ: В качестве альтернативы этой проблеме в настоящее время используется https://immortal.run