您的位置:首页 > 编程语言 > C语言/C++

C/C++程序中通过发送信号动态调整log级别

2016-12-28 15:30 477 查看
最近发现项目监控系统的log文件增长很快,通过tail -f 查看,几乎刷屏,就研究了一下,发现监控模块在启动时,打开log文件,设置下log级别,此后log级别没法更改。如果log级别设置不当,可能造成log信息不全或者log太多,于是想改成动态调整。仔细想了下,决定使用发送信号来实现。本来想发送信号时,通过终端实时交互设置,发现实现麻烦,最后决定通过读取一个写入log级别的文件实现。

大概步骤如下:

1)在程序启动时,注册SIGUSR1的信号监听;

signal(SIGUSR1,SIGUSR1Handler);


2)在SIGUSR1信号监听处理中,读取程序目录下的一个文件,该文件写入一个代表级别的数字1-8,读取后设置log级别。

void SIGUSR1Handler(int iSignum)
{
char level;
LogLevel ll;

level = getLevel();
switch(level)
{
case '1':
ll = L_NONE;
break;
case '2':
ll = L_CRIT;
break;
case '3':
ll = L_ERROR;
break;
case '4':
ll = L_WARN;
break;
case '5':
ll = L_INFO;
break;
case '6':
ll = L_DEBUG;
break;
case '7':
ll = L_TRACE;
break;
case '8':
ll = L_ALL;
break;
default:
ll = L_INFO;
break;
}

g_sLog.setLogLevel(ll);

}
读取log级别文件,获取设置的级别

char getLevel()
{
FILE *fp = NULL;
char ch = 0;
char level = 0;
char path[32] = "./loglevel";

fp = fopen(path, "r");
if(fp == NULL)
return level;

ch= fgetc(fp);
printf("getLevel.ch: %c\n",ch);
fclose(fp);

if(ch > '0' && ch <= '8')
level = ch;

return level;

}
代码中添加的就是这些,程序编译运行后,如果需要修改log级别,就在程序目录下的loglevel文件中写入一个1-8的数字,然后向程序发送一个SIGUSR1信号即可完成log级别的更改。

比如通过ps查看到程序进程号为13500,shell下输入命令 kill -SIGUSR1 13500 即可。

后来想到如果运维或其他人员修改时,会比较麻烦,就写了一个简单的shell脚本,脚本如下:

#!/bin/bash

if [ $# -lt 1 ];then
echo "Usage:$0 level[1-8]"
exit 1
fi

pid=`ps -ef | grep "MonitorServer.exe" | grep -v "grep" | awk '{print $2}' `
level=`echo $1 > loglevel && cat loglevel`

if [ $pid != " " ];then
kill -SIGUSR1 $pid
echo -e "\e[1;32m set level $level\e[1;0m"
else
echo -e "\e[1;35m MonitorServer is not running \e[1;0m"
fi


有了脚本,需要更改log级别时,运行脚本,加上log级别,如:./set_loglevel.sh 5  即可完成设置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: