日志系统基础:Syslog协议、日志级别、日志格式标准

日志这东西,说白了就是网络设备的「黑匣子」。设备出了故障,你第一反应肯定是去翻日志。但如果你连日志怎么来的、分几个等级、长什么样都不清楚,那翻出来的东西就是天书。

我刚开始做运维那会儿,就吃过这个亏。有一次核心交换机半夜挂了,我登录上去看了半天日志,满屏的 info 和 debug 信息,眼睛都看花了也没找到根因。后来老工程师过来,直接让我过滤 err 和 crit 级别的日志,三分钟定位到问题。嗯,从那以后我才真正重视起日志级别这回事。

Syslog协议:日志传输的「快递员」

Syslog 是啥?它就是一套标准,定义了日志怎么产生、怎么传输、怎么存储。你想想看,网络上有几十上百台设备,每台都在产生日志,如果没有一个统一的协议,那日志格式五花八门,根本没法集中管理。

Syslog 协议的核心架构很简单,就三个角色:

  • 发送端:路由器、交换机、防火墙、服务器等设备,负责产生日志。
  • 接收端:Syslog 服务器,负责收集和存储日志。
  • 传输通道:通常是 UDP 514 端口,也有用 TCP 或 TLS 的。

核心要点:Syslog 默认使用 UDP 514 端口。UDP 是无连接的,速度快,但丢包不重传。如果你对日志完整性要求高,建议改用 TCP 或 TLS。

我记得有一次帮客户搭建日志中心,他们网络环境很差,UDP 丢包率高达 5%。结果日志分析时发现大量事件缺失,排查了三天才发现是传输层的问题。后来改成 TCP 就好了。

日志级别:从「废话」到「救命」的8个等级

Syslog 把日志分成 8 个级别,从 0 到 7,数字越小越严重。这个分级太重要了,你想想看,如果所有日志都混在一起,紧急事件和日常信息混为一谈,那跟没有日志有什么区别?

级别代码 级别名称 严重程度 典型场景
0 Emergency 系统不可用 内核崩溃、系统宕机
1 Alert 必须立即处理 磁盘空间耗尽、关键服务停止
2 Critical 严重错误 硬件故障、数据库损坏
3 Error 一般错误 配置错误、连接失败
4 Warning 警告 接口抖动、内存使用率过高
5 Notice 正常但重要 接口状态变化、用户登录
6 Informational 一般信息 配置变更、服务启动
7 Debug 调试信息 协议交互细节、数据包内容

避坑指南:我曾经见过有人把日志级别统一设为 Debug,理由是「信息越全越好」。结果日志文件一天涨 50GB,磁盘直接撑爆,关键故障信息反而被淹没了。我的建议是:生产环境日志级别设为 Info 或 Notice,Debug 只在排查问题时临时开启,用完就关。

日志格式标准:读懂每一行

Syslog 的日志格式有 RFC 3164 和 RFC 5424 两个标准。老设备多用 3164,新设备和集中式日志系统多用 5424。我带你看看它们长什么样。

RFC 3164(传统格式)

<14>Oct 15 10:25:30 router1.example.com %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to down

拆开来看:

  • <14>:优先级值,由设施代码和级别计算得出。14 表示设施为 1(user-level),级别为 6(Informational)。
  • Oct 15 10:25:30:时间戳,没有年份。
  • router1.example.com:主机名。
  • %LINK-3-UPDOWN:进程名-级别-消息ID。这里的 3 就是日志级别 Critical。
  • Interface GigabitEthernet0/1, changed state to down:消息正文。

RFC 5424(结构化格式)

<14>1 2024-10-15T10:25:30.123Z router1.example.com LINK 3 UPDOWN - [meta sequenceId="1234"][origin ip="192.168.1.1"] Interface GigabitEthernet0/1, changed state to down

相比 3164,5424 多了:

  • 版本号 1
  • ISO 8601 时间戳,带毫秒和时区
  • 结构化数据段 [meta ...][origin ...],可以携带键值对

个人经验:如果你在用 ELK 或 Splunk 这类日志分析平台,强烈建议用 RFC 5424 格式。结构化数据段可以让你直接按字段搜索,比如 origin.ip="192.168.1.1",比在纯文本里用正则匹配快得多。

知识体系总览

下面这张图把 Syslog 协议、日志级别和格式标准串起来了。你可以把它当作本章的「地图」,后面排查故障时随时回来对照。

日志系统基础:知识体系总览 日志产生源 Syslog 协议 日志级别 (0-7) 日志格式标准 发送端 接收端 0-3 严重 4-7 普通 RFC 3164 RFC 5424 应用场景:故障排查 → 安全审计 → 性能监控 → 合规报告

设施代码:日志的「分类标签」

除了级别,Syslog 还有一个设施代码(Facility),用来标识日志来自哪个子系统。常见的设施代码有:

代码 关键字 说明
0 kern 内核消息
1 user 用户级消息
2 mail 邮件系统
3 daemon 系统守护进程
4 auth 安全/认证消息
5 syslog Syslog 内部消息
16-23 local0-local7 自定义使用,常用于网络设备

设施代码和日志级别组合起来,就得到了优先级值(Priority)。计算公式是:Priority = Facility * 8 + Severity。比如 <14>,就是 1 * 8 + 6 = 14,表示设施为 user,级别为 Informational。

实用技巧:在配置日志过滤时,你可以同时指定设施和级别。比如我只想收路由器的认证日志,就过滤 auth 设施;只想看错误以上的日志,就过滤级别 0-3。这样能大幅减少噪音。

日志格式对比:3164 vs 5424

我整理了一张对比表,方便你快速了解两个标准的差异:

对比项 RFC 3164 RFC 5424
时间戳 无年份,格式固定 ISO 8601,带毫秒和时区
主机名 可选,格式不严格 必选,支持 FQDN
结构化数据 不支持 支持键值对
消息长度 通常 ≤ 1024 字节 支持更长消息
字符编码 ASCII UTF-8
兼容性 老设备广泛支持 新设备和集中式系统

我个人习惯是:老设备用 3164,新部署的系统一律用 5424。尤其是做日志分析平台时,5424 的结构化数据段能省很多解析的功夫。

实战:如何配置 Syslog 发送

光说不练假把式。我拿 Cisco 设备举个例子,配置 Syslog 发送到远程服务器:

!
! 配置 Syslog 服务器地址
logging host 192.168.1.100
!
! 指定日志级别(0-7,数字越小越严重)
logging trap informational
!
! 启用时间戳
service timestamps log datetime msec
!
! 指定日志源接口(推荐)
logging source-interface Loopback0
!

配置完成后,可以用 show logging 查看日志缓冲区内容,确认是否正常发送。

避坑指南:我曾经遇到过一个案例,配置了 Syslog 但服务器死活收不到日志。排查了半天,发现是防火墙阻断了 UDP 514 端口。还有一次是源接口配置错了,日志从管理口发出,但管理口不在路由表中。嗯,这两个坑你一定要注意。

小结

这一章我们聊了 Syslog 协议的三个核心角色、8 个日志级别的含义、以及两种主流日志格式的区别。说白了,日志系统就是网络设备的「语言」,你学会了这门语言,才能跟设备「对话」,才能从海量信息中快速找到故障根因。