Skip to content

syslog日志分析(RFC5424)

syslog消息格式遵守ABNF定义(RFC5234):

      SYSLOG-MSG      = HEADER SP STRUCTURED-DATA [SP MSG]

      HEADER          = PRI VERSION SP TIMESTAMP SP HOSTNAME
                        SP APP-NAME SP PROCID SP MSGID
      PRI             = "<" PRIVAL ">"
      PRIVAL          = 1*3DIGIT ; range 0 .. 191
      VERSION         = NONZERO-DIGIT 0*2DIGIT
      HOSTNAME        = NILVALUE / 1*255PRINTUSASCII

      APP-NAME        = NILVALUE / 1*48PRINTUSASCII
      PROCID          = NILVALUE / 1*128PRINTUSASCII
      MSGID           = NILVALUE / 1*32PRINTUSASCII

      TIMESTAMP       = NILVALUE / FULL-DATE "T" FULL-TIME
      FULL-DATE       = DATE-FULLYEAR "-" DATE-MONTH "-" DATE-MDAY
      DATE-FULLYEAR   = 4DIGIT
      DATE-MONTH      = 2DIGIT  ; 01-12
      DATE-MDAY       = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on
                                ; month/year
      FULL-TIME       = PARTIAL-TIME TIME-OFFSET
      PARTIAL-TIME    = TIME-HOUR ":" TIME-MINUTE ":" TIME-SECOND
                        [TIME-SECFRAC]
      TIME-HOUR       = 2DIGIT  ; 00-23
      TIME-MINUTE     = 2DIGIT  ; 00-59
      TIME-SECOND     = 2DIGIT  ; 00-59
      TIME-SECFRAC    = "." 1*6DIGIT
      TIME-OFFSET     = "Z" / TIME-NUMOFFSET
      TIME-NUMOFFSET  = ("+" / "-") TIME-HOUR ":" TIME-MINUTE


      STRUCTURED-DATA = NILVALUE / 1*SD-ELEMENT
      SD-ELEMENT      = "[" SD-ID *(SP SD-PARAM) "]"
      SD-PARAM        = PARAM-NAME "=" %d34 PARAM-VALUE %d34
      SD-ID           = SD-NAME
      PARAM-NAME      = SD-NAME
      PARAM-VALUE     = UTF-8-STRING ; characters '"', '\' and
                                     ; ']' MUST be escaped.
      SD-NAME         = 1*32PRINTUSASCII
                        ; except '=', SP, ']', %d34 (")

      MSG             = MSG-ANY / MSG-UTF8
      MSG-ANY         = *OCTET ; not starting with BOM
      MSG-UTF8        = BOM UTF-8-STRING
      BOM             = %xEF.BB.BF
      UTF-8-STRING    = *OCTET ; UTF-8 string as specified
                        ; in RFC 3629

      OCTET           = %d00-255
      SP              = %d32
      PRINTUSASCII    = %d33-126
      NONZERO-DIGIT   = %d49-57
      DIGIT           = %d48 / NONZERO-DIGIT
      NILVALUE        = "-"

syslog消息大小限制取决于所使用的传输映射。每种传输映射定义了支持的最小最大消息长度,并且该值MUST至少480字节。任何接收者MUST能够接收480字节及以上的消息,所有接收者的实现SHOULD能够接收2048字节及以上的消息。如果接收者收到了大于所支持的最大消息长度,则SHOULD截断载荷或MAY丢弃消息。如果接收者截断消息,则截断MUST发生在消息的末端,截断之后消息MAY包含非法的UTF-8编码或非法的STRUCTURE-DATA,接收者MAY丢弃消息或在这种情况下尽可能处理。

1 HEADER

HEADER中使用的字符集MUST是7位ASCII(RFC5234)。

1.1 PRI

PRI部分MUST包含3~5字符,由尖括号作为起始(%d60)和结束(%d62)。尖括号内的数字为为PRIVAL,表示设施和严重性(Facility and Severity)。

设施类型范围MUST在0~23之间。

          Numerical             Facility
             Code

              0             kernel messages
              1             user-level messages
              2             mail system
              3             system daemons
              4             security/authorization messages
              5             messages generated internally by syslogd
              6             line printer subsystem
              7             network news subsystem
              8             UUCP subsystem
              9             clock daemon
             10             security/authorization messages
             11             FTP daemon
             12             NTP subsystem
             13             log audit
             14             log alert
             15             clock daemon (note 2)
             16             local use 0  (local0)
             17             local use 1  (local1)
             18             local use 2  (local2)
             19             local use 3  (local3)
             20             local use 4  (local4)
             21             local use 5  (local5)
             22             local use 6  (local6)
             23             local use 7  (local7)

严重性等级指标范围是0~7。

           Numerical         Severity
             Code

              0       Emergency: system is unusable
              1       Alert: action must be taken immediately
              2       Critical: critical conditions
              3       Error: error conditions
              4       Warning: warning conditions
              5       Notice: normal but significant condition
              6       Informational: informational messages
              7       Debug: debug-level messages

PRI计算时首先将设施数值乘8然后加上严重性数值(8*Facility+Severity),因此优先级数值范围为0~191。

1.2 VERSION

VERSION表示syslog协议的版本。

1.3 TIMESTAMP

TIMESTAMP为RFC3339提出的格式化时间戳,但是同时需要遵循以下限制:

  • T和Z必须大写
  • T是REQUIRED的
  • MUST NOT使用闰秒

如果时钟准确且性能允许,originator SHOULD包含TIME-SECFRAC。如果syslog应用无法获取系统时间,则MUST使用NILVALUE作为TIMESTAMP。

1.4 HOSTNAME

HOSTNAME SHOULD按照STD 13(RFC1034)指定的格式包含主机名和originator的域名,这种格式称为FQDN。然而不是所有syslog应用都能提供FQDN,因此一些其它值也可以作为HOSTNAME:

  • FQDN
  • 静态IP地址
  • 主机名
  • 动态IP地址
  • NILVALUE

syslog应用SHOULD在尽可能长的时间内持续使用相同的值。NILVALUE SHOULD只在真实主机名无法获取时被使用。

1.5 APP-NAME

APP-NAME SHOULD标识产生消息的设备或应用,可以用来在relay或collector上过滤消息。NILVALUE MAY在syslog应用无法确定APP-NAME或不能提供该信息时使用。该字段可由操作者指定。

1.6 PROCID

PROCID是包含在消息中的值,没有互操作的含义,除了值的变化表示syslog报告发生过中断。该字段没有特定的语法或语义信息,字段的值依赖于协议实现或操作者指定。NILVALUE MAY在无值提供时被使用。

PROCID通常用来提供与syslog系统相关的进程名称或进程ID,NILVALUE可能在进程ID不可用时使用。虽然PROCID能帮助分析人员检测syslog报告中的中断,但是PROCID对于syslog的重启并不是一个可靠的标识,因为重启的syslog进程可能与之前syslog进程分配到相同的进程ID。

PROCID也可以用于识别哪些消息属于一个组,例如SMTP邮件传输代理可能将SMTP事务ID放在PROCID,使得collector或relay根据SMTP事务将消息分组。

1.7 MSGID

MSGID SHOULD识别消息的类型,具有相同MSGID的消息SHOULD反映具有相同语义的事件。MSGID本身是没有引申语义的字符串,但是可以用于过滤消息。NILVALUE SHOULD用于syslog应用不能提供任何值时。

2 STRUCTURED-DATA

STRUCTURED-DATA提供了一种机制,能够以定义明确、容易解析、可解释的数据格式表达信息。它有多种应用场景,例如它可能表述syslog消息的元信息或特定应用的信息(例如流量计数器或IP地址)。

STRUCTURED-DATA可包含若干结构化的元素,这些元素称为SD-ELEMENT。对于0个元素的情况,STRUCTURED-DATA字段必须包含NILVALUE。STRUCTURED-DATA应用的字符集必须是7-bit的ASCII,一种例外情况是PARAM_VALUE字段,该字段必须使用UTF-8。

collector MAY忽略畸形的STRUCTURED-DATA元素,relay MUST原封不动地传递畸形的STRUCTURED-DATA元素。

2.1 SD-ELEMENT

SD-ELEMENT由name和若干name-value对组成。name称为SD-ID,name-value称为SD-PARAM。

2.2 SD-ID

SD-ID是大小写敏感的,且唯一地标识SD-ELEMENT的类型和目的。相同的SD-ID MUST NOT在同一消息存在一次以上。

SD-ID有两种格式:

  • 不含'@'的name保留给IETF Review分配,这种格式的name仅在由IANA首次注册的情况下是合法的。注册后的名字MUST NOT包含@、=、]、"、空格或控制字符。
  • 任何人可以使用name@<private enterprise number>定义SD-ID。@前的部分内容没有明确规定,但MUST是可打印的US-ASCII字符,且MUST NOT包含@、=、]、"、空格或控制字符;@后的部分需要参考7.2.2节。

2.3 SD-PARAM

每个SD-PARAM包含PARAM-NAME和PARAM-VALUE。PARAM-NAME是大小写敏感的,除非SD-ID中name包含@,IANA控制所有PARAM-NAME。PARAM-NAME作用域在指定的SD-ID中,因此两个不同SD-ID中相同的PARAM-NAME的值是不同的。

PARAM-VALUE字段MUST使用UTF-8编码。一个syslog应用MAY以“shortest form”的格式产生任何合法的UTF-8序列。如果控制字符出现在PARAM-VALUE中,MUST NOT失败。syslog应用MAY修改包含控制字符的消息。在PARAM-VALUE内,"、\和]字符MUST跳过,且\"、\\、\]都MUST跳过。

在一个SD-ELEMENT中,SD-PARAM MAY重复多次。

2.4 Change Control

一旦SD-ID和PARAM-NAME定义后,这些对象的语法和语义MUST NOT被更改。如果需要对现有对象进行更改,则新的SD-ID或PARAM-NAME MUST被创建而旧的保持不变。OPTIONAL PARAM-NAME MAY被加入到已存在的SD-ID中。

3 MSG

没有格式要求,MSG SHOULD是使用UTF-8编码的UNICODE(RFC3629)。

4 STRUCTURE-DATA的SD-IDs

本节定义了IANA注册的初始化SD-ID。这里定义的所有SD-ID为OPTIONAL。

4.1 timeQuality

originator MAY使用该字段描述自己的系统时间的概念。该SD-ID SHOULD在originator不能与可靠的外部时间源正确同步或不知道时区信息是否正确时被使用。

  • tzKnown:originator是否知道自己的时区
  • isSynced:originator是否与可靠的外部时间源同步
  • synAccuracy:originator时间同步的精度

4.2 origin

该SD-ID MAY用来标识syslog消息的来源。指定这些参数的主要是为了帮助日志分析员和相似的应用。

  • ip:originator在产生消息时知道它拥有的IP
  • enterpriseId:该字段MUST是SMI Network Management Private Enterprise Code
  • software:唯一地标识产生该消息的软件
  • swVersion:唯一地标识产生该消息的软件的版本

4.3 meta

该SD-ID MAY用于提供消息的元信息。

  • sequenceId:跟踪originator提交消息到syslog传输的序列
  • sysUpTime:可能用于在消息中包含SNMP的sysUpTime参数
  • language:MSG中的自然语言