Eu estava tentando construir um servidor Syslog personalizado na plataforma Windows, o qual, para começar, estou implementando um listener TCP básico (servidor). Eu encontrei o problema e perguntei isso no StackOverflow: Pergunta .
Mais tarde, percebi que o problema existe mesmo quando eu uso dois Rsyslogs em duas máquinas linux separadas.
Este é o rsyslog.conf na máquina do cliente:
local3.* @@192.168.1.199:514
Este é o rsyslog.conf na máquina do servidor:
local3.* /var/log/test.log
Este é o script (no cliente) para enviar mensagens de log:
#!/bin/dash
for i in 1 2 3 4 5 6 7 8 9 10
do
logger -i -t Test -p local3.debug "This is test $i"
done
Este é o arquivo de saída recebido na máquina do servidor (test.log):
2016-08-02T00:10:33-07:00 ubuntu Test[37023]: This is test 2
2016-08-02T00:10:33-07:00 ubuntu Test[37024]: This is test 3
2016-08-02T00:10:33-07:00 ubuntu Test[37025]: This is test 4
2016-08-02T00:10:33-07:00 ubuntu Test[37026]: This is test 5
2016-08-02T00:10:33-07:00 ubuntu Test[37027]: This is test 6
2016-08-02T00:10:33-07:00 ubuntu Test[37028]: This is test 7
2016-08-02T00:10:33-07:00 ubuntu Test[37029]: This is test 8
2016-08-02T00:10:33-07:00 ubuntu Test[37030]: This is test 9
2016-08-02T00:10:33-07:00 ubuntu Test[37031]: This is test 10
Aparentemente, a primeira mensagem This is test 1
é aquela que aciona a conexão TCP e foi descartada.
Existe alguma configuração no rsyslog que eu possa definir para evitar isso?
Gostaria de salientar que isso só acontece se a conexão ainda tiver sido estabelecida; se eu executar o script pela segunda vez imediatamente após o primeiro, a segunda execução do script gerará This is test 1
.
Também estou feliz por ter votado positivamente na pergunta, mas parece-me estranho que não haja muitas pessoas que tenham notado este problema e tentado remediar isso. As pessoas que registram são tipicamente pessoas que são sérias sobre saber onde seu sistema foi certo e errado, e ainda assim estão assumindo que as coisas funcionariam corretamente se elas configurassem as configurações corretamente? Eu queria tentar mais coisas, mas sou muito novo em sistemas Unix, então não tenho ideia de como lidar com esse problema.
Eu fiz mais testes. Parece que eu não estava totalmente certo. Parece acontecer somente se eu fizer systemctl restart rsyslog
na máquina do servidor (recebimento), mas fazendo isso para a máquina cliente.
Meu palpite é que o cliente acha que ainda está conectado (enquanto no lado do servidor não está), e tenta enviar a próxima mensagem. É quando o cliente percebe que a conexão foi interrompida e tenta restabelecer uma nova conexão.
O mais estranho é que não faço ideia do motivo pelo qual o cliente pensaria que a mensagem perdida foi entregue.
Eu sei que há o RELP, mas eventualmente eu teria o servidor syslog central na plataforma Windows. Como posso usar o TCP sem esse problema ou obter (ou criar) um servidor syslog (coletor) em execução no Windows que suporta o RELP?