Google/glog
glog简介:
google 出的一个C++轻量级日志库,支持以下功能:
◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
◆ 严重性分级,根据日志严重性分级记录日志;
◆ 可有条件地记录日志信息;
◆ 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
◆ 异常信号处理。程序异常情况,可自定义异常处理过程;
◆ 支持debug功能;
◆ 自定义日志信息;
◆ 线程安全日志记录方式;
◆ 系统级日志记录;
◆ google perror风格日志信息;
◆ 精简日志字符串信息
安装:
https://github.com/google/glog
使用:
linux:
./configure --preifx=mypath
make
make install
写个编译该cpp文件的shell脚本,如下(这里使用静态链接方式):
#! /bin/sh
LIB_DIR='mypath/glog/lib/libglog.a'
INCLUDE_DIR='mypath/glog/include/'
g++ -g test.cpp $LIB_DIR -I$INCLUDE_DIR -lpthread -o test
./test
# 以上脚本有两点值得注意:
1、要加-lpthread
2、要保证test.cpp放在ligglog.a路径的前面
windows:
使用vs打开glog.sln直接编译。
将glog/src 和 使用的库放进代码中。
加入signalhandler.cc到libglog的源文件中。否则无法追堆栈信息。
文档:
在doc里面
使用说明以及DEMO:
//定义日志文件输出目录
FLAGS_log_dir = "c:\\GLogFiles";
//调用这一句会产生日志文件
google::InitGoogleLogging("abc.exe");
//与上一句成对使用
google::ShutdownGoogleLogging();
//线程安全日志记录
glog提供了线程安全的日志记录方式。
在<glog/raw_logging.h>文件中提供了相关的宏,
如,RAW_CHECK,RAW_LOG等。
这些宏的功能与CHECK,LOG等一致,
//日志分级
日志信息严重性等级按由低到高排列依次为:
enum SeverityLevel
{
google::INFO = 0,
google::WARNING = 1,
google::ERROR = 2,
google::FATAL = 3,
};
//运行参数
FLAGS_stderrthreshold=google::INFO;
FLAGS_colorlogtostderr=true;
//DEBUG模式支持
DEBUG模式日志输出形式,增加前缀D表示DEBUG模式日志,如DLOG(log_severity),DLOG_IF(log_severity,condition)
采用DEBUG宏控制,非DEBUG模式中DEBUG日志不会编译进程序就避免了程序冗余
//条件输出
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie"; //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << "th big cookie"; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果滞则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息。
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie"; //当此语句执行的前 20 次都输出日志,然后不再输出
条件宏:
LOG_IF(condition)
计数宏:
LOG_EVERY_N(log_severity,num)
LOG_IF_EVERY_N(log_severity,condition,num)
LOG_FIRST_N(log_severity,num)
使用google::COUNTER计数
验证宏:
功能类似assert断言,但不受DEBUG模式控制即非DEBUG模式也生效
如果验证失败,会写FATAL日志并终止程序运行
CHECK(condition)
比较验证:
CHECK_EQ(arg1,arg2)
CHECK_NE(arg1,arg2)
CHECK_LE(arg1,arg2)
CHECK_LT(arg1,arg2)
CHECK_GE(arg1,arg2)
CHECK_GT(arg1,arg2)
CHECK_NOTNULL(arg)
字符串比较:
CHECK_STREQ
CHECK_STRNE
CHECK_STRCASEEQ
CHECK_STRCASENE
浮点数验证:
CHECK_DOUBLE_EQ
CHECK_NEAR
其中CHECK_NOTNULL不能作为日志输出流使用
比较验证中,在输出中会输出比较值,所以要求比较值重载了输出操作符(operator<<(ostream,...))
在验证宏中,参数会是匿名参数如CHECK(string("abc")[1],'b')
//CHECK宏
当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的日志信息。功能类似于ASSERT,区别是 CHECK 宏不受 NDEBUG 约束,在 release 版中同样有效。
CHECK(port == 80)<<"HTTP port 80 is not exit.";
//core dumped
通过 google::InstallFailureSignalHandler(); 即可注册
//自定义输出方式:
//将信息输出到单独的文件和 LOG(ERROR)
void SignalHandle(const char* data, int size)
{
std::ofstream fs("glog_dump.log",std::ios::app);
std::string str = std::string(data,size);
fs<<str;
fs.close();
LOG(ERROR)<<str;
}
google::InstallFailureWriter(&SignalHandle);
//常用配置
google::SetLogDestination(google::ERROR,"log/prefix_"); //第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀。
google::SetStderrLogging(google::INFO); //输出到标准输出的时候大于 INFO 级别的都输出;等同于 FLAGS_stderrthreshold=google::INFO;
FLAGS_logbufsecs =0; //实时输出日志
FLAGS_max_log_size =100; //最大日志大小(MB)
#define GOOGLE_STRIP_LOG 3 // 小于此级别的日志语句将在编译时清除,以减小编译后的文件大小,必须放在 #include 前面才有效。
//简单封装
//
// create by mqd at 2017 01 18
//
#include "glog/logging.h"
#include "glog/raw_logging.h"
#include <string>
class GLogHelper
{
public:
explicit GLogHelper(const char* program, const char* dir);
~GLogHelper();
private:
static void SignalHandle(const char* data, int size){
std::string str = std::string(data, size);
LOG(ERROR) << str;
}
};
GLogHelper::GLogHelper(const char* program, const char* dir){
#ifdef _WIN32
system("md log");
#else
system("mkdir log");
#endif // _WIN32
std::string tempdir = dir;
google::InitGoogleLogging(program);
FLAGS_colorlogtostderr = true;
google::SetStderrLogging(google::INFO);
google::SetLogDestination(google::INFO, (tempdir + std::string("/INFO_")).c_str());
google::SetLogDestination(google::WARNING, (tempdir + std::string("/WARNING_")).c_str());
google::SetLogDestination(google::ERROR, (tempdir + std::string("/ERROR_")).c_str());
FLAGS_logbufsecs = 0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_max_log_size = 100; //最大日志大小为 100MB
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出
#ifndef _WIN32
google::InstallFailureSignalHandler(); //捕捉 core dumped
google::InstallFailureWriter(&SignalHandle); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,
#endif // !_WIN32
}
//GLOG内存清理:
GLogHelper::~GLogHelper(){
google::FlushLogFiles(google::INFO);
//关闭日志库 也会删除日志文件
//google::ShutdownGoogleLogging();
}
int main() {
GLogHelper("lalal","log");
LOG(WARNING) << "我在InitInstance()";
LOG(INFO) << "Found " << 1 << " cookies";
}
Google/glog相关推荐
- 【C++】google glog详解
0.简介 glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志. 源码下载:https://github.com/google/glog ubuntu安装: sudo ap ...
- Google Glog使用
Glog是Google的一个C++开源日志系统,轻巧灵活,入门简单,而且功能也比较完善. 安装 以下是官方的安装方法 git clone https://github.com/google/glog. ...
- 在windows下基于visual studio2017和CMake的安装Google glog
这里简单记录安装google glog在windows下基于visual studio2017的安装过程. 下载 https://github.com/google/glog 使用cmake编译,编译 ...
- google glog使用指南
Google Logging (glog) 是一个 C++98 库,用于实现应用程序级日志记录.该库提供了基于 C++ 风格流和各种帮助宏的日志 API. 入门 您可以通过简单地将内容流式传输到LOG ...
- Google glog
本文是根据自己的理解翻译组织了glog的manual,鉴于自身的理解能力和英语水平,可能存在谬误,欢迎大家指出!英文原文见 http://google-glog.googlecode.com/svn/ ...
- caffe中LOG(INFO) DLOG(INFO)介绍(统称Google glog)
Original url: http://blog.51cto.com/mengjh/546766 本文是根据自己的理解翻译组织了glog的manual,鉴于自身的理解能力和英语水平,可能存在谬 ...
- Google glog 使用
Google glog 使用 1 简介 Googleglog 库实现了应用级的日志记录,提供了C++ 风格的流操作和各种助手宏. 代码示例: #include <glog/logg ...
- google glog简介
本文是根据自己的理解翻译组织了glog的manual,鉴于自身的理解能力和英语水平,可能存在谬误,欢迎大家指出!英文原文见 http://google-glog.googlecode.com/svn/ ...
- google/glog 使用
1 安装 $sudo apt-get install libgoogle-glog-dev 2 使用 //将信息输出到单独的文件和 LOG(ERROR) #include <glog/loggi ...
最新文章
- mysql恢复数据的步骤_MySQL备份恢复数据的一般步骤
- 十六、curator recipes之DistributedIdQueue
- 如何在openbsd 5.1-5.3上部署open*** 服务器?
- 网络安全比赛理论答题(五)
- docker容器间数据共享
- (寒假CF)Choosing Symbol Pairs
- mysql添加外键的时候报错_mysql处理添加外键时 error 150 问题
- JBoss BRMS复杂事件处理(CEP)性能基准
- 百万用户规模的系统如何扩展
- 【知识连载】 如何用钉钉宜搭制定企业疫情防控数字化管理方案
- [USACO13OPEN]Fuel Economy【贪心】
- ShiftViT用Swin Transformer的精度跑赢ResNet的速度,论述ViT的成功不在注意力!
- 原生Hadoop集群搭建过程记录
- git merge 暂存区_经典好文:一篇文章,教你学会Git
- 关于ACM竞赛的题型分析
- python deap_看完必会的 python DEAP遗传算法库讲解+实战(中级)
- NP完全问题贪婪算法
- WINDOWS SERVER 2003禁用U盘
- latex中report目录_LaTeX提纲
- 数据链路层概述(主要解决的三个问题)
热门文章
- win10版本查看_不知道电脑上安装的win10版本,这样操作可以轻松查看
- Wiring in Spring: @Autowired, @Resource and @Inject 三种注解实现依赖注入
- 基于MATLAB的图像平滑滤波降噪(去噪)系统(通信毕业设计)(中值滤波,维纳滤波,小波降噪,均值滤波,椒盐噪声)
- 微信朋友圈闪退代码是什么?微信朋友圈闪退代码使用方法
- 张洪斌 html css,网页设计与制作张洪斌 刘万辉体设计.doc
- 彩虹代shua网仿小储云的模板 提前备份好数据
- 安装win7+ubuntu14.04双系统以及各种软件安装
- c++ 箭头符号怎么打_C++语言中的标识符只能由字母、数字、下划线三种字符组成,且第一个字符_____。...
- 1024程序员节,有的公司竟然送漱口水!
- 【OpenSea 创始人访谈录】听OpenSea 创始人谈 NFT 市场爆炸式增长的秘密