Syslog配置及使用简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Syslog配置及使用简介
目录
Syslog配置及使用简介 (1)
1.Syslog简介 (2)
2.Syslog协议 (2)
2.1. syslog体系结构 (2)
2.2. syslog包格式 (2)
3.Syslog配置 (3)
3.1 概览 (4)
3.2选择符 (4)
3.3 动作 (4)
4.C语言中的syslog (5)
4.1 openlog (5)
4.2 syslog (5)
4.3 closelog (6)
4.4 setlogmask (6)
4.5例子 (6)
5.参考文献 (7)
1.Syslog简介
Syslog常被称作系统日志,在80年代作为sendmail的一部分而发布,由于其可用性,现在已成为用来在internet中传递日志信息的事实上的标准。

这些传递日志的程序或数据库同时也被称作syslog。

Syslog是主从式的协议,syslog发送端发送一些小的文字信息到syslog 接收端,接收端根据配置文件把收到的信息进行存储或者处理,或者再次进行转发。

Syslog通常被用作系统信息管理,由于其已在大多数系统上实现,所以它可以把不同类型主机上的信息集中整合到一起。

但是它仍然有许多缺陷,表现在下面几个方面:Syslog 的传输是通过UDP或者TCP传输,安全性并不可靠。

一般可以通过ssl加密壳来完成加密;syslog的实时性不好,只能通过更改配置加以改进。

所以syslog主要用在安全性要求不高,实时性不强的地方。

2.Syslog协议
syslog使用UDP协议作为它的传输层协议,其默认使用UDP端口514。

2.1. syslog体系结构
syslog模糊了发送方、接收方,设备、中继以及收集器的区别,一台设备可以同时是某种日志信息的中继、也可以是另外某种信息的收集器,同时可以作为发送者发送日志:
●发送方发送日志信息至某个主机,并不知道这台主机会如何处理这些日志。

●发送方可以通过配置,把同一条日志同时发送给多个接收者。

●中继可以发送所有或者部分信息给后序接收者,这种情况下它不完全是中继,也是
一个收集信息者。

●中继可以产生自己的日志信息发送给后序接收者,这种情况下它也是一个产生信息
的设备。

2.2. syslog包格式
Syslog包分为3个部分,PRI, HEADER,以及MSG,总长度不能超过1024个字节。

2.2.1 PRI
PRI是priority的缩写,它代表了facility以及severity,即代表消息来源以及消息的严重程度。

它必须是1、2或者3个十进制字符,用‘<’,‘>’括起后组成的串,它是由facility 以及severity构成,组成的方法是把facility的值乘以8,再加上severity的值。

如facility取值local4(20), severiry为warning(4),那么pri的值为<164>。

Facility的取值如下表所示:
Numerical Code Facility
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)
严重等级分为:
Numerical Code Severity
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
2.2.2 HEADER部分
HEADER部分包含一个时间戳以及发送方的主机名或者ip地址,并且HEADER部分必须是一些可打印字符。

时间戳部分是格式为”Mmm dd hh:mm:ss”的本地时间,其中Mmm是3个字母的英文缩写,如果日期小于10,必须用空格代替缺少的一个数字。

主机名部分一半使用主机名,如果没有的话可以使用IPv4或者IPv6的地址。

需要注意的是主机名中不能包含任何空格。

时间戳和主机名后面都各自跟一个空格。

2.2.3 MSG部分
消息体部分一般包含生成消息的进程信息(TAG field)以及消息正文(CONTENT field)。

TAG部分主要是包含生成消息的进程信息,不能超过32个字符。

消息体必须是一些可见字符,这部分就是消息的正文。

