Configurei o rsyslog para encaminhar determinadas mensagens de log para um pipe nomeado /tmp/logger.pipe
. Em seguida, tenho um processo separado lendo o pipe nomeado. Seção relevante de/etc/rsyslog.conf
# Remote Logging (silly conditional rule needed for specific logging scenario)
$template RFC5424Format,"<%PRI%>1 %timegenerated:1:10:date-rfc3339%T%timegenerated:12:19:date-rfc3339%.%timegenerated:21:26:date-rfc3339%Z %HOSTNAME% - - -%msg%\n"
if ($msg contains 'remote="true"') then /tmp/logger.pipe;RFC5424Format
Permissões em /tmp/logger.pipe
prwxrwxrwx 1 ftp root
Estou implantando este aplicativo em duas máquinas diferentes. Uma máquina possui rsyslog v3.xx e a outra v5.xx
O aplicativo está funcionando perfeitamente na máquina com o rsyslog v5.xx. No entanto, estou tendo um comportamento estranho na máquina com o rsyslog v3.xx Especificamente:
- O rsyslogd às vezes leva uma eternidade para iniciar na inicialização (era muito rápido antes de eu adicionar a nova regra).
- Quando a leitura do processo
logger.pipe
é reiniciada, o rsyslogd parece parar de gravar dados no pipe nomeado após a retomada do processo de escuta. A única maneira de corrigir isso é reiniciar manualmente o rsyslogd
Existe algum truque com a configuração do rsyslog que estou perdendo ao trabalhar com pipes nomeados? Algum outro problema de permissão que eu possa estar ignorando? Estou confiante no aplicativo, pois ele tem funcionado de forma muito robusta com a versão v5.xx do rsyslog. Infelizmente não tenho como atualizar a versão v3.xx na máquina com a qual estou tendo problemas.
Alguma ideia?
Atualização: posso ter diagnosticado o problema - parece ser um problema em que o rsyslogd fecha a conexão de gravação com o canal se não houver leitores. No entanto, o aplicativo leitor usa fopen() que bloqueia até que haja um gravador correspondente.
Por alguma razão, isso não é um problema no rsyslog v5.xx:
- estado inicial onde rsyslogd e logger.out têm o pipe aberto com sucesso
- problema de reinicialização em _logger.out, rsyslogd ainda tem gravação aberta no pipe
- _logger.out é retomado e tudo funciona corretamente novamente
Mas esse comportamento é diferente no rsyslog v3.xx:
- estado inicial onde rsyslogd e logger.out têm o pipe aberto com sucesso
- problema de reinicialização em _logger.out, rsyslogd por algum motivo fecha a conexão com o pipe
No documento rsyslog, parece que o destino deve incluir um símbolo de barra vertical. Essa modificação resolveu meu problema de forma que o rsyslog mantivesse uma conexão aberta com o canal nomeado mesmo quando o leitor fosse fechado.
Não consigo explicar por que isso foi um problema apenas no rsyslog v3.xx.