附录 A. 实施者指南 (Implementer Guidelines)
本附录为 syslog 协议的实施者提供非规范性指导。
A.1. 与 BSD Syslog 的关系
RFC 3164 描述了 BSD syslog 协议,该协议已被广泛部署多年。本文档废弃了 RFC 3164,但保持了重要的兼容性。
主要差异:
-
VERSION 字段: 本规范添加了明确的 VERSION 字段。旧版实现将无法识别此字段。
-
TIMESTAMP 格式: 本规范使用带有完整日期、时区和可选秒小数部分的 RFC 3339 时间戳。RFC 3164 使用了更简单的格式,没有年份或时区。
-
STRUCTURED-DATA: 本规范引入了结构化数据元素。RFC 3164 没有等效机制。
-
MSG 格式: RFC 3164 的 TAG 字段已拆分为 HEADER 中的 APP-NAME、PROCID 和 MSGID 字段。
互操作性考虑事项:
与 RFC 3164 系统通信时:
-
发送到旧版系统: 如果接收方不支持本规范,则按照 RFC 3164 格式化消息。传输发送方应检测接收方能力或允许配置。
-
从旧版系统接收: 符合本规范的接收方应能够解析 RFC 3164 消息。接收方可以将它们转换为本文档中定义的格式。
-
中继行为: 中继可能需要在格式之间转换消息。从本规范转换到 RFC 3164 时:
- 删除 VERSION 字段
- 将 TIMESTAMP 转换为 MMM DD HH:MM:SS 格式
- 删除时区和年份信息
- 删除 STRUCTURED-DATA 或附加到 MSG
- 从 APP-NAME 和 PROCID 重建 TAG
-
从 RFC 3164 转换到本规范:
- 将 VERSION 设置为 1
- 向时间戳添加当前年份
- 使用中继的时区或 UTC
- 将 TAG 解析为 APP-NAME 和 PROCID (尽力而为)
- 如果无法确定,则将 MSGID 设置为 NILVALUE
A.2. 消息长度 (Message Length)
接收方所需的最小容量 480 字节具有实际意义:
为什么是 480 字节?
- 在许多网络上不分片的单个 UDP 数据包
- 在降级网络中更高的传递可能性
- 与有限实现的兼容性
影响:
- 关键消息: 安全警报和操作紧急情况应在 480 字节内
- 故障排除数据: 保持诊断消息紧凑
- 重要数据优先: 将关键信息放在消息的早期
更大的消息:
许多现代部署支持更大的消息:
- TLS 传输通常允许数十或数百千字节
- TCP 传输没有实际大小限制
- 现代实现通常支持 2048、8192 或更大的消息
最佳实践:
- 根据部署要求配置最大消息大小
- 对重要元数据使用 STRUCTURED-DATA (计入消息长度)
- 在您的环境中测试最大消息大小
- 实现对超大消息的优雅处理 (截断或拒绝)
- 在收集器监控截断的消息
UTF-8 考虑事项:
消息长度以字节而非字符测量。如果包含非 ASCII 字符,1000 字符的 UTF-8 字符串可能是 3000 字节或更多。实施者在确定消息大小时必须考虑这一点。
A.3. 严重性值 (Severity Values)
正确使用严重性值可以提高消息的实用性。
指南:
-
Emergency (0): 谨慎用于真正的紧急情况
- 系统完全不可用
- 关键硬件即将故障
- 正在发生数据丢失
-
Alert (1): 需要立即采取行动
- 服务中断
- 检测到安全漏洞
- 关键资源即将耗尽
-
Critical (2): 危急情况
- 硬盘故障
- 主网络连接丢失
- 应用程序崩溃
-
Error (3): 错误情况
- 非关键服务故障
- 可恢复的错误
- 连接超时
-
Warning (4): 警告情况
- 资源使用接近限制
- 使用了已弃用的功能
- 配置问题
-
Notice (5): 正常但重要
- 服务启动/停止
- 配置更改
- 安全相关的正常事件
-
Informational (6): 信息性消息
- 日常操作
- 状态消息
- 连接建立
-
Debug (7): 调试级消息
- 详细诊断信息
- 面向开发人员的消息
- 应在生产中禁用
配置考虑事项:
允许管理员:
- 根据部署需求调整严重性分配
- 按严重性过滤消息
- 将严重性路由到不同的收集器
- 覆盖特定消息类型的严重性
避免严重性滥用:
- 不要将所有消息标记为 Emergency
- 不要对生产事件使用 Debug 严重性
- 考虑操作员警报疲劳
A.4. TIME-SECFRAC 精度
TIMESTAMP 字段支持最多 6 位数字 (微秒) 的秒小数部分。
常见错误:
删除前导零:
错误: 2003-10-11T22:13:14.3 (看起来是 300ms)
正确: 2003-10-11T22:13:14.003 (实际上是 3ms)
精度建议:
- 对大多数应用程序使用毫秒 (3 位数字)
- 对高精度计时使用微秒 (6 位数字)
- 如果不需要亚秒精度,则省略秒小数部分
- 确保时间同步 (NTP) 支持所需的精度
实施注意事项:
并非所有系统都能提供微秒精度。可以接受:
- 提供少于 6 位数字的精度
- 四舍五入或截断到可用精度
- 如果精度不可用,则完全省略 TIME-SECFRAC
A.5. 名称大小写约定 (Case Convention for Names)
本文档对 SD-ID 和 PARAM-NAME 使用"小写驼峰式"。
约定:
- 首字母小写
- 后续单词首字母大写
- 无连字符或下划线
示例:
timeQualitysyncAccuracyenterpriseIdmyCompanyName
优点:
- 实现之间的一致性
- 可读性
- 与各种编程语言的兼容性
建议:
对以下内容使用此约定:
- 新的 SD-ID
- PARAM-NAME
- 扩展标识符
私有实现可以使用其他约定,但建议保持一致性。
A.6. 不知道时间的 Syslog 应用程序
第 6.2.3 节允许在时间未知时对 TIMESTAMP 使用 NILVALUE。
何时对 TIMESTAMP 使用 NILVALUE:
- 没有实时时钟的嵌入式系统
- 时间同步之前的启动时消息
- 时间检索失败的系统
何时不使用 NILVALUE:
- 当操作系统提供时间函数时
- 当懒惰的实现想要避免时间处理时
- 当时间可用但不方便获取时
最佳实践:
- 尽可能发出有效的 TIMESTAMP
- 仅在真正无法获取时间时使用 NILVALUE
- 考虑时区与精度的权衡
- 在您的实现中记录时间处理
中继处理:
接收带有 NILVALUE TIMESTAMP 的消息的中继可以:
- 按原样转发
- 用中继的当前时间替换
- 删除消息 (如果策略要求时间戳)
配置应控制此行为。
A.7. 关于 timeQuality SD-ID 的注意事项
timeQuality SD-ID 提供有关时间戳准确性的宝贵元数据。
tzKnown 参数:
默认应为 0 (未知),除非:
- 管理员明确配置了时区
- 操作系统提供可靠的时区信息
- 系统已针对外部源验证了时区
isSynced 参数:
仅在以下情况下设置为 1:
- NTP 或其他时间同步处于活动状态
- 同步已验证成功
- 时间源受信任
syncAccuracy 参数:
仅在以下情况下提供:
- 实际精度已知 (来自 NTP 统计信息)
- 管理员已配置预期精度
- 测量数据支持声明
不要夸大精度:
虚假精度会损害对日志的信任。最好:
- 如果不确定,则完全省略 timeQuality
- 提供保守的精度估计
- 记录精度声明
A.8. UTF-8 编码和 BOM
BOM (字节顺序标记) 在 MSG 字段中表示 UTF-8 编码。
BOM 详细信息:
- 字节序列: 0xEF 0xBB 0xBF
- 出现在 MSG 字段的开头
- 表示后面是 UTF-8 编码
何时包含 BOM:
- 当 MSG 包含 UTF-8 编码文本时
- 当存在 UTF-8 编码的确定性时
- 为了与组织策略保持一致
何时省略 BOM:
- 当 MSG 编码未知或不确定时
- 当 MSG 包含二进制数据时
- 为了与不处理 BOM 的系统向后兼容
接收方处理:
接收方应:
- 检测 BOM 是否存在
- 相应地处理 UTF-8
- 处理没有 BOM 的消息 (假设编码未知)
- 不向最终用户显示 BOM
中继处理:
转发消息的中继应:
- 如果存在则保留 BOM
- 除非转码为 UTF-8,否则不添加 BOM
- 除非转码为另一种编码,否则不删除 BOM