我对 rsyslog 完全陌生,所以请多多包涵 ;) 我有一个 Omada TP-Link 控制器,用于管理整个地区的所有客户端 AP。一切正常,我正在尝试实现公共 Wi-Fi 访问。为此,我需要一些真正的日志收集方法。我选择实现rsyslog, 和ElasticStack(Logstash,Elasticsearch&基巴纳)。
讯息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?
非常感谢你的帮助 !