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
测试代码:
log效果:
#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 简单使用小结
- google glog 使用方法
- 简单使用Google*谷歌搜索和gmail的方法
- google glog 使用方法
- google glog 简单使用小结(转)
- google glog的简单封装
- FE - Weex 使用简单封装数据加载插件为全局加载方法
- 简单介绍google protobuf rpc框架使用方法
- 解决google服务框架、google play、google地图、google搜索等基本的应用无使用最简单的方法
- Google glog 使用方法
- google-glog库编译(Visual Studio 2013)及使用方法
- 做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法。 很方便的,于是就简单的整理了一下。 1.1 showMessageDialog 显示一个带有OK 按钮的模态
- google glog 使用方法
- Google glog 使用方法
- 使用Promise封装简单Ajax方法
- web.config文件自定义配置节的使用方法的一个简单例子
- 一个简单的方法:找出哪个的程序使用了哪个端口
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- ASP.NET使用确认对话框得简单方法
- 简单SharpZipLib使用方法