日志系统基础: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 还有一个设施代码(Facility),用来标识日志来自哪个子系统。常见的设施代码有:
| 代码 | 关键字 | 说明 |
|---|---|---|
| 0 | kern | 内核消息 |
| 1 | user | 用户级消息 |
| 2 | 邮件系统 | |
| 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 个日志级别的含义、以及两种主流日志格式的区别。说白了,日志系统就是网络设备的「语言」,你学会了这门语言,才能跟设备「对话」,才能从海量信息中快速找到故障根因。