rsyslog & syslog详解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 前言: rsyslog 是一个 syslogd 的多线程增强版。syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序,守护进程和内核提供了访问系统的日志信息。

前言:

rsyslog 是一个 syslogd 的多线程增强版。syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序,守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。
      几乎所有的网络设备都可以通过syslog协议,将日志信息以用户数据报协议(UDP)方式传送到远端服务器,远端接收日志服务器必须通过syslogd监听UDP 端口514,并根据 syslog.conf配置文件中的配置处理本机,接收访问系统的日志信息,把指定的事件写入特定文件中,供后台数据库管理和响应之用。意味着可以让任何事件都登录到一台或多台服务器上,以备后台数据库用off-line(离线) 方法分析远端设备的事件。
      通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。

 

需求背景:

 

以及在系统日志落地前支持hook处理。

 

安装:

yum install rsyslog -y

  

 

一、什么是syslog协议

1、介绍(略)

2、syslog标准协议如下图

  这里的facility为模块,serverity为等级,由这两个信息共同计算出一个PRI头部。HEADER部分包含了时间和主机名。在HEADER和MSG之间有一个空格,MSG是需要记录的日志部分(日志消息体)。

  这里也就是说,理论上使用这种格式构造的字符串发送,接收方就能解析出来。实际上根据实验,我使用了UDP发送,接收方syslog日志服务器能正确解析。

  这里需要注意的是,如果使用了程序的库,比如:python的syslog库(同样c++也有相似的库),那么就不再需要关注PRI和HEADER部分,只要将相关的参数(facility,severity,time,ip)传入函数,调用发送就可以,不必自己构造字符串。对服务端来说,接收到的是整个消息,但通常来讲,比如使用linux默认的rsyslog作为接收服务端的话,是不能看到除MSG之外的部分。所看到的消息跟接收端配置有关,这个在下面有具体的讲。

3、以下是各级别及对应的数字代码

Facility:有0-23种设备可选,在python的syslog库中有一部分缺失

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 
16-23     local0 - local7

Severity:日志等级

0 Emergency
1 Alert
2 Critical
3 Error
4 Warning
5 Notice
6 Informational
7 Debug

这里结合等级再详细讲一下syslog协议:

Priority(优先级) = facility * 8 + severity值。比如说,一个核心信息(facility=0)和一个Emergency的severity将会产生优先级为0。同样, 一个“local use 4”信息(facility=20)和一个Notice的severity(severity=5)将会产生165的优先级。

标题(HEADER)部分由称为TIMESTAMP和HOSTNAME的两个域组成,PRI结尾的“>”会马上跟着一个 TIMESTAMP,任何一个TIMESTAMP或者HOSTNAME域后面都必须跟着一个空格字符。HOSTNAME包含主机的名称,若无主机名或无法 识别则显示IP地址。如果一个主机有多个IP地址,它通常会使用它传送信息的那个IP地址。TIMESTAMP是本机时间,采用的格式是“Mmm dd hh:mm:ss”表示月日时分秒。HOSTNAME域仅仅能够包括主机名称,Ipv4地址或者是信息产生者的Ipv6地址。

MSG部分是Syslog数据包剩下的部分。这通常包含了产生信息进程的额外信息,以及信息的文本部分。MSG部分有两个域,分别为TAG域和 CONTENT域,TAG域的值是产生信息的程序或者进程的名称,CONTENT包含了这个信息的详细内容。传统上来说,这个域的格式较为自由,并且给出 一些时间的具体信息。TAG是一个不许超过32个字符的字母数字字符串,任何一个非字母数字字符都将会终止TAG域,并且被假设是CONTENT域的开 始。在大多数情况下,表示TAG结束的CONTENT域的第一个字符用左大括号( [ ],分号( : )或者是空格来表示。

4、Syslog库

  以python的库为例:

  openlog(ident[, logopt[, facility]])

  首先需要使用openlog指定模块及相应的信息。ident为头部需要显示的字符串,这个信息不包含在MSG中,可以通过配置日志服务器模板决定是否显示。logopt是一些参数,可选择有(LOG_PIDLOG_CONSLOG_NDELAYLOG_NOWAIT and LOG_PERROR),对应的分别是(包括每个消息PID,直接写入系统控制台,立即打开连接,不等待子进程(因为其有可能在记录消息的时候就被创建了,GNU C库不创建子进程,所以该选项在Linux上没有影响),同时输出到stderr)。facility则是模块参数,需要填入对应的值,这里syslog库中有以下参数使用:

1
2
LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_LPR
LOG_NEWS, LOG_UUCP, LOG_CRON  and  LOG_LOCAL0 to LOG_LOCAL7

  通常来说,openlog需要在模块最开始指定,即限定了这个模块内都是一个facility的日志。

  

  syslog([sevirity], msg):

  这个是具体打印日志的函数,第一个参数指定消息的级别,第二个参数为日志内容。

  sevirity对应的参数为:

1
LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, <br>LOG_NOTICE, LOG_INFO, LOG_DEBUG.

  

  closelog():

  这个是关闭的功能,不过多解释了。

5、说明部分

  python的syslog库打印日志是依赖了rsyslog服务,具体的转发规则,记录文件等在rsyslog.conf中配置

二、了解rsyslog服务

1、rsyslog介绍(略)

2、rsyslog配置文件

  配置文件/etc/rsyslog.conf大概分为三个部分

  #MODULES

  这个部分是针对接收配置的,主要是指定接收日志的协议和端口。若要配置日志服务器,则需要将相应的配置项去掉注释。

  #GLOBAL DIRECTIVES

  这个部分主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。

  默认配置为:

1
2
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

  这里列举一个模板,将所有信息保存:

1
2
3
4
5
6
7
8
9
10
11
12
# 这里第一行(为了方便显示,参数写成了一列)是模板,即日志服务器记录到日志文件的格式
# 第二行是指定需要使用的模板myFormat,这个名字可以自己定义
$template myFormat," % TIMESTAMP %  host = % HOSTNAME % ,
                   relayHost = % FROMHOST % ,
                   tag = % syslogtag % ,
                   programName = % programname % ,
                                 procid = % PROCID % ,
                                 facility = % syslogfacility - text % ,
                                 sev = % syslogseverity - text % ,
                                 appName = % APP - NAME % ,
                                 msg = % msg % \n"
$ActionFileDefaultTemplate myFormat

  模板额外说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#在rsyslog7 和更高版本使用以下格式:
template(name = "scalaLogFormat"  type = "list" ) {
         property (name = "timestamp"  dateFormat = "rfc3339" )
         constant(value = " host=" )
         property (name = "hostname" )
         constant(value = ", relayHost=" )
         property (name = "fromhost" )
         constant(value = ", tag=" )
         property (name = "syslogtag" )
         constant(value = ", programName=" )
         property (name = "programname" )
         constant(value = ", procid=" )
         property (name = "procid" )
         constant(value = ", facility=" )
         property (name = "syslogfacility-text" )
         constant(value = ", sev=" )
         property (name = "syslogseverity-text" )
         constant(value = ", appName=" )
         property (name = "app-name" )
         constant(value = ", msg=" )
         property (name = "msg"  )
         constant(value = "\n" )
         }

  ### begin forwarding rule

  这个模块主要讲一下转发

  #*.* @@remote-host:514

  根据这个实例可以看出,分为4个部分[模块.等级] [转发协议][日志服务器地址]:[日志服务器端口],其中转发协议的参数@@为TCP协议,对应的接收端也需要配置接受TCP协议。@为UDP协议。

  注:使用TCP协议,若地址错误或不能连同的情况,转发的协议会写入缓存,但是不用担心会卡死服务器,当到达一定限度后会自动转存到硬盘,这个不是我们应该关心的部分,使用就好了。

说明:

  针对rsyslog.conf配置文件的所有操作都需要重启服务生效(service rsyslog restart)

  在新版本的rsyslog中,对日志发送有默认限速,如果有集中大量推送日志的情况,需要在配置文件中加上参数$SystemLogRateLimitInterval 0(具体位置没有影响,但通常写在GLOBAL DIRECTIVES模块)

  通常来说,日志推送到服务器的协议使用UDP

 

谋胆并重
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
缓存 Ubuntu 网络协议
syslog配置
syslog配置
363 0
syslog配置
|
网络协议 Linux
|
安全
syslog
1、void openlog(const char *ident, int option, int facility); 第一个参数ident将是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。
1126 0
|
安全 Unix Python
|
存储 监控 关系型数据库
|
监控 Linux
|
网络协议 数据库