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;}


3.修改文件src/logging.cc 第925行  函数LogFileObject::Write中的PID变动判断处  增加日期变动判断

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




原创粉丝点击