Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1438245
  • 博文数量: 704
  • 博客积分: 10140
  • 博客等级: 上将
  • 技术积分: 6230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 20:41
文章分类

全部博文(704)

文章存档

2013年(1)

2012年(16)

2011年(536)

2010年(151)

分类: C/C++

2011-06-18 00:36:28

前几天刚发布cmtools的测试版,同事昨天提出来要记录cmserver端,也就是每个客户端都干了哪些事情,因此需要在cmserver端添加日志功能,便想着把cmserver端的日志用syslog收集下,发送到一个server,这样就能对每台center发送的命令进行查看审计了。
 
原理如下:
   cmserver端收到命令后,每个命令中都携带了发送这个命令的主机的IP地址列表,cmserver会拿这个IP地址去被授权的IP地址列表中查找,如果不能查找到,就认为是非法的命令,拒绝服务,并且把这个非法命令来源的IP地址和时间以及消息类型发送到syslog的server.
   如果发送命令的机器的IP地址在授权IP列表中的话,syslog记录发送命令的机器的IP地址和命令内容(并不记录结果,限于数据量,因此是一个类似于history的功能)。
 
这样,就对cmserver所做的所有操作完成了记录。
 
首先配置syslog服务
需要修改
 
  1. /etc/sysconfig/syslog
中的
  1. SYSLOGD_OPTIONS="-m 0"
  1. SYSLOGD_OPTIONS="-r -m 0"
这样,本机就允许接受外部机器发送的syslog消息了。
然后是配置我们需要的faciliy和level,
修改文件
  1. /etc/syslog.conf
添加一行
  1. local5.* @10.32.102.2
  2. #local5.* /var/log/cme.log
 
如果是第一种写法的话,表示facility是LOCAL5的都发送到10.32.102.2的udp 514端口也就是这台机器的syslog服务器上去,第二种方法表示存储到本地文件,在启动syslog服务前,需要
  1. touch /var/log/cme.log
  2. chmod 666 /var/log/cme.log
然后
  1. service syslog restart
就可以了。
 
最后是我们代码的写法。
需要包含头文件 syslog.h
初始化syslog
 
  1. int init_syslog()
  2. {
  3.         //openlog(se_merge_config.syslog_ident, LOG_PID, LOG_USER);
  4.         openlog("cmtools", LOG_PID, LOG_LOCAL5);
  5.         return 1;
  6. }

下来是一个通用的写syslog的方法:

 

  1. int syslog_msg(const char * szMsg,...)
  2. {

  3.         struct tm *tm1 = NULL;
  4.         char stime[30] = {0};
  5.         time_t tmp_time = time(0);
  6.         tm1 = gmtime (&tmp_time);
  7.         if(tm1 == NULL)
  8.         {
  9.                 return -1;
  10.         }
  11.         sprintf (stime,
  12.                         "%04d-%02d-%02d %02d:%02d:%02d",
  13.                         tm1->tm_year + 1900,
  14.                         (tm1->tm_mon + 1)%12,
  15.                         tm1->tm_mday,
  16.                         (tm1->tm_hour + 8)%24,
  17.                         tm1->tm_min,
  18.                         tm1->tm_sec);
  19.         char szline[1024] = {0};

  20.         sprintf (szline, "%s ", stime);
  21.         va_list args;
  22.         va_start(args, szMsg);
  23. vsprintf(szline + strlen(szline), szMsg, args);
  24.         va_end(args);

  25.         syslog(LOG_LOCAL5|LOG_INFO, szline);
  26.         printf("sysloging:%s\n", szline);
  27.         return 1;
  28. }

 

最后是关闭函数:

 

  1. int close_syslog(void)
  2. {
  3.         closelog();
  4.         return 1;
  5. }

 

在程序启动时调用

 

  1. init_syslog();

 

写时调用如下:

 

  1. syslog_msg ("accept message from %s length = %d", "10.10.10.123", 123);

 

程序退出时执行

 

  1. close_syslog();

 

 

然后在10.32.102.2的windows上安装了一个

 

  1. Kiwi Syslog Daemon

 

能够接收syslog消息,测试如下:


阅读(508) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~