Estou tentando enviar entradas de arquivo como mensagens via TCP, onde o syslog-ng está em um contêiner e está enviando para outro contêiner. Tive duas tentativas diferentes, ambas com comportamento problemático. A primeira configuração:
@version: 3.31
source s_file {
file("/var/log/my_file.json" follow_freq(1) flags(no-parse));
};
template log_template {
template("MSGSTART${MESSAGE}MSGEND");
};
class SngResolver(object):
def init(self, options):
"""
Initializes the parser
"""
self.counter = 0
return True
def parse(self, log_message):
log_message["SYSUPTIME"] = subprocess.check_output(['cat', '/proc/uptime']).decode('utf-8')
log_message["SEQUENCEID"] = str(self.counter)
self.counter += 1
# return True, other way message is dropped
return True
};
parser p_resolver {
python(
class("SngResolver")
);
};
# Define the destination for Suricata logs
destination d_container {
syslog("my_other_container" transport("tcp") port(1234) template(log_template));
};
# Define the log path for Suricata logs
log {
source(s_file);
parser(p_resolver);
destination(d_container);
};
Neste método, às vezes a mensagem recebida começa com o número de bytes da mensagem seguinte, digamos 400
. outras vezes, não o fizeram e foram direto à mensagem.
Mais tarde, mudei o destino para usar network
em vez de syslog
. Agora, não há enquadramento.
Não me importo se tiver que usar TCP, UDP, seja o que for. Eu recebi um golang conectado a um soquete TCP e quero que ele leia uma mensagem por vez e analise-a. Como isso é possível? Obrigado
Responder1
O destino syslog() usaria o formato de enquadramento contado em octetos em transport(tcp) e transport(tls) conforme descrito em RFC5425. Ele NÃO usará enquadramento no transporte (udp), pois nesse caso o datagrama separa as mensagens usando os limites do pacote. O transporte UDP é descrito em RFC5426.