Eu tenho uma configuração que pode ser resumida da seguinte forma:
service --> syslog-ng relay --> syslog-ng server
No servidor syslog-ng
, eu teria o log organizado da seguinte forma:
/var/log/ ----> syslog-ng server local log files...
\--> ${FROM_HOST}/
\---> Syslog-ng relay host log files...
\---> ${HOST}/
\---> Service log files...
- Registros gerados localmente no servidor
syslog-ng
localizado em seu local padrão, / var / log .
- Logs gerados em uma retransmissão em um subdiretório contendo o nome do relé, / var / log / $ {FROM_HOST} .
- Registros gerados por um serviço em um subdiretório de seu relé associado, / var / log / $ {FROM_HOST} / $ {HOST}
Eu criei a seguinte configuração no host do servidor syslog-ng
:
@version: 3.7
@include "scl.conf"
options {
dns-cache-hosts("/etc/hosts");
keep-hostname(yes);
use-dns(persist_only);
};
...(removed)...
# syslog-ng server local logs, works fine.
log {
source(local_src);
local_file();
};
# syslog-ng relays, never matches.
log {
source(remote_src);
filter { host("${HOST_FROM}", type(string)); };
local_file(subdir("${HOST_FROM}/"));
};
# Services, works fine but also matches syslog-ng relays.
log {
source(remote_src);
filter { not host("${HOST_FROM}", type(string)); };
local_file(subdir("${HOST_FROM}/$(sanitize $HOST)/"));
};
Para informações local_file()
é um bloco de log personalizado, tendo como parâmetro o subdiretório onde armazenar entradas de registros.
Os host()
é descrito como comparando seu parâmetro com $ {HOST} . Minha idéia estava lá para usar $ {HOST} (o autor da mensagem do syslog) e $ {HOST_FROM} (o último salto da mensagem do syslog):
- Se eles forem iguais, a mensagem foi gerada pelo relé
syslog-ng
.
- Se forem diferentes, a mensagem foi gerada por um serviço.
No entanto, o teste host("${HOST_FROM}", type(string))
sempre falha, mesmo que o caminho gerado não mostre qualquer diferença entre os valores de $ {HOST} e $ {HOST_FROM} (por exemplo, dado um relé chamado therelay , os registros de retransmissão serão armazenados abaixo de / var / log / therelay / therelay / (expansão de / var / log / $ {HOST_FROM} / $ (sanitize $ HOST) / ).
Eu tentei remover a sanitização, para interpretar o padrão como um regexp em vez de uma string bruta, adicione .*
no início e no final do padrão enquanto um regexp, refaz todos esses testes enquanto substitui host("${HOST_FROM}")
por match("${HOST_FROM}", value(HOST))
, mas nada parece funcionar.
Na verdade, mesmo host("${HOST}")
(comparando $ {HOST} com ele mesmo) parece nunca corresponder.
Substituir o filtro por filter { host(".*"); };
, no entanto, força corretamente essa entrada para corresponder.
Este é o comportamento esperado? Como posso comparar o conteúdo de $ {HOST} e $ {HOST_FROM} ?