如何使用Google日志库
Google Glog 是一个C++语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种助手宏。
1、开源项目首页已经从https://code.google.com/p/google-glog/迁移到https://github.com/google/glog。
2、下载代码后,双击根目录下的google-glog.sln3、在解决方案下有四个工程:libglog(是动态链接库工程,生成libglog.dll和libglog.lib),libglog_static(是静态库工程,生成libglog_static.lib,运行时不需要libglog.dll),logging_unittest和logging_unittest_static是相应的测试工程。
4、不需要更改工程属性。平台工具集是否是Windows XP(v140_xp)好像并不影响。Glog不支持Unicode宽字符集,工程属性字符集保持多字节字符集。“C/C++”-“代码生成”中的“运行库”,libglog动态库工程必须选择“多线程DLL”或“多线程调试DLL”,libglog_static静态库工程必须选择“多线程”或“多线程调试”。
5、按需要编译库。以静态库为例,动态库多一步将libglog.dll拷贝到程序目录下。分别编译Debug和Release,将Debug版的重命名为libglog_static_d.lib。将编译的lib文件拷贝到根目录\src\glog下,\src\glog是头文件目录。这个版本的静态库在试用时并未发现有内存泄露问题。
6、将\glog目录(包括了头文件和库文件)拷贝到自己的工程目录下。也可以新建另外的库目录,也可以在工程属性的附加目录中增加相应目录,这里采用在代码文件中控制。在工程资源管理器中添加glog头文件,如果先添加glog目录再添加头文件会提示glog头文件中的#include路径出错,手动删除路径中的“glog\”可解决。
7、在需要的地方#include "glog/logging.h"。建议添加到stdafx.h中。
8、使用静态库必须添加#define GOOGLE_GLOG_DLL_DECL。动态库不必添加。
9、因windows.h中定义的宏ERROR,与glog中定义的宏ERROR冲突,所以如果#include <windows.h>后要添加#define GLOG_NO_ABBREVIATED_SEVERITIES,并且代码中要用google::GLOG_ERROR来代替原来的google::ERROR,相应的其他也改为:GLOG_INFO、GLOG_WARNING、GLOG_FATAL。
10、添加库文件:#pragma comment(lib,"glog/libglog_static.lib")。针对Debug和Release版,用#ifdef控制。
#define GOOGLE_GLOG_DLL_DECL
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include "glog/logging.h"
#ifdef DEBUG
#pragma comment(lib,"glog/libglog_static_d.lib")
#else
#pragma comment(lib,"glog/libglog_static.lib")
#endif // DEBUG
11、自己的工程使用静态库时,必须选择“多线程”或“多线程调试”。使用动态库则选择“多线程DLL”或“多线程调试DLL”。
12、使用glog之前必须先初始化库,要生成日志文件只需在开始log之前调用一次:
google::InitGoogleLogging(argv[0]); //括号内是程序名
13、设置日志文件保存目录,这个目录必须是已经存在的,否则不能生成日志文件。必须在初始化库之前调用。
FLAGS_log_dir = "c:\\Logs";
14、GLOG 有四个错误级别,枚举如下:
enum SeverityLevel
{
google::INFO = 0,
google::WARNING = 1,
google::ERROR = 2,
google::FATAL = 3,
};
15、输出日志:
LOG(INFO) << "info test"; //输出一个Info日志
LOG(WARNING) << "warning test"; //输出一个Warning日志
LOG(ERROR) << "error test"; //输出一个Error日志
LOG(FATAL) << "fatal test"; //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序
16、条件输出:
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 次都输出日志,然后不再输出
17、几个函数:
google::SetLogDestination(google::GLOG_INFO, "log/prefix_"); //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
google::SetLogFilenameExtension("logExtension"); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
google::SetStderrLogging(google::GLOG_INFO); //大于指定级别的日志都输出到标准输出
18、几个参数设置:
FLAGS_logtostderr = true; //设置日志消息是否转到标准输出而不是日志文件
FLAGS_alsologtostderr = true; //设置日志消息除了日志文件之外是否去标准输出
FLAGS_colorlogtostderr = true; //设置记录到标准输出的颜色消息(如果终端支持)
FLAGS_log_prefix = true; //设置日志前缀是否应该添加到每行输出
FLAGS_logbufsecs = 0; //设置可以缓冲日志的最大秒数,0指实时输出
FLAGS_max_log_size = 10; //设置最大日志文件大小(以MB为单位)
FLAGS_stop_logging_if_full_disk = true; //设置是否在磁盘已满时避免日志记录到磁盘
19、Google日志库使用实例
几个比较简单的选项 :
1、里面有以FLAGS_ 开头的全局变量,可以代替以 GLOG_ 开头的环境变量,FLAGS_log_dir = "./"; //等效于设置环境变量 GLOG_log_dir = "./" ,而且前者优先级高。每个GLOG_开头的设置项都有对应的FLAGS_开头的全局变量,在程序记录日志前修改有效。
2、//设置日志文件路径,指定其基本名称
google::SetLogDestination(google::INFO,"./mylog_");//大于INFO级别的,记录在当前目录,文件以为mylog_前缀
google::SetLogDestination(google::ERROR,"");//不为ERROR建立日志文件
google::SetLogDestination(google::WARNING,"");
3、//其他配置
google::SetStderrLogging(google::INFO);//配置输出到标准错误输出的最低日记级别。
google::LogToStderr();//只输出到标准错误输出
测试代码如下。
#include <glog/logging.h>
int main(int argc, char* argv[])
{
//Initialize Google's logging library.
google::InitGoogleLogging(argv[0]);
google::SetLogDestination(google::INFO,"./test_log/");//大于INFO级别的,日志文件放在当前路径的test_log文件夹下面。不设置的话默认在系统/tmp/下面,INFO, ERROR,WARNING按文件分开。
google::SetStderrLogging(google::INFO);//配置输出到标准错误输出的最低日记级别(输出了所有日志)
char lv[10] = "l loveyou";
int num_cookies = 10;
int addr = 34;
for(int i = 0; i < 5; ++i)
{
LOG(INFO) << "Found " << num_cookies+i<<":--->"<< lv<< " cookies";
LOG(WARNING) <<"warn 地址: "<<&addr;
LOG(ERROR) <<" value: "<<addr;
}
return 0;
}
如何使用Google日志库相关推荐
- libslog---高性能开源C/C++多线程安全日志库
Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog libslog是一个基于linux的高性能开源C/C++多线程安全日志库.Ea ...
- glog日志库使用笔记
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活. 在Github上下载glog,解压 ...
- 发布一个适合服务端C++程序的高效日志库
PPT 见 http://www.slideshare.net/chenshuo/efficient-logging-in-multithreaded-c-server/ 2012年6月30日在深圳的 ...
- java applog_Java Web App: 选择与配置日志库
Java世界里,日志库就和许多其他库[1]一样,你有多个选择,多个还不错的选择,比如log4j, java.util.logging, logback, 另外还有一些统一的log api,比如slf4 ...
- go日志库log/zap/logrus
一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例如INFO,DEBUG,ERR ...
- glog --- C++日志库
glog -- C++日志库 日志库glog glog安装 简单使用 默认输出 仅输出到标准输出 输出设置 输出目录设置 错误类型 条件输出 日志库glog 实现应用程序级日志记录的C++库. 项目地 ...
- 【Go进阶】如何让你Go项目中日志清晰有趣-Zap日志库
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. Zap日志库在Go语言项目中的使用 在许多Go ...
- Go 语言中的 logger 和 zap 日志库
目录 Go 语言中的 logger 和 zap 日志库 Go Logger Zap Logger Logger Sugared Logger 定制 Logger 记录到文件中 Zap logger 中 ...
- go.uber.org/zap日志库
文章目录 go.uber.org/zap日志库 1.GO SDK里Logger优缺点 2.介绍Uber-go zap 3.安装zap依赖 4.zap.NewProductionEncoderConfi ...
- 日志库glog之如何用cmake将源码生成.sln文件
glog是google提供的一个开源的C++日志库.由于最新的glog源码工程中,已经移除了".sln"文件,代之以"a CMake build system" ...
最新文章
- GOF23设计模式(创建型模式)单例模式
- 关于java和c的选择结构和循环结构
- Microsoft training Kits
- JVM第三篇 — JVM是怎么工作的?
- 【FFmpeg】ffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )
- 操作系统概念学习笔记 11 进程同步(一)
- 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
- 在AD中恢复误删除的对象
- sed修炼系列(三):sed高级应用之实现窗口滑动技术
- ps2018 html面板,28组经典PS 2018插件合集
- 计算机控制课设串级回路,计算机控制系统课程设计
- bme java_为什么bme280.startreadout()只触发一次?
- 科学计算机符号大全,计算机符号代码大全
- linux网络重设,Linux ADSL拨号上网
- html盒子移动动画代码,js实现盒子移动动画效果
- 流体力学基础——流体静力学
- 全球与中国户外楼梯升降机市场现状及未来发展趋势
- 泰安旱稻安家增收 国稻种芯·中国水稻节:山东穿布鞋种水稻
- Pytorch cuda out of memory
- [笔记][java 4 android] [028~034]接口、异常和I/O流
热门文章
- MySQL高可用之主备同步:docker-v挂载文件
- java 某种特殊的数列a1, a2, a3, ...的定义如下:a1 = 1, a2 = 2, ... , an = 2 * an ? 1 + an - 2 (n 2)。
- 中国移动极力发展固网宽带业务可以增强其整体竞争力
- 不仅致癌,更能致盲!长期吸烟,小心染上这5大眼疾
- Sequence Level Training with Recurrent Neural Networks-学习笔记
- 数据结构1.1基本概念以及时间复杂度的计算
- JDK8中HashMap依然会产生死循环问题,太香了
- 一级计算机office文字处理教程,2016年计算机一级《MSOffice》文字处理题冲刺
- 智过网:2023监理工程师网报流程整理如下!
- 深度学习工程师能力评估标准(Deep learning engineer capability evaluation standard)