一、syslog协议介绍
1、介绍在Unix类操作系统上,rsyslog广泛应用于系统日志。rsyslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网络管理工具、安全管理系统、日志审计系统。
完整的syslog日志中包含产生日志的程序模块(Facility)、严重性(Severity或 Level)、时间、主机名或IP、进程名、进程ID和正文。在Unix类操作系统上,能够按Facility和Severity的组合来决定什么样的日志消息是否需要记录,记录到什么地方,是否需要发送到一个接收rsyslog的服务器等。由于rsyslog简单而灵活的特性,rsyslog不再仅限于 Unix类主机的日志记录,任何需要记录和发送日志的场景,都可能会使用rsyslog。
rsyslog是syslog的多线程增强版,现在Fedora、Ubuntu,、rhel6、centos6默认的日志系统都是rsyslog了。rsyslog主要用来收集系统产生的各种日志,日志默认放在/var/log/目录下。先简单看看配置文件,然后给几个实例也算是对rsyslog的一个更深入的理解吧。
1、配置文件解析
主配置文件/etc/rsyslog.conf配置文件中有很多内容, 但最主要的是指定需要记录哪些服务和需要记录服务什么等级的信息。
格式是:日志设备[连接符号]日志级别 日志处理方式(action)
a)、日志设备(可以理解为日志类型):
auth --pam产生的日志
authpriv --ssh,ftp等登录信息的验证信息
cron --定时任务
kern --内核
lpr --打印
mail --邮件
mark(syslog) --rsyslog服务内部的信息,时间标识
news --新闻组
user --用户程序产生的相关信息
uucp --unix to unix copy, unix主机之间相关的通讯
local1~7 --自定义的日志设备
|
b)、日志级别,从上到下,级别从高到低,记录的信息越来越少。
debug --有调式信息的,日志信息最多
info --一般信息的日志,最常用
notice --最具有重要性的普通条件的信息
warning --警告级别
err --错误级别,阻止某个功能或者模块不能正常工作的信息
crit --严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert --需要立刻修改的信息
emerg --内核崩溃等严重信息
none --什么都不记录
|
c)、连接符号,其中的xxx表示某一日志级别
.
xxx 表示小于等于xxx级别的日志信息
.=xxx 表示等于xxx级别的日志信息
.!xxx 表示在xxx之外的等级的日志信息
.* 所有等级的日志信息
|
d)、日志处理方式,意思就是将特定的日志做怎样的处理。
1. 记录到普通文件或设备文件::
/var/log/file.log #将日志记录到文件/var/log/file.log
/dev/pts/0 #将日志记录在设备/dev/pts/0
2. 转发到远程的日志服务器
@192.168.0.1 #使用UDP协议转发到192.168.0.1的514(默认)端口
@@192.168.0.1:10514 #使用TCP协议转发到192.168.0.1的10514端口,这是指定非默认端口10514,tcp的默认端口也是514
3. 发送给用户(需要在线才能收到)::
root #发给root用户
root,kadefor,up01 #使用,号分隔多个用户
* #*号表示所有在线用户
4. 忽略,丢弃::
~ # 忽略丢弃日志
5. 执行脚本::
^/tmp/test.sh #^号后跟可执行脚本或程序的绝对路径,这个可以用来触发报警动作。
|
举2个例子
将mail的所有级别的日志,记录到文件/var/log/maillog中,其中的符号”-“表示使用缓存模式
mail.* -/var/log/maillog
|
将所有日志的所有级别的信息采用UDP协议送给远程服务器192.168.186.134一份
*.* @192.168.186.134
|
2、用实例说话
a)、将所有服务器的系统日志送给远程日志服务器,远程服务器用来接收和集中所有服务器送来的系统日志。
采用UDP协议发送和接收,在远程服务器端配置文件/etc/rsyslog.conf开启下面两行
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
|
客服端的配置文件/etc/rsyslog.conf最后新增加一行,用来将所有的日志信息发送给远程的服务器192.168.186.134
*.* @192.168.186.134
|
每次更改配置文件后不要忘记重启rsyslog服务。
测试:重启某台服务器的rsyslog服务看看远程的服务器能不能收到日志
[root@syndic02 ~]# /etc/init.d/rsyslog restart
关闭系统日志记录器: [确定]
启动系统日志记录器: [确定]
[root@syndic02 ~]#
|
看远程的服务器已经收到了相应的日志,如果没有收到日志是不是防火墙挡住了,如果没有使用标准的端口还要看看是不是SELinux服务开启了。
[
root@saltstack ~]# tailf /var/log/messages
... ... ...
Nov 13 14:32:50 syndic02 kernel: Kernel logging (proc) stopped.
Nov 13 14:32:50 syndic02 rsyslogd: [origin software="rsyslogd"swVersion="5.8.10"x-pid="1641"x-info="http://www.rsyslog.com"] exiting on signal 15.
Nov 13 14:32:50 syndic02 kernel: imklog 5.8.10, log source= /proc/kmsgstarted.
Nov 13 14:32:50 syndic02 rsyslogd: [origin software="rsyslogd"swVersion="5.8.10"x-pid="1657"x-info="http://www.rsyslog.com"] start
|
b)自定义设备,手动将日志送给rsyslog服务
先修改配置文件,新增自定义设备local0并将其info级别及其以下级别的日志记录到文件/var/log/test.log文件中
local0.info /var/log/test.log
|
修改配置文件后不要忘记重启rsyslog服务使其生效
然后我们用logger命令向设备local0送日志,总共发送了4次日志,前三次的级别都是info及其以下级别的日志,第四次是debug级别的日志。参数”-t”是将每次发送的日志信息打上自定义标签。
[root@syndic02 ~]# logger -p local0.info "hello world"
[root@syndic02 ~]# logger -t "This is Test" -p local0.info "hello world"
[root@syndic02 ~]# logger -t "This is Test" -p local0.warning "hello world"
[root@syndic02 ~]# logger -t "This is Test" -p local0.debug "hello world"
[root@syndic02 ~]#
|
结果是前三次都记录到了文件/var/log/test.log中,第四条由于超过info级别为debug级别故忽略了。
[root@syndic02 ~]# tailf /var/log/test.log
Nov 13 14:41:27 syndic02 root: hello world
Nov 13 14:42:22 syndic02 This is Test: hello world
Nov 13 14:42:56 syndic02 This is Test: hello world
|
c、收集各台服务器的history记录,可以参考文章《日志管理(1) 审计并收集history记录》。
关于rsyslog的简单介绍就这些了,其它用法如过滤、加载外部模块、收集MySQL程序日志等,有兴趣的可以继续深入
二、syslog函数
Linux C中提供一套系统日记写入接口,包括三个函数:openlog,syslog和closelog。
调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。
#include //头文件
void openlog (char*ident, int option, int facility);
void closelog();
void syslog(int priority, char*format,……);
priority参数的格式(severity level|facility code)
示例:
LOG_ERR|LOG_USER
severity level:
Priority Level Description
LOG_EMERG An emergency situation
LOG_ALERT High-priority problem, such as database corruption
LOG_CRIT Critical error, such as hardware failure
LOG_ERR Errors
LOG_WARNING Warning
LOG_NOTICE Special conditions requiring attention
LOG_INFO Informational messages
LOG_DEBUG Debug messages
facility value(转自syslog.h头文件):
#define LOG_KERN (0<<3)
#define LOG_USER (1<<3)
#define LOG_MAIL (2<<3)
#define LOG_DAEMON (3<<3)
#define LOG_AUTH (4<<3)
#define LOG_SYSLOG (5<<3)
#define LOG_LPR (6<<3)
#define LOG_NEWS (7<<3)
#define LOG_UUCP (8<<3)
#define LOG_CRON (9<<3)
#define LOG_AUTHPRIV (10<<3)
#define LOG_FTP (11<<3)
1)、syslog日志服务:
1、守护进程:syslog
2、端口:514
3、配置文件:/etc/rsyslog.conf (centos6起/etc/syslog.conf不再有!而是/etc/rsyslog.conf代替!)
4、常见日志文件:
/var/log/dmesg 内核引导信息日志
/var/log/message 标准系统错误信息日志
/var/log/maillog 邮件系统信息日志
/var/log/cron 计划任务日志
/var/log/secure 安全信息日志
syslog配置文件如下
-----------------------------------------------------------------
[root@server ~]# vim /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.*
-----------------------------------------------------------------
配置文件中每行表示一个项目,格式为:facility.level action
由两个部分组成:
第一部分:选择条件(可以有一个或者多个条件),分为两个字段。
第二部分:操作动作;
1、选择条件
选择条件本身分为两个字段,之间用一个小数点(.)分隔。前一字段是一项服务,后一字段是一个优先级。选择条件是对消息类型的一种分类,这种分类便于人们把不同类型的消息发送到不同的地方。在同一个syslog配置行上允许出现一个以上的选择条件,但必须用分号(;)隔开。
常见facility:
kern 内核信息;
user 用户进程信息;
mail 电子邮件相关信息;
daemon 后台进程相关信息;
authpriv 包括特权信息如用户名在内的认证活动;
cron 计划任务信息;
syslog 系统日志信息
lpr 打印服务相关信息。
news 新闻组服务器信息
uucp uucp 生成的信息
local0----local7 本地用户信息
例如:
52 # Log anything (except mail) of level info or higher.
53 # Don't log private authentication messages!
54 *.info;mail.none;authpriv.none;cron.none /var/log/messages
重要级是选择条件的第二个字段,它代表消息的紧急程度。
按严重程度由低到高排序:
debug 不包含函数条件或问题的其他信息
info 提供信息的消息
none 没有重要级,通常用于排错
notice 具有重要性的普通条件
warning 预警信息
err 阻止工具或某些子系统部分功能实现的错误条件
crit 阻止某些工具或子系统功能实现的错误条件
alert 需要立即被修改的条件
emerg 该系统不可用
不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级。如果某个选择条件只给出了一个优先级而没有使用任何优先级限定符,对应于这个优先级的消息以及所有更紧急的消息类型都将包括在内。比如说,如果某个选择条件里的优先级是“warning”,它实际上将把“warning”、 “err”、“crit”、“alert”和“emerg”都包括在内。
日志信息可以分别记录到多个文件里,还可以发送到命名管道、其他程序甚至另一台机器。
syslog 主要支持以下活动:
file 指定文件的绝对路径
terminal 或 prin 完全的串行或并行设备标志符
@host(@IP地址) 远程的日志服务器
3)、 搭建Linux日志服务器:
在“SYSLOGD_OPTIONS”行上加“-r”选项以允许接受外来日志消息。
-----------------------------------------------------------------
[root@client ~]# vim /etc/sysconfig/syslog
# Options to syslogd
# -m 0 disables 'MARK' messages.
# -r enables logging from remote machines
# -x disables DNS lookups on messages recieved with -r
# See syslogd(8) for more details
SYSLOGD_OPTIONS="-r -m 0"
# Options to klogd
# -2 prints all kernel oops messages twice; once for klogd to decode, and
# once for processing with 'ksymoops'
# -x disables all klogd processing of oops messages entirely
# See klogd(8) for more details
KLOGD_OPTIONS="-x"
#
SYSLOG_UMASK=077
# set this to a umask value to use for all log files as in umask(1).
# By default, all permissions are removed for "group" and "other".
-----------------------------------------------------------------
-----------------------------------------------------------------
[root@client ~]# service rsyslog restart
关闭内核日志记录器: [确定]
关闭系统日志记录器: [确定]
启动系统日志记录器: [确定]
启动内核日志记录器: [确定]
[root@client ~]#
-----------------------------------------------------------------
3、关闭iptables
[root@client ~]# service iptable stop
查看防火墙状态
# service iptable status
四、配置各客户端:
1、配置/etc/syslog.conf修改客户机/etc/syslog.conf文件,在有关配置行的操作动作部分用一个“@”字符指向日志服务器
-----------------------------------------------------------------
[root@client ~]# vim /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
*.* @10.64.165.210
# The authpriv file has restricted access.
authpriv.* /var/log/secure
……下面省略
-----------------------------------------------------------------
另外如果配置了DNS域名的话可以使用域名。
检测成果:
下图是我们在客户端重启iptables服务后在服务端看到的日志情况:
-----------------------------------------------------------------
[root@client ~]# cat /var/log/messages |tail
Nov 30 16:44:29 10.64.165.200 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Nov 30 16:44:33 10.64.165.200 kernel: Removing netfilter NETLINK layer.
Nov 30 16:44:33 10.64.165.200 kernel: ip_tables: (C) 2000-2006 Netfilter Core Team
Nov 30 16:44:33 10.64.165.200 kernel: Netfilter messages via NETLINK v0.30.
Nov 30 16:44:33 10.64.165.200 kernel: ip_conntrack version 2.4 (4096 buckets, 32768 max) - 228 bytes per conntrack