前几天刚发布cmtools的测试版,同事昨天提出来要记录cmserver端,也就是每个客户端都干了哪些事情,因此需要在cmserver端添加日志功能,便想着把cmserver端的日志用syslog收集下,发送到一个server,这样就能对每台center发送的命令进行查看审计了。
原理如下:
cmserver端收到命令后,每个命令中都携带了发送这个命令的主机的IP地址列表,cmserver会拿这个IP地址去被授权的IP地址列表中查找,如果不能查找到,就认为是非法的命令,拒绝服务,并且把这个非法命令来源的IP地址和时间以及消息类型发送到syslog的server.
如果发送命令的机器的IP地址在授权IP列表中的话,syslog记录发送命令的机器的IP地址和命令内容(并不记录结果,限于数据量,因此是一个类似于history的功能)。
这样,就对cmserver所做的所有操作完成了记录。
首先配置syslog服务
需要修改
中的
为
- SYSLOGD_OPTIONS="-r -m 0"
这样,本机就允许接受外部机器发送的syslog消息了。
然后是配置我们需要的faciliy和level,
修改文件
添加一行
- local5.* @10.32.102.2
- #local5.* /var/log/cme.log
如果是第一种写法的话,表示facility是LOCAL5的都发送到10.32.102.2的udp 514端口也就是这台机器的syslog服务器上去,第二种方法表示存储到本地文件,在启动syslog服务前,需要
- touch /var/log/cme.log
- chmod 666 /var/log/cme.log
然后
就可以了。
最后是我们代码的写法。
需要包含头文件 syslog.h
初始化syslog
- int init_syslog()
- {
- //openlog(se_merge_config.syslog_ident, LOG_PID, LOG_USER);
- openlog("cmtools", LOG_PID, LOG_LOCAL5);
- return 1;
- }
下来是一个通用的写syslog的方法:
- int syslog_msg(const char * szMsg,...)
- {
- struct tm *tm1 = NULL;
- char stime[30] = {0};
- time_t tmp_time = time(0);
- tm1 = gmtime (&tmp_time);
- if(tm1 == NULL)
- {
- return -1;
- }
- sprintf (stime,
- "%04d-%02d-%02d %02d:%02d:%02d",
- tm1->tm_year + 1900,
- (tm1->tm_mon + 1)%12,
- tm1->tm_mday,
- (tm1->tm_hour + 8)%24,
- tm1->tm_min,
- tm1->tm_sec);
- char szline[1024] = {0};
- sprintf (szline, "%s ", stime);
- va_list args;
- va_start(args, szMsg);
- vsprintf(szline + strlen(szline), szMsg, args);
- va_end(args);
- syslog(LOG_LOCAL5|LOG_INFO, szline);
- printf("sysloging:%s\n", szline);
- return 1;
- }
最后是关闭函数:
- int close_syslog(void)
- {
- closelog();
- return 1;
- }
在程序启动时调用
写时调用如下:
- syslog_msg ("accept message from %s length = %d", "10.10.10.123", 123);
程序退出时执行
然后在10.32.102.2的windows上安装了一个
能够接收syslog消息,测试如下:
阅读(508) | 评论(0) | 转发(0) |