TAG与CONTENT之间的间隔用非字母表字母隔开,一般用”[“,”:”或者空格隔开。

3.Syslog配置
3.1 概览
Syslog的全局配置文件一般存储在/etc/目录下,名为syslog.conf,由它指定syslogd程序对日志信息的处理。

配置文件由一系列的规则组成,一般每行一个规则,也可以使用反斜杠“\”来续行。

配置文件中每个规则都是由两部分组成,分别叫做选择符以及其对应的动作。

选择符就是指上文介绍过的priority,包括facility以及severity,动作指匹配成功的话应执行的动作,如把日志写入管道,写入文件,或者再转发至另一台主机。

3.2选择符
选择符包括两部分,facility以及severity,两部分以一个点号”.”分割。

这两个部分都大小写无关,并且可以使用上文中定义的数字来代替字符。

Facility部分可以使用下列关键字:auth, authpriv, cron, daemon, ftp, kern, lpr, mail, mark, news, security (same as auth), syslog, user, uucp and local0 到local7,或者使用其对应的数字。

Severity部分可以使用下列关键字:debug, info, notice, warning, warn (等同于warning), err, error(同err), crit, alert, emerg, panic (同emerg)。

最初的BSD syslogd程序中,程序会把等于或者高于指定severity等级的日志按照指定动作来执行,现在syslogd程序中还包括一些有用的扩展:
●“*”号,可以代表任何facility或者severity,根据在”.”之前或之后判断。

●“,”号,可以分割facility,这样可以把几个facility可以合并。

但是severity不能这
样合并。

●“;”号,可以指定多个选择符,后面跟一个动作。

处理得顺序是按照从前向后的顺
序匹配选择符,并且后面的选择符可以覆盖前面的。

因此可以使用这种特性来排除
一些特殊的等级。

●“=”号,可以加在severity前面,表示准备匹配。

●“!”号,表示忽略这种severity或者更高等级,也可以与”=”号一起用。

3.3 动作
动作表示收到匹配的日志信息以后的处理动作,主要有写入文件,命名管道,终端,写入远程,提醒当前某些用户。

1.写入普通文件。

后面加入日志文件的绝对路径即可。

也可以添加“-”号来表示不
立即写入。

如:*.=crit;kern.none /var/adm/critical
2.命名管道。

通过加上”|”即可把日志写入命名管道。

如:mail,news.=info | /tmp/message.fifo
3.终端。

只要动作中指定的文件是一个tty文件即可。

如:mail.=info /dev/tty12
4.远端机器。

添加”@”符号,加上远端主机名/ip地址即可。

syslog需要-h参数启动才
会转发远端而来的消息。

如:kern.crit @finlandia
5.用户。

直接在动作之中写入用户列表的名字即可。

以逗号分割各个用户。

如:*.alert root,joey
6.所有已登陆用户。

在动作中直接“*”号,表示把信息直接显示到已登陆用户的终
端上。

如:*.=emerg *
4.C语言中的syslog
GNU C库中包含了写syslog的一些库函数,使用这些函数可以方便的对syslog进行写操作。

Glibc中主要包含以下syslog相关函数:
* openlog: 打开连接
* syslog; vsyslog: 写syslog
* closelog: 关闭连接
* setlogmask: 置标志,可以实现忽略某些消息
4.1 openlog
openlog函数在syslog.h中被声明,其原型如下:
void openlog (const char *ident, int option, int facility);
openlog不是必须被调用的,但是可以方便syslog的使用。

indent表示一串字符串,以后调用syslog写日志时这个字符串都会被自动添加到正文之前,一般用来表示当前程序的名字。

如果indent为NULL, 或者openlog没有被调用过,那么默认的名字是当前进程名。

option是一个位串,有以下掩码构成:
LOG_PERROR:记录至syslog的同时写到标准错误输出。

默认不写入标准错误输出。

LOG_CONS:如果写入Syslog失败时写入控制台,默认不写入控制台。

LOG_PID:是否把进程ID也加入到信息中去。

LOG_NDELAY:打开的话,openlog会打开连接,否则syslog调用时才连接。

LOG_ODELAY:无意义,为兼容旧版本。

facility是此连接的默认的facility,参见上文facility相关内容。

默认是LOG_USER。

4.2 syslog
syslog就是记录日志的主函数,它通过写socket /dev/log(syslogd进程一直在监听此socket文件)实现写日志,其原型如下:
void syslog (int facility_priority, char *format, ...)
facility_priority参数就是facility和severity的集合,可以使用LOG_MAKEPRI宏来生成此参数:
LOG_MAKEPRI(LOG_USER, LOG_W ARNING)
也可以直接使用syslog.h中定义的宏把facility与severity连接起来即可。

如:syslog(LOG_WARN|LOG_LOCAL1, “message”);
其中LOG_LOCAL1宏的定义为(17<<3)。

对应我们上文介绍的facility,有以下宏定义:
#define LOG_KERN (0<<3) /* kernel messages */
#define LOG_USER (1<<3) /* random user-level messages */
#define LOG_MAIL (2<<3) /* mail system */
#define LOG_DAEMON (3<<3) /* system daemons */
#define LOG_AUTH (4<<3) /* security/authorization messages */
#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */
#define LOG_LPR (6<<3) /* line printer subsystem */
#define LOG_NEWS (7<<3) /* network news subsystem */
#define LOG_UUCP (8<<3) /* UUCP subsystem */
#define LOG_CRON (9<<3) /* clock daemon */
#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */
#define LOG_FTP (11<<3) /* ftp daemon */
#define LOG_LOCAL0 (16<<3) /* reserved for local use */
#define LOG_LOCAL1 (17<<3) /* reserved for local use */
#define LOG_LOCAL2 (18<<3) /* reserved for local use */
#define LOG_LOCAL3 (19<<3) /* reserved for local use */
#define LOG_LOCAL4 (20<<3) /* reserved for local use */
#define LOG_LOCAL5 (21<<3) /* reserved for local use */
#define LOG_LOCAL6 (22<<3) /* reserved for local use */
#define LOG_LOCAL7 (23<<3) /* reserved for local use */
对应严重等级的宏有:
LOG_EMERG
LOG_ALERT
LOG_CRIT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
后面的参数部分是一个可变长参数,使用方法和常用的printf相同。

4.3 closelog
closelog函数会关闭当前连接,如果有连接打开的话。

函数原型为:
void closelog (void);
4.4 setlogmask
setlogmask函数可以使后面调用syslog时忽略某些等级,与syslog.conf中配置的不同,如果被setlogmask函数忽略掉的日志,永远不会被发送至syslog。

它的原型为:int setlogmask (int mask);
其中mask是一个位串,其中每位表示一个等级,如果此位为1,那么syslog正常处理;如果为0,则忽略掉此信息。

通过宏LOG_MASK可以方便的表示可以忽略掉那些等级,如:
LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR)
表示忽略EMERG和ERROR。

或者使用~,如:
~(LOG_MASK(LOG_INFO))
表示忽略INFO以外的等级。

也可以使用宏LOG_UPTO,表示某等级或者此等级以上。

4.5例子
#include <syslog.h>
setlogmask (LOG_UPTO (LOG_NOTICE));
openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
syslog (LOG_NOTICE, "Program started by User %d", getuid ());
syslog (LOG_INFO, "A tree falls in a forest");
closelog ();
5.参考文献
1. BSD syslog protocol, RFC 3164, .ua/rfc/rfc3164.html
2. GNU C lib: /software/libtool/manual/libc/Submitting-Syslog-Messages.html
3. /articles/20030220.html。

相关文档
最新文档