您的位置:首页 > 编程语言 > Go语言

google glog使用方法及简单封装

2017-07-16 00:43 2506 查看
编写工程项目时log的重要性不言而喻,目前开源的c++ log库主要有glog,log4cpp等。glog是由google开发的,比较轻量使用起来也比较简单,log4cpp相对较重,这次花了点时间研究了一下glog,并做了一下简单的封装。直接上代码吧。

#ifndef GT_UTIL_LOG_WRAPPER_
#define GT_UTIL_LOG_WRAPPER_

#ifndef GLOG_NO_ABBREVIATED_SEVERITIES
#define GLOG_NO_ABBREVIATED_SEVERITIES
#endif
#include <glog/logging.h>
#include <string>
#include <mutex>
#include <sstream>

namespace GT {

namespace UTIL {

#define IS_INVALID_LOGLEVEL(level) ((level) >= GT_LOG_LEVEL_OFF || (level) < GT_LOG_LEVEL_INFO)

enum GT_LOG_LEVEL {
GT_LOG_LEVEL_INFO = 0,
GT_LOG_LEVEL_WARNING = 1,
GT_LOG_LEVEL_ERROR = 2,
GT_LOG_LEVEL_OFF = 3,
GT_LOG_LEVEL_ALL = GT_LOG_LEVEL_INFO
};

class GT_Util_GlogWrapper
{
public:
~GT_Util_GlogWrapper();
static GT_Util_GlogWrapper& GetInstance();

bool GT_LogInitialize(std::string logname, GT_LOG_LEVEL level, int logsize);
bool GT_LogUnintialize();
bool GT_SetLoglevel(GT_LOG_LEVEL level);
static void GT_WriteLog(std::string logevent, GT_LOG_LEVEL level, const char* filename, int line);

private:
GT_Util_GlogWrapper();
void GT_SetGlogFlags_();
void GT_SetLoglevelDestination_();
static google::LogSeverity GT_Loglevel2GoogleLoglevel_(GT_LOG_LEVEL);

private:
int per_log_size_;
std::string log_path_;
static GT_LOG_LEVEL log_level_;
static std::mutex log_mutex_;
static bool is_log_initted_;
};

}
}

#define GT_LOG_INFO(logevent) GT_LOG_MACRO(logevent, GT_LOG_LEVEL::GT_LOG_LEVEL_ALL)
#define GT_LOG_WARN(logevent) GT_LOG_MACRO(logevent, GT_LOG_LEVEL::GT_LOG_LEVEL_WARNING)
#define GT_LOG_ERROR(logevent) GT_LOG_MACRO(logevent, GT_LOG_LEVEL::GT_LOG_LEVEL_ERROR)
#define GT_LOG_MACRO(logevent, loglevel) { \
std::ostringstream ost; \
ost<<logevent; \
std::string str = ost.str(); \
GT::UTIL::GT_Util_GlogWrapper::GT_WriteLog(str, loglevel, __FILE__, __LINE__); \
}

namespace GT {

namespace UTIL {

class GT_TraceFunction {
public:
GT_TraceFunction(const char* func) :_func(func) {
GT_LOG_INFO("Entering:>>> " << _func.c_str());
}
~GT_TraceFunction() {
GT_LOG_INFO("Leaving:<<< " << _func.c_str());
}

private:
std::string _func;
};
}
}

#define GT_TRACE_FUNCTION GT::UTIL::GT_TraceFunction trace(__FUNCTION__);

#endif //GT_UTIL_LOG_WRAPPER_

#include "GT_Util_GlogWrapper.h"

namespace GT {

namespace UTIL {
bool GT_Util_GlogWrapper::is_log_initted_ = false;
GT_LOG_LEVEL GT_Util_GlogWrapper::log_level_ = GT_LOG_LEVEL_OFF;
std::mutex GT_Util_GlogWrapper::log_mutex_;

GT_Util_GlogWrapper::GT_Util_GlogWrapper():per_log_size_(50)
{
log_path_ = "./temp.log";
}

GT_Util_GlogWrapper::~GT_Util_GlogWrapper()
{
}

GT_Util_GlogWrapper& GT_Util_GlogWrapper::GetInstance() {
std::lock_guard<std::mutex> lk(log_mutex_);

static GT_Util_GlogWrapper log_instance_;
return log_instance_;
}

bool GT_Util_GlogWrapper::GT_LogInitialize(std::string logname, GT_LOG_LEVEL level, int maxlogsize) {
std::lock_guard<std::mutex> lk(log_mutex_);

if (is_log_initted_)
return true;

if (IS_INVALID_LOGLEVEL(level) || maxlogsize <= 0)
return is_log_initted_;

per_log_size_ = maxlogsize;
log_level_ = level;
google::LogSeverity loglevel_ = GT_Loglevel2GoogleLoglevel_(level);

log_path_ = "./" + logname + ".log_";
google::InitGoogleLogging("GTServer");

GT_SetLoglevelDestination_();
GT_SetGlogFlags_();

is_log_initted_ = true;
printf("GLOG Environment Init Success!\n");
return is_log_initted_;
}

void GT_Util_GlogWrapper::GT_SetLoglevelDestination_() {
google::SetLogDestination(GT_Loglevel2GoogleLoglevel_(log_level_), log_path_.c_str());
// set other log level destination this should be set, otherwise other log level will not be record
for (auto le = int(GT_LOG_LEVEL_INFO); le <= GT_LOG_LEVEL_OFF; le++) {
if (le != log_level_)
google::SetLogDestination(le, "");
}
}

void GT_Util_GlogWrapper::GT_SetGlogFlags_() {
FLAGS_log_prefix = true; // include the time and thread id
FLAGS_logbufsecs = 0; // flush log to file frequency
FLAGS_max_log_size = per_log_size_; // max log size (MB)
FLAGS_stop_logging_if_full_disk = true; // if log is full stop write log
FLAGS_colorlogtostderr = true; // if have fatal or error log will put it to terminal with color
}

bool GT_Util_GlogWrapper::GT_LogUnintialize() {
std::lock_guard<std::mutex> lk(log_mutex_);

if (is_log_initted_)
google::ShutdownGoogleLogging();
is_log_initted_ = false;
return true;
}

bool GT_Util_GlogWrapper::GT_SetLoglevel(GT_LOG_LEVEL level) {
std::lock_guard<std::mutex> lk(log_mutex_);

google::LogSeverity loglevel_ = GT_Loglevel2GoogleLoglevel_(level);
if (IS_INVALID_LOGLEVEL(level) || !is_log_initted_)
return is_log_initted_;
log_level_ = level;
GT_SetLoglevelDestination_();
return true;
}

google::LogSeverity GT_Util_GlogWrapper::GT_Loglevel2GoogleLoglevel_(GT_LOG_LEVEL level) {
google::LogSeverity googleloglevel_ = google::GLOG_INFO;
switch (level) {
case GT_LOG_LEVEL_WARNING:
googleloglevel_ = google::GLOG_WARNING;
break;
case GT_LOG_LEVEL_ERROR:
googleloglevel_ = google::GLOG_ERROR;
break;
default:
printf("unknown LOGLEVEL just ignore it!\n");
break;
}
return googleloglevel_;
}

void GT_Util_GlogWrapper::GT_WriteLog(std::string logevent, GT_LOG_LEVEL level, const char* filename, int line) {
if (!is_log_initted_ || level < log_level_ || log_level_ == GT_LOG_LEVEL_OFF) {
return;
}

char line_[32];
_itoa_s(line, line_, 10);
logevent = logevent + " [" + std::string(filename) + ":" + std::string(line_) + "]";

switch (level)
{
case GT_LOG_LEVEL_INFO:
LOG(INFO) << logevent.c_str();
break;
case GT_LOG_LEVEL_WARNING:
LOG(WARNING) << logevent.c_str();
break;
case GT_LOG_LEVEL_ERROR:
LOG(ERROR) << logevent.c_str();
break;
default:
break;
}
return;
}
}
}


另外对Glog源码也进行了一些调整,可以直接访问我的GitHub获取:https://github.com/GTHubT/GTSever.git

测试代码:

#include "stdafx.h"
#include <iostream>
#include "GT_Util_GlogWrapper.h"
#include "GTServer/GT_Definition.h"

int main()
{
GT::UTIL::GT_Util_GlogWrapper gt = GT::UTIL::GT_Util_GlogWrapper::GetInstance();
gt.GT_LogInitialize("test", GT_LOG_LEVEL_WARNING, 1);
GT_TRACE_FUNCTION;
GT_LOG_INFO("this is a test " << 1);
GT_LOG_ERROR("this is a test " << 2);
GT_LOG_WARN("this is a test " << 3);

return 0;
}


log效果:

Log file created at: 2017/07/16 00:36:12
Running on machine: xxxx
Log line format: [INFO|WARN|ERRO]mmdd hh:mm:ss.uuuuuu threadid] msg [file:line]
[ERRO 0716 00:36:12.481290 12680] this is a test 2 [c:\github\gtsever\src\cpp\gtserver\gttest\gttest.cpp:16]
[WARN 0716 00:36:12.484290 12680] this is a test 3 [c:\github\gtsever\src\cpp\gtserver\gttest\gttest.cpp:17]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  google glog c++