当前位置: 首页 > 工具软件 > Google Glog > 使用案例 >

GOOGLE GLOG 日志使用心得

周超英
2023-12-01

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 logfiles
DECLARE_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 yangw
static 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




 类似资料: