
1、概述glog是Google开源的C日志库线程安全的。日志分级支持 DEBUG/INFO/WARNING/ERROR/FATAL 5 个级别FATAL 级别会直接终止程序便于快速定位严重问题自动格式化自动添加时间、进程 ID、线程 ID、文件名、行号等上下文信息无需手动拼接日志切割按大小 / 时间自动切割日志文件避免单日志文件过大跨平台兼容 Linux/Windows/Mac 等主流系统谷歌内部大量使用稳定性有保障。2、编译1、下载源码(我下载的0.7.0版本)https://github.com/google/glog.git2、生成vs工程配置文件打开cmake-gui程序3、vs工程配置这里使用vs2017编译32位版本4、生成vs工程文件点击Generate此时build目录下会有glog.sln工程文件5、打开vs2017编译glog(生成dll)3、使用1、设置demo工程依赖glog头文件、libglog.dll要拷贝到demo.exe目录2、demo代码示例#ifndef Glog_Manager_h_ #define Glog_Manager_h_ 1 #pragma warning(push) #pragma warning(disable: 4996) #pragma warning(disable: 4251) #pragma warning(disable: 4244) #include glog/logging.h #pragma warning(pop) class GlogManager { public: GlogManager() default; ~GlogManager() default; public: // minlevel // 日志级别优先级INFO WARNING ERROR FATALFATAL 会终止程序 // 低于该级别的日志不输出 static void Init(int minlevel); static void Unit(); }; #endif#include GlogManager.h void GlogManager::Init(int minlevel) { // 日志目录 FLAGS_log_dir F:\\logs; // 设置日志级别(低于该级别的日志不输出) FLAGS_minloglevel minlevel; // 立即输出日志 FLAGS_logbufsecs 0; // 单个日志文件最大10M FLAGS_max_log_size 10; // 磁盘满时停止写日志 FLAGS_stop_logging_if_full_disk true; // 清理超过7天的日志 google::EnableLogCleaner(std::chrono::minutes(7 * 24 * 60)); // 初始化glog google::InitGoogleLogging(MyTestDemo); } void GlogManager::Unit() { google::ShutdownGoogleLogging(); }// 调用示例 // glog使用 GlogManager::Init(google::LogSeverity::GLOG_INFO); for (int i 0; i 10; i) { LOG(INFO) 这是info日志; LOG(WARNING) 这是warning日志; LOG(ERROR) 这是error日志; // LOG(FATAL) 这是FATAL日志; } GlogManager::Unit();注意点需要预定义宏否则会有编译报错和警告GLOG_USE_GLOG_EXPORTGLOG_NO_ABBREVIATED_SEVERITIES4、生成日志发现如下打印日志代码却生成了3个日志文件info文件waring文件、error文件如上图LOG(INFO) 这是info日志; LOG(WARNING) 这是warning日志; LOG(ERROR) 这是error日志;打开info日志发现info日志中包含info、waring、error日志打开waring日志发现info日志中包含waring、error日志打开error日志发现info日志中包含waring、error日志glog 默认会将所有级别 ≥ 当前日志级别的日志输出到对应级别的文件中一个模块日志一般写到一个文件中对此你有什么想法么目前想法1、项目中全都调用LOG(INFO)打印日志2、保留glog默认行为INFO日志中有全部日志ERROR中仅有error日志3、修改glog源码为所有级别日志输出到一个文件中不生成多个日志文件4、使用其他日志库例如spdlog准备采用方法3等修改好更新到我的资源文件中需要的小伙伴可以去下载。4、学习日志文件名为[程序名].[主机名].[用户名].log.[级别].[时间戳].[进程ID]如果想学习如何获主机名用户名、是不是就可以直接去看glog源码了其他功能也类似。比如获取主机的代码static void GetHostName(string* hostname) { #if defined(HAVE_SYS_UTSNAME_H) struct utsname buf; if (uname(buf) 0) { // ensure null termination on failure *buf.nodename \0; } *hostname buf.nodename; #elif defined(GLOG_OS_WINDOWS) char buf[MAX_COMPUTERNAME_LENGTH 1]; DWORD len MAX_COMPUTERNAME_LENGTH 1; if (GetComputerNameA(buf, len)) { *hostname buf; } else { hostname-clear(); } #else # warning There is no way to retrieve the host name. *hostname (unknown); #endif }