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
初始化日志模块的一些参数如下(可参见源码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);
如:我希望日志实时输出则在日志初始化方法中对变量赋值:
FLAGS_logbufsecs = 0;
之前进行java/python/c#开发时使用日志模块均能按天按大小轮转,glog其实也可以,得稍微改下源码
1. 修改文件src/utilities.h 增加日期变动函数(放哪都无关系,为了清楚我放在函数PidHasChanged()之后)
bool DayHasChanged();
//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;
}
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;
}
值得注意的几个点:
>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