rsyslog é poderoso, mas seus documentos não são tão explícitos. Não consigo descobrir como analisar um arquivo de log e encaminhá-lo diretamente para o Graylog no formato GELF .
Eu encontrei pedaços de documentação sobre a saída de gelf em rsyslog , mas não tenho certeza de como proceder.
Até agora, ele tentou colocar o conf abaixo, /etc/rsyslog.d/01-access.conf
mas isso não parece funcionar…
template(name="gelf" type="list") {
constant(value="{\"version\":\"1.1\",")
constant(value="\"host\":\"")
property(name="hostname")
constant(value="\",\"short_message\":\"")
property(name="msg" format="json")
constant(value="\",\"timestamp\":\"")
property(name="timegenerated" dateformat="unixtimestamp")
constant(value="\",\"level\":\"")
property(name="syslogseverity")
constant(value="\"}")
}
input(type="imfile"
File="/var/log/apache2/access.log"
Tag="apache-access"
)
if $programname == 'apache-access' then {
action(
type="omfwd"
Target="GRAYLOG-IP"
Port="12201"
Protocol="tcp"
template="gelf"
)
stop
}
Você encontra esse problema porque o envio via tcp não está funcionando com rsyslog devido à especificação do delimitador de mensagem de byte nulo de Gelf. Da documentação oficial do rsyslog: ( http://www.rsyslog.com/doc/v8-stable/tutorials/gelf_forwarding.html ) "Observe que o caso acima funciona apenas para transporte UDP. Ao usar TCP, o Graylog espera um Nullbyte como delimitador de mensagem. Atualmente, isso não é possível com rsyslog." No entanto, seu exemplo deve funcionar via udp.
Uma palavra de conselho, eu recomendaria definitivamente verificar as regras de filtro do rsyslog, pois o processamento de mensagens continuará com o seu exemplo (confira o caractere til).
Extraído de: https://www.rsyslog.com/doc/master/tutorials/gelf_forwarding.html
Ao usar TCP, Graylog espera um Nullbyte como delimitador de mensagem. Portanto, para usar o TCP, você precisa alterar o delimitador por meio da opção TCP_FrameDelimiter.