项目中运用到了syslog的远程打印,初次接触,抽空了解如下。
Linux中用来实现日志功能的服务为rsyslog,在centOS5及更早版本中使用的是syslog,rsyslog是syslog的增强版本。rsyslog一般默认都会安装且设置为自动启动。服务控制命令为:
$ service rsyslog restart(或start、stop)
rsyslog的配置文件为/etc/rsyslog.conf,日志消息则保存在/var/log/中,如/var/log/messages记录系统的正常日志消息,/var/log/dmesg记录系统内核相关的日志消息,/var/log/messages/secure记录安全相关的消息。我们可以使用tail-f命令实时监控日志文件内容。
rsyslog通过facility(程序模块)概念来定义日志消息的来源,以方便对日志进行分类的。facility有以下几种:
1.kern:内核消息
2.user: 用户级消息
3.mail: 邮件系统消息
4.daemon: (后台)系统服务消息
5.auth: 认证系统消息
6.syslog: 日志系统自身消息
7.authpriv: 权限系统消息
8.cron: 定时任务消息
9.news: 新闻系统消息
10.uucp: uucp系统消息
11.ftp: ftp服务消息
12.local 1~7: 自定义日志设备
除了日志来源之外,对于同一来源产生的日志消息还进行了优先级别划分,优先级分为:
1.none: 什么都不记录
2.emer: 系统已不可用
3.alert: 必须立即进行处理
4.crit: 严重错误
5.error: 错误
6.warning: 警告
7.notice: 正常消息,但是较为重要
8.info: 正常信息
9.debug: debug信息
日志级别,从上到下,级别从低到高,记录的信息越来越多。
rsyslog配置文件位于/etc/rsyslog.conf,其配置规则为:
facility.priority log_location(日志位置/执行的操作)
比如:
mail.* -/var/log/maillog #-表示写日志时不需要等到上次的数据已经写到磁盘了
*.info;mail.none;authpriv.none;cron.none /var/log/messages
如上,*表示任何facility,而info则表示小于等于info级别的日志,也就是debug和info日志。
如果需要将日志发送至一个同一的日志服务器,则可以配置为:
*.* @172.16.200.58 #使用UDP协议发送,默认端口时514
*.* @@172.16.200.57 #使用TCP协议发送,默认端口是514
忽略日志:
*.* ~
^号后跟可执行脚本或程序的绝对路径:
*.* ^/myhome/test.sh
举一个发送到另一个服务器的例子: 采用UDP协议,将所有系统日志送给远程日志服务器。
/etc/rsyslog.conf
Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
*.* @172.16.200.72
重启rsyslog服务:
$ service rsyslog restart
此时在系统执行su命令且故意输入错误密码,在目标机172.16.200.72通过tcpdump可以捕获到对应的数据包:
多测试一步,将tcpdump捕获的数据保存在.cap文件,然后用Windows的wireshark打开:
$ tcpdump -i eth1 port 514 -nn -w syslog_udp.cap
用wireshark打开后可见相关数据信息:
在代码中使用rsyslog服务也十分简单,只需要openlog(),syslog()和closelog()。一个简单的实例代码:
#include <stdio.h>
#include <syslog.h>
int main(int argc, char* argv[])
{
char buf[1024] = {'\0'};
openlog("my_rsyslog_test", LOG_CONS | LOG_PID, LOG_USER);
while (fgets(buf, sizeof(buf), stdin)) {
syslog(LOG_INFO, "%s\n", buf);
bzeor(buf, sizeof(buf));
}
closelog();
return 0;
}
编译运行:
1、void openlog(char* ident, int option, int facility);
(1)ident: 标记字符串
(2)option: 下列值与运算的结果
LOG_CONS 如果发送系统记录器时出现错误,则直接写入系统控制台
LOG_NDELAY 立即打开连接(通常,在记录第一条消息时打开连接)
LOG_NOWAIT 要等待在记录主题时创建的子进程
LOG_ODELAY 连接的打开延迟到调用syslog()
LOG_PERROR 打印到stderr
LOG_PID 每条消息包含PID
(3)facility: 对应上述的日志来源类型
LOG_AUTH security/authorization messages
LOG_AUTHPRIV security/authorization messages (private)
LOG_CRON clock daemon (cron and at)
LOG_DAEMON system daemons without separate facility value
LOG_FTP ftp daemon
LOG_KERN kernel messages (these can’t be generated from user processes)
LOG_LOCAL0~LOG_LOCAL7 reserved for local use
LOG_LPR line printer subsystem
LOG_MAIL mail subsystem
LOG_NEWS USENET news subsystem
LOG_SYSLOG messages generated internally by syslogd(8)
LOG_USER generic user-level messages(default)
LOG_UUCP UUCP subsystem
2、void syslog(int priority, char* format, …)
(1)priority: 对应上述的日志优先级,取值有:
LOG_EMERG system is unusable
LOG_ALERT action must be taken immediately
LOG_CRIT critical conditions
LOG_ERR error conditions
LOG_WARNING warning conditions
LOG_NOTICE normal, but significant, condition
LOG_INFO informational message
LOG_DEBUG debug-level message
(2)format和…: 这个就不用说了
3、void closelog()
关闭rsyslog连接,没啥好说的。
由运行结果可得,上述代码对应在/etc/rsyslog.conf的匹配规则为: