syslog 使用总结

来源:互联网 发布:工艺流程设计软件 编辑:程序博客网 时间:2024/06/05 18:32

rsyslog 简介

1、介绍

在Unix类操作系统上,syslog广泛应用于系统日志。syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网络管理工具、安全管理系统、日志审计系统。 
完整的syslog日志中包含产生日志的程序模块(Facility)、严重性(Severity或 Level)、时间、主机名或IP、进程名、进程ID和正文。在Unix类操作系统上,能够按Facility和Severity的组合来决定什么样的日志消息是否需要记录,记录到什么地方,是否需要发送到一个接收syslog的服务器等。由于syslog简单而灵活的特性,syslog不再仅限于 Unix类主机的日志记录,任何需要记录和发送日志的场景,都可能会使用syslog。 
长期以来,没有一个标准来规范syslog的格式,导致syslog的格式是非常随意的。最坏的情况下,根本就没有任何格式,导致程序不能对syslog 消息进行解析,只能将它看作是一个字符串。 
在2001年定义的RFC3164中,描述了BSD syslog协议: 
http://www.ietf.org/rfc/rfc3164.txt 
不过这个规范的很多内容都不是强制性的,常常是“建议”或者“约定”,也由于这个规范出的比较晚,很多设备并不遵守或不完全遵守这个规范。接下来就介绍一下这个规范。 
约定发送syslog的设备为Device,转发syslog的设备为Relay,接收syslog的设备为Collector。Relay本身也可以发送自身的syslog给Collector,这个时候它表现为一个Device。Relay也可以只转发部分接收到的syslog消息,这个时候它同时表现为Relay和Collector。 
syslog消息发送到Collector的UDP 514端口,不需要接收方应答,RFC3164建议 Device 也使用514作为源端口。规定syslog消息的UDP报文不能超过1024字节,并且全部由可打印的字符组成。完整的syslog消息由3部分组成,分别是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能没有。

2、syslog的格式 

下面是一个syslog消息: 
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting. 
其中“<30>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分,“auditd[1787]: The audit daemon is exiting.”是MSG部分。

2.1、PRI部分 

PRI部分由尖括号包含的一个数字构成,这个数字包含了程序模块(Facility)、严重性(Severity),这个数字是由Facility乘以 8,然后加上Severity得来。不知道他们为什么发明了这么一种不直观的表示方式。 
也就是说这个数字如果换成2进制的话,低位的3个bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。 
十进制30 = 二进制0001 1110 
0001 1… = Facility: DAEMON - system daemons (3) 
…. .110 = Severity: INFO - informational (6)

Facility的定义如下,可以看出来syslog的Facility是早期为Unix操作系统定义的,不过它预留了User(1),Local0~7 (16~23)给其他程序使用: 
Numerical Facility 
Code

0 kernel messages 
1 user-level messages 
2 mail system 
3 system daemons 
4 security/authorization messages (note 1) 
5 messages generated internally by syslogd 
6 line printer subsystem 
7 network news subsystem 
8 UUCP subsystem 
9 clock daemon (note 2) 
10 security/authorization messages (note 1) 
11 FTP daemon 
12 NTP subsystem 
13 log audit (note 1) 
14 log alert (note 1) 
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)

Note 1 - Various operating systems have been found to utilize 
Facilities 4, 10, 13 and 14 for security/authorization, 
audit, and alert messages which seem to be similar. 
Note 2 - Various operating systems have been found to utilize 
both Facilities 9 and 15 for clock (cron/at) messages.

Severity的定义如下:

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

也就是说,尖括号中有1~3个数字字符,只有当数字是0的时候,数字才以0开头,也就是说00和01这样在前面补0是不允许的。

2.2、HEADER部分 

HEADER部分包括两个字段,时间和主机名(或IP)。 
时间紧跟在PRI后面,中间没有空格,格式必须是“Mmm dd hh:mm:ss”,不包括年份。“日”的数字如果是1~9,前面会补一个空格(也就是月份后面有两个空格),而“小时”、“分”、“秒”则在前面补“0”。月份取值包括: 
Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 
时间后边跟一个空格,然后是主机名或者IP地址,主机名不得包括域名部分。 
因为有些系统需要将日志长期归档,而时间字段又不包括年份,所以一些不标准的syslog格式中包含了年份,例如: 
<165>Aug 24 05:34:00 CST 1987 mymachine myproc[10]: %% It's 
time to make the do-nuts. %% Ingredients: Mix=OK, Jelly=OK # 
Devices: Mixer=OK, Jelly_Injector=OK, Frier=OK # Transport: 
Conveyer1=OK, Conveyer2=OK # %% 
这样会导致解析程序将“CST”当作主机名,而“1987”开始的部分作为MSG部分。解析程序面对这种问题,可能要做很多容错处理,或者定制能解析多种syslog格式,而不仅仅是只能解析标准格式。 
HEADER部分后面跟一个空格,然后是MSG部分。 
有些syslog中没有HEADER部分。这个时候MSG部分紧跟在PRI后面,中间没有空格。

2.3、MSG部分 

MSG部分又分为两个部分,TAG和Content。其中TAG部分是可选的。 
在前面的例子中(“<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.”),“auditd[1787]”是TAG部分,包含了进程名称和进程PID。PID可以没有,这个时候中括号也是没有的。 
进程PID有时甚至不是一个数字,例如“root-1787”,解析程序要做好容错准备。 
TAG后面用一个冒号隔开Content部分,这部分的内容是应用程序自定义的。

3、RFC3195 

BSD syslog协议使用UDP协议在网络中传递,然而UDP是一个不可靠的协议,并且syslog也没有要求接收方有所反馈。为了解决这个问题,RFC又定义了一个新的规范来可靠的传递syslog消息,它使用TCP协议: 
http://www.ietf.org/rfc/rfc3195.txt 
不过大多数情况下,使用UDP发送不需要确认的syslog消息,已经能够满足要求了,并且这样做非常简单。因此到目前为止,RFC3195的应用还是很少见。

syslog 使用函数库编程

C++

#include <string>#include <syslog.h>#include <iostream>using namespace std; int main(int argc, char** argv){        int i;        for(i=1;i<=100;i++)        {        syslog(LOG_LOCAL1 | LOG_INFO, "Message:%d", i);        }        cout<<i-1;        return 0;}

UNIX 下使用 C++ socket 向 syslog 服务器发送日志

#include<unistd.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#define BUF_SIZE 1024 int main(){/* 服务端地址 */struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr("192.168.136.186");server_addr.sin_port = htons(514); /* 创建socket */int client_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);if(client_socket_fd < 0){  perror("Create Socket Failed:");  exit(1);} //发送if(sendto(client_socket_fd, "Hello World!", sizeof("Hello World!"),0,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0){  perror("Send File Name Failed:");  exit(1);} close(client_socket_fd);return 0;}

syslog 问题

syslog 发送速度限制

rsyslog 5.7.1 版本之后默认有日志发送速度限制,如果在某一时间点发送大量日志,则超过限制的日志则会被全部丢弃。
所谓速度限制(Rate Limit)就是指,在某个固定的时间段内,syslog最多允许打印的log信息数量(多出的log信息将被丢弃)。它由配置文件/etc/rsyslog.conf中以下两个配置项决定:
$SystemLogRateLimitInterval [Number1]: Number1 为设定的限制的时间间隔大小
$SystemLogRateLimitBurst [Number2]: Number2 为在设定的限制的时间间隔内,最多输出的log信息数量。
在设定完后,则表示在每一个Number1时间间隔内,如果超过Number2个数的log信息将会被去除。默认Number1为5秒钟,Number2为200。但如果我们不希望,在打印的log时有丢失,则可以在/etc/rsyslog.conf中添加或者设置:
$SystemLogRateLimitInterval 0
设置完成后,需要重新启动rsyslog服务: service rsyslog restart

syslog 缓冲区溢出

Rsyslog单独使用了一篇文档来介绍实现可靠消息传输。首先rsyslog阐述了单独使用tcp协议的不可靠性,比如server端宕机等等情况。为此如上面介绍队列时提到的内容,我们需要在client配置一个本地文件,用来在server端宕机这种情况下,暂时保存消息。需要注意的是,队列名是和过滤规则对应的,一个队列只能用于一个过滤规则,例:


$ActionQueueType LinkedList
$ActionQueueFileName local3
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
Local3.*                                            @@10.0.0.44:1999


$ActionQueueType LinkedList
$ActionQueueFileName local4
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
Local4.*                                            @@10.0.0.44:1999       
此处只是为了说明问题,更简单的写法,是把两条过滤规则写成一条:local3.*;local4.*。还有一点需要强调的是,本地队列只有在需要使用的时候才会创建,当后端出现短暂不可用是,rsyslog的内存队列就可以保存消息,内存队列不够用时,才会创建本地队列。

syslog 接收服务器宕机或者网络故障导致日志丢失

参考文章:https://blog.g3rt.nl/remote-logging-rsyslog-relp.html

0 0
原创粉丝点击