Syslog-ng 启用 TCP 框架

Syslog-ng 启用 TCP 框架

我尝试通过 TCP 将文件条目作为消息发送,其中 syslog-ng 位于一个容器中,并发送到另一个容器。我进行了两次不同的尝试,但都出现了问题。第一个配置:

@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);
};

在这种方法中,有时收到的消息以即将到来的消息中的字节数开始,例如400。其他时候,他们没有这样做,而是直接转到消息。

后来,我将目的地改为使用network而不是syslog。现在,没有框架了。

我并不介意使用 TCP、UDP 等。我有一个连接到 TCP 套接字的 golang 接收程序,我希望它一次读取一条消息并进行解析。如何实现?谢谢

答案1

syslog() 目标将在 transport(tcp) 和 transport(tls) 上使用八位字节计数帧格式,如 RFC5425 中所述。它不会在 transport(udp) 上使用帧,因为在这种情况下,数据报使用数据包边界来分离消息。UDP 传输在 RFC5426 中描述。

相关内容