Combine logs svlogd de diferentes serviços de runit

1

Eu quero executar um aplicativo Node.js com vários processos do Node executando exatamente o mesmo código. Estou usando o runit para iniciar e gerenciar os processos do Node, porque ele tem bom suporte ao Chef . Para ilustrar a configuração, imagine que estou executando dois diretórios de serviço do runit:

/ etc / sv / test-1 / run

#!/bin/sh
echo running test 1
sleep 9999

/ etc / sv / test-2 / run

#!/bin/sh
echo running test 2
sleep 9999

(Onde echo e sleep são espaços reservados de teste para executar o aplicativo Node real.)

Isso funciona muito bem ... exceto por padrão runit svlogd programa quer colocar os logs de cada serviço em diretórios separados. O problema é que não quero ter que procurar em vários lugares para ver todas as entradas de log de um aplicativo.

Minha primeira tentativa de obter svlogd para gravar no mesmo arquivo de log é a seguinte:

/etc/sv/test-1 / log / run

#!/bin/sh
exec svlogd -tt /var/log/test

/etc/sv/test-2 / log / run

#!/bin/sh
exec svlogd -tt /var/log/test

Apenas isso não funciona. Seja qual for o serviço de log iniciado primeiro, é executado corretamente. O serviço de log que inicia em segundo lugar não é executado porque está bloqueado pelo outro serviço de log. Para ilustrar:

$ sudo /etc/service/test-2/log/run
svlogd: warning: unable to lock directory: /var/log/test: temporary failure
svlogd: fatal: no functional log directories.

Qual é a melhor maneira de configurar isso? Como posso ter um local para procurar todas as entradas de log dos diferentes runit services que estão executando o mesmo código?

    
por Michael Kropat 07.02.2015 / 00:34

2 respostas

1

Use o 'logger' para o syslog

Se você estiver satisfeito com o syslog, use logger em vez de svlogd . O objetivo de ter um runcript para o seu logger é que você pode executar qualquer programa que desejar para fazer o registro.

/ etc / sv / test-1 / log / run

#!/bin/sh
exec logger -i -p daemon.notice -t my_service

.

Mesclar quando visualizado

Outra boa ideia é simplesmente deixar os logs irem para locais separados e, em seguida, usar um script que mescla os arquivos conforme você os visualiza. Por exemplo, com os timestamps de svlogd você pode apenas

cat /var/log/test/*/current | sort | less

Existem outras ferramentas robustas por aí que podem exibir vários arquivos de log simultaneamente, como multitail

    
por 10.02.2015 / 01:09
1

Até onde eu sei, svlogd não suporta a combinação de logs em um único arquivo. No entanto, ele suporta o log em um soquete. Minha solução é instruir svlogd a encaminhar as entradas de log sobre o UDP para a instância rsyslog em execução.

/etc/sv/test-1 / log / run

#!/bin/sh
exec svlogd -tt /var/log/test/1

/ var / log / test / 1 / config

ptest-1: 
U127.0.0.1

/etc/sv/test-2 / log / run

#!/bin/sh
exec svlogd -tt /var/log/test/2

/ var / log / test / 2 / config

ptest-2: 
U127.0.0.1

De lá, é apenas uma questão de configurar o rsyslog para fazer o que você quer.

    
por 09.02.2015 / 19:19