版本:glog-0.3.4
下载:
https://github.com/google/glog
http://download.csdn.net/detail/caowei880123/9565134
编译:
glog-0.3.4里面有vs2008的sln
打开sln直接编译就行了,没悬念.编译后生成: libglog.dll libglog.lib libglog_static.lib. 头文件在src\windows\glog
编译64位debug时有问题
https://github.com/tbennun/glog/commit/master
使用:
文件包含和宏定义:
define GOOGLE_GLOG_DLL_DECL // 使用静态glog库用这个 define GLOG_NO_ABBREVIATED_SEVERITIES // 没这个编译会出错,传说因为和Windows.h冲突 include “glog/logging.h” #pragma comment(lib,”glog/libglog_static.lib”)
设置参数,输出日志:
FLAGS_log_dir = "./"; // 设置日志文件保存目录,这个目录必须是已经存在的,否则不能生成日志文件.
// GLog生成的文件名格式是[文件名].[计算机名].[Windows用户名].[log].[等级].[年月日时分秒].[PID]例如:abc.exe.J2RT9QDBPIXKGEO.Administrator.log.INFO.20131205-112354.3108
// 每个进程中至少要执行1次InitGoogleLogging(),否则不产生日志文件.例如:只在xxApp::InitInstance()中调用一次InitGoogleLogging(),xxDlg中不必调用也会把日志输出到指定文件.
google::InitGoogleLogging("test");// 设置日志文件名中的"文件名"字段.
LOG(INFO) << "我在InitInstance()"; // 记录一个INFO等级的日志"我在InitInstance()"
google::ShutdownGoogleLogging(); // 停止GLog,与InitGoogleLogging()成对使用.没有这句vs2005会有内存泄漏,但是网上好多例子都没有用这句
问题:
GLog好像不支持Unicode
参考资料:
How To Use Google Logging Library (glog)
1.增加文件按天区分
glog是根据进程ID来区分文件的,如果你重新启动了程序,则log文件的名字就会变,这样似乎不太满足我的需求,我还要求它可以每天生成文件,方便我整理和分析log,其实也有办法,自己增加一个按天滚文件的函数就可以了。
在utilities.cc中增加函数如下,(因为PidHasChanged()在这个文件里)
static int32 g_main_day = 0;
bool DayHasChanged()
{
time_t raw_time;
struct tm* tm_info;
time(&raw_time);
tm_info = localtime(&raw_time);
if (tm_info->tm_mday != g_main_day)
{
g_main_day = tm_info->tm_mday;
return true;
}
return false;
}
在logging.cc的LogFileObject::Write函数中将
if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||
PidHasChanged()) {
改成
if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||
PidHasChanged() || DayHasChanged()) {
这样就会按照天来输出log了。
2.glog默认有四种log级别,高级别的log中会包含低级别的log,这个我也是不需要的,我希望每一个分级一个文件。
我增加了一个宏来控制这个开关,以免影响到原来的功能。
在glog/src/windows/glog/logging.h (我在windows上用的,linux的请自己查找)
DECLARE_bool(servitysinglelog);
然后修改 logging.cc中的LogDestination::LogToAllLogfiles为如下
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 {
if (FLAGS_servitysinglelog)
{
LogDestination::MaybeLogToLogfile(severity, timestamp, message, len);
}
else
{
for (int i = severity; i >= 0; --i)
LogDestination::MaybeLogToLogfile(i, timestamp, message, len);
}
}
}
我整体的初始化函数如下:
bool Init()
{
google::InitGoogleLogging("");
#ifdef DEBUG_MODE
google::SetStderrLogging(google::GLOG_INFO); //设置级别高于 google::INFO 的日志同时输出到屏幕
#else
google::SetStderrLogging(google::GLOG_FATAL);//设置级别高于 google::FATAL 的日志同时输出到屏幕
#endif
FLAGS_colorlogtostderr = true; //设置输出到屏幕的日志显示相应颜色
FLAGS_servitysinglelog = true;// 用来按照等级区分log文件
google::SetLogDestination(google::GLOG_FATAL, "./log/log_fatal_"); // 设置 google::FATAL 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_ERROR, "./log/log_error_"); //设置 google::ERROR 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_WARNING, "./log/log_warning_"); //设置 google::WARNING 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_INFO, "./log/log_info_"); //设置 google::INFO 级别的日志存储路径和文件名前缀
FLAGS_logbufsecs = 0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_max_log_size = 100; //最大日志大小为 100MB
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出
//google::SetLogFilenameExtension("91_"); //设置文件名扩展,如平台?或其它需要区分的信息
//google::InstallFailureSignalHandler(); //捕捉 core dumped (linux)
//google::InstallFailureWriter(&Log); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr (linux)
return true;
}
这些改动之后我的功能基本就满足了,修改下log输出的格式,原来的log格式大致是这样的 I1234 02/11 12:20:50.123456 xxx.cpp 12] 你的log内容,是 级别的首字母 线程ID 月/日 时分秒微秒 文件名 行号],我将它修改成为 [级别名 线程ID 年/月/日 时分秒毫秒 文件名 行号],在logging.cc的LogMessage::Init函数中修改
再加上一个log(severity_level, format, …)函数就可以打印log了。
Reference:
http://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html
http://www.cnblogs.com/chris-cp/p/3596004.html
glog使用整理
C++ 日志库 boost::log 以及 glog 的对比