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

最近发现项目监控系统的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  即可完成设置。







  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值