1.简介
Google Glog是Google的一个开源库,用于实现应用级别的logging。 它提供了一系列类似于C++流风格的logging API,以及一些预定义的宏。它有点类似于C里面的assert,但是比它具备更丰富的输出信息以及使用灵活性。
1.日志级别
INFO, WARNING, ERROR, FATAL、分别对应数字
0, 1, 2, 3
对应级别的日志打印在对应级别的日志文件中。
并且高级别的日志同时打印在本级别和低级别中。
例如 INFO中会有WARNING级别的输出。
默认输出在“/tmp/”目录下,修改输出目录方法:
- FLAGS_log_dir值修改
- google::ParseCommandLineFlags(&argc, &argv, true); 使用时,命令行参数log_dir设置。
日志文件名称格式:<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>
例如:hello_world.example.com.hamaji.log.INFO.20080709-222411.10474
本文开始处的例子中的 google::InitGoogleLogging(argv[0]); 参数便为设置程序名称。
FLAGS_log_dir 日志输出目录
FLAGS_v 自定义VLOG(m)时,m值小于此处设置值的语句才有输出
FLAGS_max_log_size 每个日志文件最大大小(MB级别)
FLAGS_minloglevel 输出日志的最小级别,即高于等于该级别的日志都将输出。
4.条件日志
有时候需要在满足一定条件下,才进行log操作,因此glog提供了如下了宏来满足实际需求。
- LOG_IF(INFO, Condition expression) :只有当条件表达式成立时,才会输出log信息。
- LOG_EVERY_N(INFO, interval) :当这条log语句被执行了1次,(1+interval)次,(1 + 2 * interval)次……才会输出和记录log信息。
- LOG_IF_EVERY_N(INFO, Condition, interval):只有当满足条件表达式时,才按照interval间隔来输出和记录log信息。
- LOG_FIRST(INFO, nums):记录前面nums次执行的log信息。
2.编译安装
在Google的Glog项目主页上下载相关的源码,并编译安装。
2.入门实例
// 1.cpp
#include <glog/logging.h>
#include <string>
#include <vector>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#define LOGDIR "/home/vslam/learning/glog_test/log"
#define MKDIR "mkdir -p "LOGDIR
//将信息输出到单独的文件和 LOG(ERROR)
void waiter(const char* data, int size)
{
std::string str = std::string(data,size);
std::ofstream fs(LOGDIR"glog_dump.log",std::ios::app);
fs<<str;
fs.close();
LOG(ERROR)<<str;
}
bool glogInit()
{
system(MKDIR);
google::InitGoogleLogging("");
#define DEBUG_MODE
#ifdef DEBUG_MODE
google::SetStderrLogging(google::GLOG_INFO); //设置级别高于 GOOGLE_NAMESPACE::INFO 的日志同时输出到屏幕
#else
GOOGLE_NAMESPACE::SetStderrLogging(GOOGLE_NAMESPACE::GLOG_FATAL);//设置级别高于 GOOGLE_NAMESPACE::FATAL 的日志同时输出到屏幕
#endif
FLAGS_colorlogtostderr = true; //设置输出到屏幕的日志显示相应颜色
//FLAGS_servitysinglelog = true;// 用来按照等级区分log文件</span>
google::SetLogDestination(google::GLOG_FATAL, LOGDIR"/FATAL_"); // 设置 GOOGLE_NAMESPACE::FATAL 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_ERROR, LOGDIR"/ERROR_"); //设置 GOOGLE_NAMESPACE::ERROR 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_WARNING, LOGDIR"/WARNING_"); //设置 GOOGLE_NAMESPACE::WARNING 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_INFO, LOGDIR"/INFO_"); //设置 GOOGLE_NAMESPACE::INFO 级别的日志存储路径和文件名前缀
FLAGS_logbufsecs = 0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_max_log_size = 5; //最大日志大小为 5MB
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出
//GOOGLE_NAMESPACE::SetLogFilenameExtension("91_"); //设置文件名扩展,如平台?或其它需要区分的信息
google::InstallFailureSignalHandler(); //捕捉 core dumped (linux)
google::InstallFailureWriter(waiter); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr
return true;
}
int main(int argc, char *argv[])
{
//google::InitGoogleLogging(argv[0]);
glogInit();
//google::SetLogDestination(google::INFO, "log/"); // 把日志同时记录文件,最低级别为INFO
// 通过GFLAGS来设置参数,更多选项可以在logging.cc里面查询
// 日志等级分为INFO, WARNING, ERROR, FATAL,如果是FATAL级别这直接运行报错
FLAGS_stderrthreshold = google::WARNING;
FLAGS_colorlogtostderr = true;
FLAGS_log_dir = "./log";
LOG(WARNING) << "Hello GLOG";
// 条件输出
LOG_IF(INFO, 20 > 10) << "20 > 10";
// 频率输出,本质上是通过google::COUNTER这个计数机实现的
for (int i = 0; i < 10; i++)
{
LOG_EVERY_N(ERROR, 3) << "每隔3次输出一次 " << i;
LOG_FIRST_N(ERROR, 2) << "前两次输出 " << i;
LOG_IF_EVERY_N(WARNING, 1 < 2, 2) << "条件输出+频率" << google::COUNTER;
}
google::ShutdownGoogleLogging();
}
CMakeLists
cmake_minimum_required(VERSION 2.8)
project(glog_test)
find_package(glog)
add_executable(main main.cpp)
target_link_libraries(main glog)
结果为:
参考:
1.http://rpg.ifi.uzh.ch/docs/glog.html
2.http://www.voidcn.com/article/p-xhhvtrti-bdk.html
3.https://www.cnblogs.com/hiloves/p/6009707.html
4.https://zhuanlan.zhihu.com/p/26025722
5.https://www.xuebuyuan.com/3208022.html
6.google-glog 开源库分析(一):glog介绍 - 天使的秘密
http://www.cnblogs.com/davidyang2415/p/3861109.html
google-glog 开源库分析(二):glog用法 - 天使的秘密
http://www.cnblogs.com/davidyang2415/p/3861112.html
google-glog 开源库分析(三):glog核心类结构 - 天使的秘密
http://www.cnblogs.com/davidyang2415/p/3861118.html
google-glog 开源库分析(四):glog宏技巧 - 天使的秘密
http://www.cnblogs.com/davidyang2415/p/3861120.html
C++的开源跨平台日志库glog学习研究(一) - lizhenghn
http://www.cnblogs.com/lizhenghn/p/3704749.html
C++的开源跨平台日志库glog学习研究(二)--宏的使用 - lizhenghn
http://www.cnblogs.com/lizhenghn/archive/2014/05/03/3705410.html
C++的开源跨平台日志库glog学习研究(三)--杂项 - lizhenghn
http://www.cnblogs.com/lizhenghn/p/3720508.html
如何使用Google日志库 (glog) - chenguangxing3的专栏
http://blog.csdn.net/chenguangxing3/article/details/17150069
glog使用与功能修改
http://www.cppfans.org/1566.html
glog多线程下按照指定条件创建新的日志文件 - lijingpeng的专栏
http://blog.csdn.net/lijingpengchina/article/details/9050539
window环境下glog的安装 - lijingpeng的专栏
http://blog.csdn.net/lijingpengchina/article/details/9047777