GOOGLE GLOG 日志使用心得
来源:互联网 发布:手机淘宝如何修改评论 编辑:程序博客网 时间:2024/04/29 04:04
c++项目中想尝试些新的东西,google glog日志中间件功能挺全面,测试的效率也比较OK, 测试数据未作记录。
google glog官方网站 https://code.google.com/p/google-glog/
文档和源码下载均可从上面的地址中获取,我展示下我所用到的部分:
1.include源文件
#include <glog/logging.h>
2.日志模块的初始化
//初始化日志模块google::InitGoogleLogging("");google::SetLogDestination(google::GLOG_INFO, "../var/log/configserver_");//google::SetStderrLogging(google::GLOG_INFO);FLAGS_logbufsecs = 0; //日志实时输出 FLAGS_max_log_size=10; //最大日志文件大小 10M
上面的这段代码可以放在启动函数 OR 初始化函数中,即可完成服务日志模块初始化动作;
初始化日志模块的一些参数如下(可参见源码src/glog/logging.h line:321-361):
// Set whether log messages go to stderr instead of logfilesDECLARE_bool(logtostderr);// Set whether log messages go to stderr in addition to logfiles.DECLARE_bool(alsologtostderr);// Set color messages logged to stderr (if supported by terminal).DECLARE_bool(colorlogtostderr);// Log messages at a level >= this flag are automatically sent to// stderr in addition to log files.DECLARE_int32(stderrthreshold);// Set whether the log prefix should be prepended to each line of output.DECLARE_bool(log_prefix);// Log messages at a level <= this flag are buffered.// Log messages at a higher level are flushed immediately.DECLARE_int32(logbuflevel);// Sets the maximum number of seconds which logs may be buffered for.DECLARE_int32(logbufsecs);// Log suppression level: messages logged at a lower level than this// are suppressed.DECLARE_int32(minloglevel);// If specified, logfiles are written into this directory instead of the// default logging directory.DECLARE_string(log_dir);// Sets the path of the directory into which to put additional links// to the log files.DECLARE_string(log_link);DECLARE_int32(v); // in vlog_is_on.cc// Sets the maximum log file size (in MB).DECLARE_int32(max_log_size);// Sets whether to avoid logging to the disk if the disk is full.DECLARE_bool(stop_logging_if_full_disk);
DECLARE_类型 类型为变量定义的值类型,方便开发者赋值;
如:我希望日志实时输出则在日志初始化方法中对变量赋值:
FLAGS_logbufsecs = 0;
其它变量的使用大家可以参考上面的各个参数,由于glog源码只支持按照文件大小分日志,FLAGS_max_log_size也是非常有用的;
之前进行java/python/c#开发时使用日志模块均能按天按大小轮转,glog其实也可以,得稍微改下源码
1. 修改文件src/utilities.h 增加日期变动函数(放哪都无关系,为了清楚我放在函数PidHasChanged()之后)
bool DayHasChanged();
2.修改文件src/utilities.cc增加函数实现代码部分(依旧放在函数PidHasChanged()之后)
//day of month add by yangwstatic int32 g_main_mday = 0;bool DayHasChanged(){ time_t rawtime; struct tm* timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); if(timeinfo->tm_mday != g_main_mday) { g_main_mday = timeinfo->tm_mday; return true; } return false;}
if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() || PidHasChanged() || DayHasChanged()) { if (file_ != NULL) fclose(file_); file_ = NULL; file_length_ = bytes_since_flush_ = 0; rollover_attempt_ = kRolloverAttemptFrequency-1; }
做完上面的红色部分修改,重新make glog即可生成按日期按大小轮转的glog模块
值得注意的几个点:
>glog提供了一个程序异常处理机制,我遇到过一个问题,不过当时并没有使用glog来发现,后来看到之后真是悔恨啊,当程序出现SIGSEGV异常信号时,glog的默认异常处理过程会导出非常有用的异常信息,通过google::InstallFailureSignalHandler()来定义,google文档中也有说明
http://google-glog.googlecode.com/svn/trunk/doc/glog.html
在此处我想阐述下我之前C++ ACE 网络通信开发过程中遇到的信号中断说明,希望能帮助到遇到相同问题的人:
当服务器close一个连接时,若client端接着发数据。根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。
根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。若不想客户端退出可以把SIGPIPE设为SIG_IGN
如: signal(SIGPIPE,SIG_IGN); 【将这句话放在入口函数处即可解决问题】
这时SIGPIPE交给了系统处理。
服务器采用了fork的话,要收集垃圾进程,防止僵尸进程的产生,可以这样处理:
signal(SIGCHLD,SIG_IGN); 交给系统init去回收。
这里子进程就不会产生僵尸进程了。
这句话转自 http://blog.csdn.net/jfkidear/article/details/7909859
- GOOGLE GLOG 日志使用心得
- 如何使用Google日志库(glog)
- 如何使用Google日志库 (glog)
- 如何使用google的日志库(glog)
- 如何使用Google日志库 (glog)
- google-glog安装使用
- google glog使用
- google的glog日志管理
- google-glog配置使用笔记
- 【学习笔记】Google glog 使用
- google glog 简单使用小结
- google glog介绍与使用
- glog日志开源库使用小结
- google-glog:开源c++轻量级日志库
- windows和linux环境下使用google的glog日志库
- [glog]_[C/C++]_[使用glog来记录日志]
- Google glog
- google glog
- csapp2e 家庭作业 6.27
- Linux下启动tftp
- Citrix 服务器虚拟化之二 Xenserver加域管理
- SQLMAP常用参数的中文解释
- 让C/C++程序一次编译可以发布到多版本Linux之上
- GOOGLE GLOG 日志使用心得
- csapp2e 家庭作业 6.28 6.29
- F7显示物料时带树状菜单
- Top 10 Ways to Promote your Website easily
- LINQ之路 5:LINQ查询表达式
- 非确定有限状态自动机的构建(二)——将CharVal转换为NFA
- C#与C++,Windows平台软件开发面临的选择
- UNIX环境高级编程——进程管理和通信(总结)
- linux字符设备驱动