Syslog-ng は TCP フレーミングを有効にする

Syslog-ng は TCP フレーミングを有効にする

ファイル エントリを TCP 経由でメッセージとして送信しようとしています。syslog-ng はコンテナー内にあり、別のコンテナーに送信しています。2 つの異なる試みをしましたが、どちらも動作に問題がありました。最初の構成:

@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つのメッセージを読み取って解析したいと考えています。これはどのように実現できますか?ありがとうございます

答え1

syslog() の宛先は、RFC5425 で説明されているように、トランスポート (tcp) およびトランスポート (tls) でオクテット カウント フレーミング形式を使用します。トランスポート (udp) ではフレーミングは使用されません。その場合、データグラムはパケット境界を使用してメッセージを分割します。UDP トランスポートは、RFC5426 で説明されています。

関連情報