记录一次用 EFK 收集 H3C 交换机 Syslog 的踩坑过程

记录一次用 EFK 收集 H3C 交换机 Syslog 的踩坑过程

最近需要把局域网几台华三(H3C)核心交换机的日志接入现有的 EFK (Elasticsearch + Filebeat + Kibana) 平台。为了节省资源,没有单独搞接收机,而是直接复用业务服务器上的 Filebeat。

整体流向:H3C交换机 -> (UDP 5140) -> Filebeat -> Kafka -> Logstash -> ES。

1. Filebeat 与 Logstash 路由配置

直接在 Filebeat 加一个 syslog 类型的 input,指定监听 5140 端口(避开系统默认的 514,防止和机器上的 rsyslog 冲突)。

filebeat.inputs:
- type: syslog
  protocol.udp:
    host: "0.0.0.0:5140"
  fields:
    log_type: h3c_syslog
  fields_under_root: true

output.kafka:
  hosts: ["10.20.30.188:9092"]
  topic: "elk"

因为发到 Kafka 的 elk topic 里还有业务日志,需要在 Logstash 用刚才打的 log_type 标签做下分流。注意 Filebeat 吐给 Kafka 的是 JSON 格式,Logstash 输入处必须加 codec => "json"

input {
  kafka {
    bootstrap_servers => "10.20.30.188:9092"
    topics => ["elk"]
    group_id => "logstash_elk_group"
    codec => "json"
  }
}

output {
  if [log_type] == "h3c_syslog" {
    elasticsearch {
      hosts => ["10.20.30.XXX:9200"]
      index => "h3c-syslog-%{+YYYY.MM.dd}"
    }
  }
}

2. 交换机配置与踩坑记录

交换机配置本身很简单,开启 info-center 往外指就行,但实际接入后遇到了两个比较典型的坑。

坑一:时间戳穿越与时区问题

日志接入后,发现 Kibana 里的时间永远少 8 个小时,部分日志甚至穿越回了 2000 年。
原因是华三交换机如果没配时区,默认会发 UTC(零时区)时间给日志服务器。

解决办法是去交换机全局视图配好 NTP 和东八区:

# 配置时区为北京时间,并开启 NTP
clock timezone Beijing add 08:00:00
ntp-service enable
ntp-service unicast-server 10.20.30.250

# 开启信息中心并指定格式为 ISO 时间
info-center enable
info-center timestamp loghost iso
info-center loghost 10.20.30.100 port 5140 facility local7

坑二:高可用 VIP 导致的 IP 冲突刷屏

跑了一段时间后发现 ES 被 ARP_DUPLICATE_IPADDR_DETECT 告警刷屏了。
查了一下冲突的 IP 10.20.30.199,发现是一个 Keepalived 的 VIP。VIP 在主备之间漂移或者发免费 ARP 时,交换机二层防攻击机制会认为这是 IP 冲突。

在排除了真实的脑裂故障后,为了节约存储,直接在 Logstash 把这条特定 IP 的告警丢弃:

filter {
  if [log_type] == "h3c_syslog" {
    if [message] =~ "ARP_DUPLICATE_IPADDR_DETECT" and [message] =~ "10.20.30.199" {
      drop { }
    }
  }
}

3. 日志排查过滤建议

如果想放开所有细颗粒度日志,可以在交换机执行 info-center source default channel loghost log level debugging

平时排障,直接在 Kibana 过滤 syslog.severity <= 3 就可以筛选出硬件错误,查 message: "UPDOWN" 就能看链路抖动,比每次登终端敲 display 方便不少。

评论