syslog协议介绍

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: syslog是网络上各种设备将日志收集到日志服务器的一种数据协议,它几乎被所有的网络设备支持,并且能够记录多种事件类型的日志消息,支持syslog的设备常见的有路由器、交换机、打印机等等,甚至unix-like的服务器也可以支持产生syslog消息,用以记录用户的登录、防火墙事件、apache或者n

syslog是网络上各种设备将日志收集到日志服务器的一种数据协议,它几乎被所有的网络设备支持,并且能够记录多种事件类型的日志消息,支持syslog的设备常见的有路由器、交换机、打印机等等,甚至unix-like的服务器也可以支持产生syslog消息,用以记录用户的登录、防火墙事件、apache或者nginx access日志等。
01c3a3590aea180e0edf863a5fe3f572e72b32f1_jpeg
上图是典型的syslog完整端到端的场景示意图,各种设备通过syslog协议将事件发送到syslog服务器,管理员配置一些监控规则,当有syslog事件触发监控规则时,syslog服务器向管理员发送报警,管理员响应报警。
目前日志服务已经支持接收syslog日志,详细内容请参考《日志服务(原SLS)新功能发布(6)--使用logtail接入syslog数据》

syslog的RFC标准

目前有两个syslog RFC标准RFC 3164、RFC 5424,两者的主要区别在于数据的格式不同,RFC 3164格式如下:

  1. Syslog包分为3个部分,PRI, HEADER,以及MSG,总长度不能超过1024个字节。其中PRI代表了facility以及severity,即代表消息来源以及消息的严重程度,因该字段只存在于syslog报文包头部分,在log中并不可见,因此我们在此不加以讨论。
  2. HEADER部分包含一个时间戳以及发送方的主机名或者ip地址,并且HEADER部分必须是一些可打印字符。时间戳部分是格式为”Mmm dd hh:mm:ss”的本地时间,其中Mmm是3个字母的英文缩写,如果日期小于10,必须用空格代替缺少的一个数字。主机名部分一般使用主机名,如果没有的话可以使用IPv4或者IPv6的地址。需要注意的是主机名中不能包含任何空格。时间戳和主机名后面都各自跟一个空格。
  3. MSG部分一般包含生成消息的进程信息(TAG field)以及消息正文(CONTENT field)。TAG部分主要是包含生成消息的进程信息,不能超过32个字符。消息体必须是一些可见字符,这部分就是消息的正文。TAG与CONTENT之间的间隔用非字母表字母隔开,一般用”[“,”:”或者空格隔开。

RFC 5424格式如下:

The syslog message has the following ABNF [RFC5234] definition:

      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

RFC 5424较新,用的比较少,目前主流的是RFC 3164。
主流的syslog工具有四种syslogd[RFC 3164]、sysklogd[RFC 5424]、syslog-ng、rsyslog,前两种的是系统组件,后两种是最近兴起的开源工具,syslog-ng、rsyslog可以兼容syslogd、sysklogd发送过来的数据,支持各种syslog协议数据的格式化、过滤等处理,比如可以定义数据的时间格式、按照syslog数据中任意部分过滤数据以及重定向输出到远端等。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7月前
|
网络协议 应用服务中间件 nginx
nginx配置tcp协议代理的日志
nginx配置tcp协议代理的日志
153 0
|
12月前
|
运维 网络协议 Ubuntu
flume 通过syslog协议读取系统日志
flume 通过syslog协议读取系统日志
|
存储 网络协议 算法
TFTP 协议(修订版 2)
TFTP 是一种用于传输文件的非常简单的协议。它的名字就是由此而来的,Trivial File Transfer Protocol 或 TFTP。每个非终端数据包都被单独确认。本文档描述了协议及其数据包类型。该文件还解释了一些设计决策背后的原因。
187 0
TFTP 协议(修订版 2)
|
存储 监控 安全
SNMP 协议解析(一)
SNMP 协议解析(一)
308 1
SNMP 协议解析(一)
|
缓存 Ubuntu 网络协议
syslog配置
syslog配置
328 0
syslog配置
|
缓存 网络协议 安全
CentOS7下使用TCP over TLS方式安全传输远程主机系统日志
CentOS7下使用TCP over TLS方式安全传输远程主机系统日志
268 0
CentOS7下使用TCP over TLS方式安全传输远程主机系统日志
|
安全
syslog
1、void openlog(const char *ident, int option, int facility); 第一个参数ident将是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。
1088 0
|
安全 Unix Python