本文档描述如何在Windows和Linux下使用Syslog库,在Linux下GNU库中已经自带有syslog库,但是在Windows下的标准库中没有syslog库,从网上可以找到syslog的开源代码实现,接口函数基本上与Linux一致,并且提供一个扩展函数来设置读取syslog服务器的IP地址和端口。下面将详细说明如何使用Syslog库。
Linux下使用
Syslog库有一组系统日志写入接口,分别为openlog/syslog/closelog/vsyslog,其中vsyslog和syslog功能是一样的,只是参数不同而已。
通常,syslog守护进程读取三种格式的记录消息。此守护进程在启动时读取一个配置文件。一般来说,配置文件的名称为/etc/syslog.conf,这文件决定不同类型的消息由该送往何处。例如:紧急的消息可以送给系统管理员,并且在控制台上显示,而告警消息则可以记录到文件中。该机制提供了syslog函数,其调用格式如下:
#include <syslog.h>
void openlog (char*ident,int option ,intfacility);
void syslog(int priority,char*format,……)
void closelog();
调用openlog()是可选的,如果不调用openlog(),则在第一次调用syslog()时,自动会调用openlog()函数,调用closelog函数也是可选的,它只是关闭被用于与syslog守护进程通信的描述符。调用openlog时可以指定一个ident标识符,这个indet将会添加到每个消息中,它一般为程序的名称。
示例程序如下:
#include <syslog.h>
int main(int argc, char**argv)
{
openlog(“indent”,LOG_CONS | LOG_PID, 0);
syslog(LOG_DEBUG,“This is a syslog message generated by program %s\n”, argv[0]);
closelog();
return0;
}
编译和运行程序后,在/var/log/message文件的最后一行可以看到添加的消息如下:
Feb 12 08:48:38 localhost indent[7085]:This is a syslog message generated by program ./a.out
上面三个函数的详细参数说明可以使用man命令查看。
如果程序需要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,然后使用syslog函数给守护进程发送syslog消息。
Windows下使用
介绍
Syslog-win32开源库时一个在Windows下使用的syslog实现,它包括服务器和客户端程序,特征如下:
1) 兼容RFC-3164 syslog协议;
2) 高性能;
3) 消息传递;
4) 日志循环;
5) 完全开源。
下载网址:http://syslog-win32.sourceforge.net,版本1.0。
Syslog-win32可以帮助开发人员编写可移植的软件。下面一些情况可以使用:
1) 移植已有的UNIX软件到原生的Windows平台;
2) 编写可移植软件;
3) 编写纯Windows软件,但是知道EventLog的问题而寻找替代品。
希望该库能够为你提供帮助。
当然,你也可以使用监控程序作为网络消息收集器。但是我认为UNIX是一个更好的选择。不是因为这个库不够好(希望是这样的),而是因为UNIX上具有更好的依赖性。
Syslog-win32的源代码没有权限要求,可以任意的使用、修改和发行它。
Syslog客户端
客户端的配置文件是可选的,它的文件名称为syslog.host,它应该包含主机名或者是IPV4的地址,后面可以选择跟着“:”冒号和端口号。缺省的端口为514,如果在当前路径下不存在这个文件,那么会使用localhost和缺省端口。
这可能看上去有点奇怪(丑陋),除非你有更好的注意。值得注意的是:与Daemon程序不同的是客户端应该没有任何依赖性。
Syslog服务器端
概念相当的简单:这里有一些消息源、消息过滤器和目标服务器。每一项都是唯一的名字,logpath与源、过滤器和目标服务器联系在一起。 每一项都会在logpath中指定,但是logpath可以引用相同的源、过滤器和目标服务器。服务器端的配置文件使用XML格式,它不是与UNIX syslog的配置文件不一致。
使用方法
从syslog-win32网站上下载源代码压缩包(syslog-win32-0.3.tar.bz2)。解压缩后,把客户端所使用的两个文件添加到使用syslog的项目中,如下:
1) 在include目录下的syslog.h头文件;
2) 在client目录下的syslog-client.c实现文件;
在VS 2008中会报错:snprintf没有定义,使用_snprintf替代即可。
Syslog库的使用接口和方法与Linux一样,唯一的区别是有一个Windows下专用的函数:
extern const char* set_syslog_conf_dir( constchar* dir );
它可以设置syslog.host读取时的目录,syslog.host中只包含syslog服务器使用的主机名和端口,使用冒号分割,例如:192.168.8.11:514。syslog的缺省端口为514。