C/C++程序中通过发送信号动态调整log级别
2016-12-28 15:30
477 查看
最近发现项目监控系统的log文件增长很快,通过tail -f 查看,几乎刷屏,就研究了一下,发现监控模块在启动时,打开log文件,设置下log级别,此后log级别没法更改。如果log级别设置不当,可能造成log信息不全或者log太多,于是想改成动态调整。仔细想了下,决定使用发送信号来实现。本来想发送信号时,通过终端实时交互设置,发现实现麻烦,最后决定通过读取一个写入log级别的文件实现。
大概步骤如下:
1)在程序启动时,注册SIGUSR1的信号监听;
2)在SIGUSR1信号监听处理中,读取程序目录下的一个文件,该文件写入一个代表级别的数字1-8,读取后设置log级别。
比如通过ps查看到程序进程号为13500,shell下输入命令 kill -SIGUSR1 13500 即可。
后来想到如果运维或其他人员修改时,会比较麻烦,就写了一个简单的shell脚本,脚本如下:
有了脚本,需要更改log级别时,运行脚本,加上log级别,如:./set_loglevel.sh 5 即可完成设置。
大概步骤如下:
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 即可完成设置。
相关文章推荐
- Hadoop2动态调整Log级别-以datanode的heartbeat log为例
- Hadoop2动态调整Log级别-以datanode的heartbeat log为例
- 用PHP实现通过Web执行C/C++程序
- 内核能够动态确定ip包的发送接口,通过路由信息确定
- WinCE动态调整存储内存与程序内存的大小
- 用spy++查看消息,通过发送消息控制程序
- 自己写了一个通过smarty与php相互结合的例子,动态生成静态程序,写的很烂
- 用PHP实现通过Web执行C/C++程序
- C/C++做的一个简单界面程序扩充,向指定窗口发送消息源代码
- [编程实例]Dev-C++编写动态调用dll杀进程的程序
- 用spy++查看消息,通过发送消息控制程序
- 控制发送SMS信息的C51程序[GSM模块(M22)通过串口与单片机相连]
- 想通过看看一些程序来学习c++
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- 通过SMSLib库实现Java程序发送短信
- 通过程序控制Windows传真发送。
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- C++ 开发P2P及时消息发送程序(1)
- C++ 开发P2P及时消息发送程序(2)