glog 的使用

来源:互联网 发布:淘宝01店手机是真的吗 编辑:程序博客网 时间:2024/05/21 05:05

glog是大名鼎鼎的Google公司的开源的C++日志类库

开发环境

glog 0.3.4 下载地址 https://github.com/google/glog  在他的Google官网上最新版本是0.3.3

visual studio 2015

windows 7 x64 SP1

编译说明

由于源码里面附带vss的项目文件使用visual studio 2015打开即可。他会自动更新。

会出现下面的编译错误

va_copy snprintf 重定义, 注释掉即可。

std::min 提示未定义 添加 #include <algorithm> 即可,这个也可能不出现。好像我是用0.3.3的时候出现了但是在0.3.4上就没有出现。

此时会编译成功。

增加64位编译时会出现

_asm int 3 这句编译错误,使用__debugbreak(); 他的功能是调试的时候中断执行。

在windows下使用

在项目中添加包含目录 编译的源码路径\src\windows

在项目中添加库目录将你编译成功的lib dll 所在目录添加进去

编译项目,出现如下错误

error ERROR macro is defined. Define GLOG_NO_ABBREVIATED_SEVERITIES before including logging.h. See the document for detail

在log_severity.h头文件中,意思是ERROR已经定义出现了二义性。

将log_sererity.h的相关代码注释掉即可

//# ifdef ERROR
//#  error ERROR macro is defined. Define GLOG_NO_ABBREVIATED_SEVERITIES before including logging.h. See the document for detail.
//# endif
//const int INFO = GLOG_INFO, WARNING = GLOG_WARNING,
 // ERROR = GLOG_ERROR, FATAL = GLOG_FATAL;

编译项目成功。

glog的使用源码

google::InitGoogleLogging("");


char tempArray[MAX_PATH] = { 0 };
char* lptemp(tempArray);


GetLogPath(tempArray); //获得程序日志目录

lptemp = tempArray + strlen(tempArray);

strcpy_s(lptemp, 16, "info_");


//设置不同级别对应不同的文件
google::SetLogDestination(google::GLOG_INFO, tempArray); 


strcpy_s(lptemp, 16, "warning_");
google::SetLogDestination(google::GLOG_WARNING, tempArray);


strcpy_s(lptemp, 16, "error_");
google::SetLogDestination(google::GLOG_ERROR, tempArray);


strcpy_s(lptemp, 16, "fatal_");
google::SetLogDestination(google::GLOG_FATAL, tempArray);


FLAGS_logtostderr = false; //是否将所有日志输出到stderr而非文件
FLAGS_alsologtostderr = false;//是否将所有日志输出到文件和stderr
FLAGS_minloglevel = google::GLOG_INFO; //记录的最小级别
FLAGS_logbuflevel = google::GLOG_WARNING;
FLAGS_logbufsecs = 10; //缓冲日志输出,默认30秒
FLAGS_max_log_size = 10; //日志文件最大尺寸
FLAGS_stop_logging_if_full_disk = true; //当磁盘写满时停止日志输出


//设置完成后就能写日志了。

LOG(INFO) << "info";

LOG(WARNING) << "Warning";

LOG(ERROR) << "Error";

LOG(FATAL) << "Fatal";

//使用完成释放

google::ShutdownGoogleLogging();


发现如下问题或者与log4cplus不同的地方:

设置不同级别对应不同的文件log4cplus仅仅往对应的级别文件中写,其他级别不会写。但是glog会记录所有小于等于记录级别的日志。

例如:

LOG(INFO) << "info";

LOG(WARNING) << "WARNING";

按照上面的设置

“info”在记录info和warning两个级别的文件里面,而log4cplus不会这么处理只会在info文件里面。

在logging.cc文件里面760行的函数如下:

inline void LogDestination::LogToAllLogfiles(LogSeverity severity,
                                             time_t timestamp,
                                             const char* message,
                                             size_t len) {


  if ( FLAGS_logtostderr ) {           // global flag: never log to file
    ColoredWriteToStderr(severity, message, len);
  } else {
    for (int i = severity; i >= 0; --i)
      LogDestination::MaybeLogToLogfile(i, timestamp, message, len);
  }
}

假如要实现上面的不同只需更改上面的函数即可!我没有试过不能百分百确定!!!

//GetLogPath的源码

void GetLogPath(char* pLogPath)
{
TCHAR tempArray[MAX_PATH] = { 0 };


GetModuleFileName(NULL, tempArray, MAX_PATH);


LPTSTR lptemp = _tcsrchr(tempArray, _T('\\'));


lptemp = lptemp + 1;


_tcscpy_s(lptemp, 32, _T("\\Log\\"));


if (!PathIsDirectory(tempArray))
{
CreateDirectory(tempArray, nullptr);
}


::WideCharToMultiByte(CP_ACP, 0, tempArray, -1, pLogPath, MAX_PATH, nullptr, nullptr);
}

0 0
原创粉丝点击