上个月被领导的暗示下,需要用新的日志收集系统替代老旧的 Kiwi Syslog,有一说一确实,公司的 kiwisyslog 还停留在 09 年的版本,不然以后写季报和年报都没什么新花样了。

目前还在部署 ELK 作为公司的新日志收集平台,收集日志的 logstash 使用传统的 UDP 514 端口主动收信息。看网上的教程基本每个交换机用的 logstash 都是不同交换机不同端口,写 grok 就很方便,而我们的设备已经运作了多年,一台一台交换机改端口实在是麻烦,只能一股脑塞进去过滤。

但网上的匹配规则可能只有中高端交换机的匹配规则,而我们的设备有 S2600 系列的入门交换机,直接使用那些规则可能会无法匹配仅输出原生文本,这就很麻烦,还好 logstash 可以匹配多条规则,第一条不能匹配就用第二条规则。根据交换机日志的组成和配置好 info-center 的多台交换机我写了华三和华为交换机通用的规则。

分析日志

<164>Jun  2 2020 01:53:27 LSW1 %%01LLDP/4/BAD_PACKET(l)[10261]:5 invalid packets were received after latest notification. The last invalid packet came from interface XGigabitEthernet1/0/1 

根据官方讲解,可以这样理解日志的每项的意义。

图片1.png

因此上面的日志信息可以这样转换规则:

<时间戳><月> <日> <年> <时间> <交换机名字> %%<版本号> <模块名>/<日志级别>/<日志模块>(<日志标识>[信息计数]):<详情信息>

规则

使用官方提供的预设的正则,运作了半个月暂未看到未转换的日志。

 filter {
if [type] == "system-syslog"{
        grok {
            match => [
                "message" , "<%{BASE10NUM:syslog_pri}>%{DATA:month} %{MONTHDAY:day} %{YEAR:year} %{TIME:time} %{DATA:hostname} %%%{DATA:ddModuleName}/%{POSINT:severity}/%{DATA:brief}:%{GREEDYDATA:message}",
                "message" , "%{DATA:hostname} %%%{DATA:ddModuleName}/%{POSINT:severity}/%{DATA:digest}: -DevIP=%{IPV4:DevIP}; %{GREEDYDATA:message}",
                "message" , "%{DATA:hostname} %%%{DATA:ddModuleName}/%{POSINT:severity}/%{DATA:digest}: %{GREEDYDATA:message}",
                "message" , "%{DATA:hostname} %%%{DATA:ddModuleName}/%{POSINT:severity}/%{DATA:digest}:- %{GREEDYDATA:message}"            
]
            remove_field => ["%{month}","%{day}","%{year}","%{time}"]
            #add_field => {"syslog_time" => "%{month} %{day} %{year} %{time}"}
            add_field => {"severity_code" => "%{severity}"}
            overwrite => ["message"]
        }
    }

mutate {
        gsub => [
            "severity", "0", "Emergency",
            "severity", "1", "Alert",
            "severity", "2", "Critical",
            "severity", "3", "Error",
            "severity", "4", "Warning",
            "severity", "5", "Notice",
            "severity", "6", "Informational",
            "severity", "7", "Debug"
        ]
    }
} 

测试

接回上面的分析日志的那条命令,使用 grok debugger 可以成功匹配

<164>Jun  2 2020 01:53:27 LSW1 %%01LLDP/4/BAD_PACKET(l)[10261]:5 invalid packets were received after latest notification. The last invalid packet came from interface XGigabitEthernet1/0/1 

gork1.jpg

第二条,部分华三设备的日志无法用第一条匹配,毕竟多出了 DevIP,而且本身 logstash 会自动加上当前时间戳到 elasticsearch,所以下面的规则已经不会先匹配日志时间了。

LSW2 %%10ARP/5/ARP_DUPLICATE_IPADDR_DETECT(l): -DevIP=10.100.100.100; Detected an IP address conflict. The device with MAC address X-X-X-X connected to GigabitEthernet1/0/24 in VLAN 12 and the device with MAC address X-X-X-X connected to GigabitEthernet1/0/24 in VLAN 12 are using the same IP address 1.2.3.4. 

grok2.jpg

下面两条规则是给连 DevIP 也没有的日志使用,区别就是详情信息前多了个 -,暂时找不到相关日志来示例。