最近发现项目监控系统的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