Syslog协议-RFC5424 + RFC3164

Python010

Syslog协议-RFC5424 + RFC3164,第1张

RFC5424协议手册地址: https://tools.ietf.org/html/rfc5424

RFC3164协议手册地址: https://tools.ietf.org/html/rfc3164

Syslog常被用来日志等数据的传输协议,数据格式遵循规范主要有RFC3164,RFC5424;

RFC5424 相比 RFC3164 主要是数据格式的不同,RFC3164相对来说格式较为简单,能适应大部分使用场景,但是已废弃,RFC5424已作为Syslog的业界规范;下面就来分别讲讲两个协议;

RFC 5424 规定消息最大长度为2048个字节,如果收到Syslog报文,超过这个长度,需要注意截断或者丢弃;

PRI为消息优先级,用"<"和">"括起来。PRI由两部分组成:

计算方式为:PRI = Facility * 8 + severity(例如 165表示一条级别为Notice的local4消息)

Facility取值范围及含义如下:

Severity取值范围含义:

上述一般对应于日志的8种级别;

版本用来表示Syslog协议的版本,RFC5424的版本号为“1”;

时间戳格式为:yyyy-mm-ddTHH:MM:SS.xxxxxx+/-HH:MM

有以下几个要求:

举例如下:

hostname标识发送syslog消息的源主机;优先选用如下几种写法:

用于识别产生消息的设备或应用,找不到用"-"代替;

进程名称或进程ID,得不到用"-"代替;ProcId常用于分析日志生成进程的连续性,但不做可靠性保证,比如进程重启还是可能会分到一样的进程ID;

标识消息类型。例如TCPIN、TCPOUT分别代表TCP数据的流入或流出;如果无法获取数据类型,用"-"代替。 MSGID可根据数据类型用于数据过滤;

结构化数据;提供了一种记录被良好定义易于被解析的数据的数据格式;可用于记录系统的元信息或应用相关的信息;

可以包含多条结构化数据——"SD-ELEMENT",如果没有则用"-"代替;

一条结构化数据SD-ELEMENT包含名字(SD-ID)以及多条键值对(SD-PARAM);

一条消息种必须唯一,用于识别SD-ELEMENT的类型和目的;

有两种格式:

值得一提的是,32473 在IANA上已被注册作为文档中的举例数字,无法被使用;

键值对;除了自定义的SD-ID外,所有的SD-PARAM也是受限的,在IANA上定义了所有的PARAM-NAME;PARAM-NAME有效范围为一个指定的SD-ID;

举例如下:

消息体,无格式要求;如果Syslog应用用UTF-8编码,必须以BOM开头;

所有规范的SD-ID都在IANA上有定义。

用来阐述系统时间的概念;

时间信息是否确定,如果确定tzKnown="1"否则tzKnown="0";

标识时间是否是NTP同步的;如果是,则值为1;否则为0;

描述消息源;

....

RFC3164推荐参照(翻译的很全):

https://www.jianshu.com/p/8656fc85e497

以我就说只会 JavaScript 啊 Java EE 啊 PHP 的就不要冒充程序员了……

先看看 Go 的 net 包和 net/http 包。基于 net 包里相对低级的接口,用 TCP 写基本的 C/S 通信程序。如果需要权威参考书,Unix Network Programming 是唯一正确的选择。另有 Beej‘s Guide to Network Programming 方便入门。

之后去看 rfc1945 实现基本的 HTTP/1.0。再之后开始实现 HTTP/1.1 的各种细节的时候才需要 http 权威指南吧。