用signal实现调试信息的动态控制——syslog和signal

来源:互联网 发布:武汉 2017 人工智能 编辑:程序博客网 时间:2024/05/18 19:40

一、原因和分析

(1)我们调试代码大部分的习惯都是输出到控制台,通过控制台去看打印信息来定位一些问题。串口输出到控制台一个很大的弊端就是影响到系统的效率。

(2)串口输出有的时候你输出他输出的,拖来拖去的看也麻烦,不如放到文件里,在定位问题通过在文件中搜索来实现更方便些,所以就用到了syslog

(3)日志的输出形式有动态和静态的,动态是指程序在跑着是没有日志输出,然后这时候你发送一个信号给这个进程,然后输出日志。就是想看日志的时候出来,不想看日志的时候发信号让它关掉。这里就用到了signal。静态就比较好理解了,就是二进制文件生成的时候就在里面,然后默认输出日志。本文着重讲解动态日志输出。

(4)其实日志输出最好是能在网口输出,这样静态输出便可,而且还可以对不同的进程作分类,我之前的那个公司就是这样实现的,先看哪个进程的日志,打开端口号便可。


二、代码

int iDebugOut = 0;   //全局变量用于控制debugout函数的输出

void debugout(const char *format, ...)
{
char acMsg[4096] = {0};
if (iDebugOut)
{
struct timeval tv; 
va_list args;
gettimeofday(&tv, NULL); 
va_start(args,format);
vsnprintf(acMsg, sizeof(acMsg), format, args);
openlog("OutPut", LOG_CONS | LOG_PID, 0);//打开日志
syslog(LOG_INFO, "[%ld.%03ld]-------[%s]-------:",tv.tv_sec, tv.tv_usec/1000,acMsg);//日志输出包括的S和ms
closelog();
va_end(args);
}
return;
}


static void  ExitPrint(int iSignal)
{
printf( "ExitPrint, Signal=%d--\n", iSignal );
iDebugOut = 0;//信号12关闭日志输出
}


static void StartPutPrint(int iSignal)
{
iDebugOut = 1;//信号10打开日志输出
printf( "StartOutPutPrint, Signal=%d--\n", iSignal );
}

/*设置信号量*/
void SetSignalHandler(void)
{
         printf("-SetSignalHandler-\n");
signal( SIGUSR1, StartPutPrint);
signal( SIGUSR2, ExitPrint);
}

 最终的结果是在/var/log/message文件里面,可以看到你自己的打印信息了,下面是个简单的例子:
Jun 19 20:08:13 Output user.info OutPut[1721]: [1403179693.737]-------[wnet_checksim()=-4010, errno=2]-------:

三、结论

虽然动态可以控制日志的输入和输出,但是你手动发送信号kill -10 pid打开的时候,还是需要时间,很可能会遗漏掉一些调试信息,这个要根据自己的使用情况去控制了。还是那句话能在网口输出尽量在网口输出。

0 0
原创粉丝点击