Omada 控制器和 rsyslog

Omada 控制器和 rsyslog

我对 rsyslog 完全陌生,所以请多多包涵 ;) 我有一个 Omada TP-Link 控制器,用于管理整个地区的所有客户端 AP。一切正常,我正在尝试实现公共 Wi-Fi 访问。为此,我需要一些真正的日志收集方法。我选择实现rsyslog, 和ElasticStackLogstashElasticsearch&基巴纳)。

讯息rsyslog收到奥马达如下:

2024-04-03T07:50:11+02:00 {{AP_IP}} [{{Random_ID}}] AP MAC={{AP_MAC}} MAC SRC={{Client_MAC}} IP SRC={{Client_IP}} IP DST={{IP_Dst}} IP proto={{IP_Protocol}} SPT={{Client_Port}} DPT={{Dst_Port}}#015#012[{{Random_ID}}] AP MAC={{AP_MAC}} MAC SRC={{Client_MAC}} IP SRC={{Client_IP}} IP DST={{IP_Dst}} IP proto={{IP_Protocol}} SPT={{Client_Port}} DPT={{Dst_Port}}#015#012[{{Random_ID}}] AP MAC={{AP_MAC}} MAC SRC={{Client_MAC}} IP SRC={{Client_IP}} IP DST={{IP_Dst}} IP proto={{IP_Protocol}} SPT={{Client_Port}} DPT={{Dst_Port}}#015

因此,基本上,我们在一条消息中包含多个日志。每条消息都以时间戳开头,然后是 AP 的 IP,然后是所有带有 ID 的日志。我遇到的问题是,每条日志都由字符串“#015#012“。
为了使用 Kibana 管理日志,我需要将 json 格式的日志发送到 Logstash。我使用以下模板执行此操作:

module(load="omelasticsearch")

template(name="template_prod"
        type="string"
        string="%$.mymsg%"
        option.json="on") {
                constant(value="{")
                constant(value="\"@timestamp\":\"") property(name="timereported" dateFormat="rfc3339")
                constant(value="\",\"ap_ip\":\"") property(name="hostname")
                constant(value="\",\"omada_id\":\"") property(name="procid")
                constant(value="\",\"ap_mac\":\"") property(name="msg" regex.expression="AP MAC=([0-9a-fA-F:]+)" regex.type="ERE" regex.submatch="1")
                constant(value="\",\"client_mac\":\"") property(name="msg" regex.expression="MAC SRC=([0-9a-fA-F:]+)" regex.type="ERE" regex.submatch="1")
                constant(value="\",\"client_ip\":\"") property(name="msg" regex.expression="IP SRC=([0-9.]+)" regex.type="ERE" regex.submatch="1")
                constant(value="\",\"dest_ip\":\"") property(name="msg" regex.expression="IP DST=([0-9.]+)" regex.type="ERE" regex.submatch="1")
                constant(value="\",\"ip_prot\":\"") property(name="msg" regex.expression="IP proto=([0-9]+)" regex.type="ERE" regex.submatch="1")
                constant(value="\",\"src_port\":\"") property(name="msg" regex.expression="SPT=([0-9]+)" regex.type="ERE" regex.submatch="1")
                constant(value="\",\"dst_port\":\"") property(name="msg" regex.expression="DPT=([0-9]+)" regex.type="ERE" regex.submatch="1")
                constant(value="\"}")
         }

if $msg contains '{{AP1_MAC_Client1}}' OR $msg contains '{{AP2_MAC_Client1}}' OR $msg contains '{{AP3_MAC_Client1}}' then {
        set $.mymsg = replace($msg, "#015", "\n");
        set $.mymsg = replace($.mymsg, "#012", "");
        action(type="omelasticsearch"
                server="{{elastic_ip}}"
                serverport="{{elastic_port}}"
                template="template_prod"
                searchIndex="client1"
                searchType="ap_log"
                maxbytes="100m"
                queue.type="linkedlist"
                queue.size="5000"
                queue.dequeuebatchsize="300"
                action.resumeretrycount="-1")
} else {
        action(type="omfile" file="/var/log/clients/other.log")
}

我似乎在这里感到困惑,因为我在字符串模板中使用了 option.json,所以我得到:

rsyslogd: template 'template_prod' is not a list template but has parameters specified - ignored [v8.2302.0]

所以我的最后一个问题是,以我当前的配置,考虑到一开始日志的格式不好,有没有办法以 json 格式将日志发送到 Logstash?

非常感谢你的帮助 !

相关内容