4、Syslog 协议原理:从架构到实战配置

聊到交换机日志,就绕不开 Syslog。这玩意儿说白了,就是网络设备用来“喊话”的标准协议。你想想看,一台交换机每天产生那么多日志,要是每条都存本地,早撑爆了。所以就有了 Syslog,它负责把日志从设备上“扔”到专门的服务器上集中管理。

我个人习惯,不管项目大小,第一件事就是搭好 Syslog 服务器。为什么?因为日志集中了,排错才有效率。不然你一台台设备去翻,黄花菜都凉了。

4.1 Syslog 架构:谁在说话,谁在听?

Syslog 的架构其实很简单,就三个角色:

  • 发送者(Sender):就是你的交换机、路由器、防火墙。它们产生日志,然后发出去。
  • 中继(Relay):这个不常用,但有些场景下,日志需要经过中间设备转发一下。
  • 收集者(Collector):也就是 Syslog 服务器。它负责接收、存储、甚至分析这些日志。

我在项目中遇到过一种情况:客户网络规模很大,交换机上千台,所有日志都发到一台服务器。结果服务器扛不住,丢日志了。后来我建议他们分层部署,核心层交换机发到一台,接入层发到另一台。问题就解决了。说白了,架构设计要提前想好。

核心要点:Syslog 是单向的、无连接的。发送者只管发,不关心服务器收没收到。所以,丢日志是常态,别指望它像 TCP 那样可靠。

4.2 Facility 与 Severity:日志的“身份”和“等级”

每条 Syslog 消息都带着两个关键标签:Facility 和 Severity。你可以把它们理解为日志的“部门”和“紧急程度”。

Facility(设施)

Facility 表示这条日志是哪个模块产生的。比如:

  • local0 ~ local7:这 8 个是留给用户自定义的。我一般用 local0 给交换机,local1 给防火墙,方便区分。
  • kern:内核消息
  • user:用户级消息
  • mail:邮件系统
  • daemon:系统守护进程

嗯,这里要注意:不同厂商的设备,Facility 的默认值可能不一样。比如思科默认用 local7,华为可能用 local0。配置前最好查一下文档。

Severity(严重级别)

Severity 从 0 到 7,数字越小越严重:

数值 级别 说明 我见过的场景
0 Emergency 系统不可用 交换机彻底挂了,这种日志很少见,见到就准备换设备吧
1 Alert 需要立即处理 比如端口安全违规,我曾经遇到过一次,整个办公室断网,就是有人乱插交换机
2 Critical 严重错误 接口 down 掉,而且是关键链路
3 Error 一般错误 配置错误、认证失败
4 Warning 警告 端口流量超过阈值,我一般会重点关注这个级别
5 Notice 正常但重要 接口 up/down,链路状态变化
6 Informational 信息 日常操作记录,比如用户登录
7 Debug 调试信息 这个级别日志量巨大,平时别开,开了服务器会疯掉

我的习惯:生产环境中,我一般只收集 Severity 0-5 的日志。6 和 7 太吵了,除非你在排一个特别诡异的故障,否则别开。我曾经有一次为了查一个 ARP 问题,开了 Debug 级别,结果 10 分钟日志文件就 2GB 了……

4.3 UDP 514 端口:为什么是它?

Syslog 默认使用 UDP 端口 514。为什么用 UDP?说白了,就是快。日志这东西,丢了就丢了,不会影响业务。如果用 TCP,万一网络拥堵,日志传输还会占用带宽,影响正常业务流量。

但 UDP 也有缺点:不保证送达。你想想看,如果一条 Critical 级别的日志丢了,你可能就错过了故障根因。所以,现在很多厂商也支持 TCP 或 TLS 加密传输。我个人建议,核心设备用 TCP,普通接入层设备用 UDP 就够了。

避坑指南:我曾经遇到过一个问题:Syslog 服务器收不到日志,排查了半天,发现是防火墙把 UDP 514 给拦了。嗯,这种低级错误,犯过一次就记住了。配置前,一定先确认网络路径上的防火墙、ACL 有没有放行这个端口。

4.4 Syslog 服务器配置:手把手教你搭

这里我以 Linux 下的 rsyslog 为例,因为这是最常用的。Windows 下也有类似工具,但说实话,生产环境我很少见。

4.4.1 安装 rsyslog

# CentOS / RHEL
yum install rsyslog -y

# Ubuntu / Debian
apt-get install rsyslog -y

4.4.2 配置 rsyslog 接收远程日志

编辑配置文件 /etc/rsyslog.conf,取消下面两行的注释:

# 开启 UDP 514 端口接收
$ModLoad imudp
$UDPServerRun 514

# 如果需要 TCP,也取消注释
# $ModLoad imtcp
# $InputTCPServerRun 514

然后,配置日志存储规则。我习惯按设备 IP 和日期分类:

# 在配置文件末尾添加
$template RemoteLogs,"/var/log/syslog/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs

保存后重启服务:

systemctl restart rsyslog
systemctl enable rsyslog

验证方法:在交换机上配好 Syslog 后,手动生成一条日志(比如 shutdown 一个接口再 no shutdown),然后去服务器上 tail -f /var/log/syslog/你的交换机IP/日期.log 看看有没有内容。如果没有,检查防火墙、检查配置、检查网络——三步走。

4.4.3 交换机端配置(以华为为例)

system-view
info-center loghost source interface GigabitEthernet0/0/1
info-center loghost 192.168.1.100 facility local0
info-center timestamp log date

这里指定了日志从哪个接口发出、发到哪个服务器、使用哪个 Facility。思科的配置也类似,只是命令不同。

4.5 小结

Syslog 协议不复杂,但它是网络运维的基石。你想想看,没有集中日志,你怎么做故障回溯?怎么分析网络趋势?所以,别嫌麻烦,老老实实把 Syslog 服务器搭起来。嗯,下一章我们聊聊怎么从海量日志里快速找到关键信息——那才是真正的排错功夫。