Estou entrando em contato com você sobre um problema que tenho com o syslog-NG. alguns de nossos dispositivos (principalmente switches HP e SANs) estão enviando mensagens syslog que não respeitam o syslog RFC 5424 ao que parece.
para lhe dar alguns exemplos:
se eu farejar a interface de rede do servidor, podemos ver essas mensagens "erradas" assim (como você pode ver, depois do PRI, podemos ver o PROGRAMA, depois fuso horário e campos separados por vírgulas. em resumo, campos mistos, campos ausentes etc. não é uma mensagem syslog padrão):
<190>raslogd: 2017/03/08-16:03:20, [SEC-1203], 53642, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4
portanto, atualmente não consigo filtrar essas mensagens. Tentei definir um filtro regular e imprimir campos como MSGHDR, MSG, PRI etc., mas não consegui ver nada.
a ÚNICA MANEIRA de filtrar esta mensagem é apenas definindo a interface externa e um arquivo como saída, sem nenhum modelo.
por exemplo, se eu fizer um filtro como este:
destination d_INCOMING_ALL { file("/app/syslog-ng/logs/incoming_all.log"); };
log {
source(s_EXTERNAL);
destination(d_INCOMING_ALL);
};
Eu posso ver as mensagens no arquivo de log, mas formatadas, de alguma forma (suponho que o syslog-NG as reformate):
[root@xxxxxxxxxxxx logs]# grep -i cswc incoming_all.log
Mar 9 09:44:20 cswc-mo8x-hpsan01 raslogd: 2017/03/09-08:34:50, [SEC-1203], 53647, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4
[root@xm1p1034vmo logs]#
o problema é que não consigo filtrar essas mensagens assim (recebemos logs de mais de 1000 dispositivos) aí, preciso filtrar as mensagens vindas desses dispositivos! e a única maneira de fazer isso é no nome do host (cswc- ) ou no nome do programa (raslogd )
então tentei exibir os campos adicionando um modelo a esse arquivo, exemplo:
destination d_test {
file ("/app/syslog-ng/logs/test_olivier.log"
template("pri=${priority} date=${ISODATE} host=${HOST} program=${PROGRAM} message=${MSG}\n")
);
};
mas nada funciona, nada é exibido. Eu tentei todos os campos, MSG, MESSAGE, MSGHDR etc. não consigo exibir NADA. a única coisa que funciona é a análise sem filtros ou modelos.
naturalmente, se eu passar por todos os tipos de filtros, como esses abaixo, não funciona (pois os campos são misturados):
filter f_is_SAN {
host("cswc.*" flags(ignore-case));
};
o mesmo para:
filter f_is_SAN {
match(".*cswc.*" flags(ignore-case));
};
alguma dica sobre como criar filtros para essas mensagens provenientes desses dispositivos (no nome do host ou nome do programa)?
obrigado cumprimentos,
Na verdade, o syslog-ng não está reformatando-os, está adicionando um cabeçalho syslog adequado:
O seguinte é adicionado pelo syslog:
O resto é a mensagem original:
Portanto, o syslog-ng concorda com você que essas mensagens não são compatíveis com RFC.
Em termos de configuração de filtros, isso significa que você não tem muito com o que brincar.
Pessoalmente, estou mais acostumado com o rsyslog (onde você pode inspecionar a mensagem com regex, por exemplo, procurando
raslogd
- embora isso não seja necessariamente eficiente).No entanto, o cabeçalho que o syslog-ng pode adicionar oferece algumas coisas para você continuar:
parece que o syslog-ng é capaz de relatar um nome de host, que eu tenderia a assumir que é resolvido a partir do IP de origem. Portanto, você pode pelo menos filtrar o ip de origem, usando host ou netmask :
filter hp_hosts { (host(192.168.0.25)) };
seu filtro de host atual está falhando porque não há campo HOST nas mensagens - os documentos para o
host
estado do filtro:no entanto, você tem um nome de host (pelo menos em seu exemplo) na mensagem, portanto, considere o uso de um filtro de mensagem .
Dito isto - para mim, se fosse possível obter uma lista dos IPs de origem de todos esses dispositivos (e só espero que isso seja possível), então eu usaria o filtro de máscara de rede - parece provável que seja mais eficiente do que as outras opções.
mmh eu encontrei uma solução que parece estar funcionando
Estou reutilizando o destino "cópia local" como fonte
por exemplo :
Eu tenho um filtro de log regular mantendo uma cópia de tudo:
a mensagem é mantida naquela "cópia local" sendo reformatada. Posso então reler este arquivo em uma fonte e aplicar os filtros a ele. está sujo, mas funciona: