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
- syslog 使用总结
- syslog总结
- [linux]syslog使用
- syslog 配置使用
- syslog的使用
- syslog使用详解
- syslog函数的使用
- python使用syslog模块
- syslog使用介绍
- syslog的使用
- syslog使用介绍
- linux日志syslog知识总结
- 使用flume问题总结1——搭建flume+测试Syslog source
- syslog
- syslog
- Syslog
- Syslog
- SYSLOG
- Android Studio中将activity设置为无标题
- VectorDrawable兼容笔记
- 利用BP神经网络教计算机进行非线函数拟合(代码部分单层)
- 简单话题:LED呼吸灯和串口LED指示灯
- Java 8新特性探究(二):深入解析默认方法
- syslog 使用总结
- JAVA 注解(Annotation)自定义注解入门
- 常见报错处理
- 安全架构总体方案
- QGroundControl Developers Guide——Fact System
- 安装交叉调试器gdb,编译出错cc1: warnings being treated as errors
- 完美解决Only the original thread that created a view hierarchy can touch its views
- ls
- 偶显eclipse打开workspace崩溃