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 权威指南吧。