glog的编译和使用
glog是google提供的一个轻量级日志库,有chromium开发经验的人都会发现,它和base库中的日志库非常像,其实base库中的日志库比它更加轻量级。glog在日常开发中的使用非常广泛。这里介绍下它的编译和基本使用方法。
1. 下载
通过git从github拉取最新版本代码:
git clone https://github.com/google/glog.git
2.编译
2.1 Ubuntu
直接在工程目录下运行
./autogen.sh && ./configure && make
编译完后就会在libs目录下生成libglog.so动态库和libglog.a动态库,搭配src/glog目录下的.h头文件使用即可。
2.2 Windows
windows上需要通过cmake来编译。首先要配置cmake环境,这里就不再赘述。
为了不污染代码,我们先创建一个cmake_build文件夹,在里面执行:
cmake ..
运行完cmake命令后,会生成glog.sln文件,双击打开,它便是VS解决方案。然后直接运行编译,这样会直接生成lib静态库。
为了生成dll动态库,我们需要使用cmake-gui,勾选上"BUILD_SHARED_LIBS"选项,这样生成的glog工程默认就是dll库。
编译完后就会在Debug或Release目录生成lib静态库或者dll动态库。
头文件会自动放在glog目录中(缺了log_severity.h):
这里是编译好的dll库:glog.zip
3. glog使用
3.1 日志级别
glog和chromium中的日志级别一样,分为:
- INFO(=0)
- WARNING(=1)
- ERROR(=2)
- FATAL(=3)
使用时直接:
LOG(INFO) << "-------------123";
同样在DBUG模式下可以使用DLOG来设置调试日志:
DLOG(INFO) << "-------------123";
3.2 初始化日志配置
1.初始化
要将日志输出到文件,需要先对日志库进行初始化:
google::InitGoogleLogging(argv[0]); //括号内是程序名
默认会将日志输出到"C:\Users\user\AppData\Local\Temp"目录下。
2.关闭日志库
有了初始化,那相对的在退出程序前,也需要对日志库进行关闭操作:
google::ShutdownGoogleLogging();
3.设置日志保存目录
注意这个目录必须是已经存在,否则不能生成日志文件:
FLAGS_log_dir = "D:\\Logs";
4.几个参数
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; //设置是否在磁盘已满时避免日志记录到磁盘
FLAGS_minloglevel = google::GLOG_WARNING; //设置最小处理日志的级别
5.几个函数
google::SetLogDestination(google::GLOG_INFO, "log/prefix_"); //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
google::SetLogFilenameExtension("logExtension"); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
google::SetStderrLogging(google::GLOG_INFO); //大于指定级别的日志都输出到标准输出
4. 修改glog
4.1 日志输出格式
习惯了chromium风格的日志,对glog日志很不习惯,因此,我们可以修改glog日志的输出格式。
首先,将logging.cc中的LogFileObject::Write函数里,创建日志文件时必会写入的日志格式说明修改一下:
//Write a header message into the log file
ostringstream file_header_stream;
file_header_stream.fill('0');
file_header_stream << "Log file created at: "
<< 1900+tm_time.tm_year << '/'
<< setw(2) << 1+tm_time.tm_mon << '/'
<< setw(2) << tm_time.tm_mday
<< ' '
<< setw(2) << tm_time.tm_hour << ':'
<< setw(2) << tm_time.tm_min << ':'
<< setw(2) << tm_time.tm_sec << '\n'
<< "Running on machine: "
<< LogDestination::hostname() << '\n'
<< "Log line format: [pid:tid:mmdd/hh:mm:ss.uuuuuu:severity:file(line)] msg" << '\n';
然后,将LogMessage::Init里每条日志的前缀修改下:
//stream() << LogSeverityNames[severity][0]
// << setw(2) << 1+data_->tm_time_.tm_mon
// << setw(2) << data_->tm_time_.tm_mday
// << ' '
// << setw(2) << data_->tm_time_.tm_hour << ':'
// << setw(2) << data_->tm_time_.tm_min << ':'
// << setw(2) << data_->tm_time_.tm_sec << "."
// << setw(6) << data_->usecs_
// << ' '
// << setfill(' ') << setw(5)
// << static_cast<unsigned int>(GetTID()) << setfill('0')
// << ' '
// << data_->basename_ << ':' << data_->line_ << "] ";
stream() << '[' << getpid() << ":" << static_cast<unsigned int>(GetTID()) << ":"
<< std::setfill('0')
<< std::setw(2) << 1 + data_->tm_time_.tm_mon
<< std::setw(2) << data_->tm_time_.tm_mday
<< '/'
<< std::setw(2) << data_->tm_time_.tm_hour
<< std::setw(2) << data_->tm_time_.tm_min
<< std::setw(2) << data_->tm_time_.tm_sec
<< '.'
<< std::setw(6) << data_->usecs_
<< ':'
<< LogSeverityNames[severity] << ":" << data_->basename_ << "(" << data_->line_ << ")] ";
同样修改下LogSink::ToString里的格式:
//stream << LogSeverityNames[severity][0]
// << setw(2) << 1+tm_time->tm_mon
// << setw(2) << tm_time->tm_mday
// << ' '
// << setw(2) << tm_time->tm_hour << ':'
// << setw(2) << tm_time->tm_min << ':'
// << setw(2) << tm_time->tm_sec << '.'
// << setw(6) << usecs
// << ' '
// << setfill(' ') << setw(5) << GetTID() << setfill('0')
// << ' '
// << file << ':' << line << "] ";
stream << '[' << getpid() << ":" << GetTID() << ":"
<< std::setfill('0')
<< std::setw(2) << 1 + tm_time->tm_mon
<< std::setw(2) << tm_time->tm_mday
<< '/'
<< std::setw(2) << tm_time->tm_hour << ':'
<< std::setw(2) << tm_time->tm_min << ':'
<< std::setw(2) << tm_time->tm_sec << '.'
<< '.'
<< std::setw(6) << usecs
<< ':'
<< LogSeverityNames[severity] << ":" << file << "(" << line << ")] ";
修改后的日志输出如下:
和chromium风格是一致的。
4.2 日志文件名
默认glog会在日志目录下给每个级别的日志都会创建一个日志文件,且每次启动应用程序都会修改日志文件名(因为进程名变化),虽然能够起到过滤日志的作用,但是这样也会导致日志文件过多。我希望各种级别的日志都存放在一个文件中就行。
这部分的修改比较多,由于原本glog的逻辑时不同级别的日志分别处理,而我的目的是将它们统一放到一个文件中,这违背了它的设计原则,因此修改后很多功能可能都会受影响。因此,我封装了一层接口:
LOG_DLL_DECL int InitLogger(
const std::string& logName = "",
const std::string& logPath = "",
const google::LogSeverity minSeverity = google::GLOG_INFO,
const unsigned int fileMaxSize = 10);
LOG_DLL_DECL void ReleaseLogger();
使用这两个设置接口就没有问题。
代码: https://github.com/243286065/glog.git (分支:chromium_style)
这里是已经编译好的windows win32库:glog.zip
使用实例:
#include <iostream>
#include "glog/logger.h"
#define APP_NAME "GlogTest"
int main(int argc, char* argv[])
{
InitLogger(APP_NAME, "D:\\logs\\", google::GLOG_INFO);
LOG(INFO) << "-------------123";
LOG(WARNING) << "-------------123";
LOG(ERROR) << "-------------123";
std::cout << "Hello World!\n";
ReleaseLogger();
}
最后,感觉这样整,还不如直接把chromium的base库中的日志库拿出来用~~~
glog的编译和使用的更多相关文章
- glog学习(一):glog的编译及demo
windows平台: 1.下载glog代码.下载地址:https://github.com/google/glog 2.使用cmake工具,获得对应的工程文件sln. 3.打开sln文件,生成对应的l ...
- Google-GLog编译以及使用
心血来潮要去看开源代码,看到公司的日志库是在google-glog开源库上二次封装的,那就先撸glog吧. 1. 下载源码 一条命令取源码:git clone github.com/google/g ...
- ceres-solver库编译说明
0. ceres-solver简介 Ceres Solver是一个C++环境下的非线性最小二乘问题的求解工具包,可用来建模并解决大型复杂的非线性最小二乘问题.这个工具包已经广泛被 ...
- C++日志操作开源函数库之Google-glog
今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge ...
- 【神经网络与深度学习】【C/C++】C++日志操作开源函数库之Google-glog
今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge ...
- ubutun16.04 安装编译glog日志库
glog 是一个 C++ 日志库,它提供 C++ 流式风格的 API.在安装 glog 之前需要先安装 gflags,这样 glog 就可以使用 gflags 去解析命令行参数(可以参见gflags ...
- win32下编译glog
既然编译第三方库了,google提供的VSproject是老版本的,构建不好升级.所以还是用cmake是王道. 采用out of source 编译, 以下是编译脚本bat: mkdir build ...
- ubuntu 16.04上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/977f5125/,欢迎阅读! compile glog and glags on ubuntu 16.04 Series comp ...
- Windows 10上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on windows from source
本文首发于个人博客https://kezunlin.me/post/bb64e398/,欢迎阅读! compile glog v0.3.5 and glags on windows from sour ...
随机推荐
- win10python安装iis
django部署iis https://www.cnblogs.com/guangang/articles/9268644.html python部署iis https://www.cnblogs.c ...
- [C1] 线性回归(Linear Regression)
线性回归(Linear Regression with One / Multiple Variable) 定义符号(Symbol Definition) m = 数据集中训练样本的数量 n = 特征的 ...
- pointNet代码
介绍 组成 1.PointNet classification network分类网络 part segmentation network 数据集 1.point clouds sampled fro ...
- luoguP4774 [NOI2018]屠龙勇士
题意 考虑杀每只龙\(i\)时候用的剑是一定的,我们可以用multiset模拟一遍得到,设为\(b_i\). 发现我们要求一个\(x\)满足对每个\(i\)有:\(b_i*x\equiv a_i\pm ...
- php 学习笔记之日期时间操作一箩筐
格式化日期时间 date : 格式化日期时间 场景 将当前日期时间或者特定日期时间格式化输出为特定格式的字符串,常用于人性化展示信息. 说明 返回给定时间戳格式化后所产生的日期时间字符串,如果没有给出 ...
- Python进阶-XVI 继承 单继承 多继承
一.初识继承 1.引入继承 class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类 ...
- Docker 简单发布dotnet core项目 图文版
原文:https://www.cnblogs.com/chuankang/p/9474591.html docker发布dotnet core简单流程 需要结合这个版本看哈 地址:https://ww ...
- A1039 Course List for Student (25 分)
一.技术总结 这里由于复杂度的限制,只能够使用vector,然后进行字符串转化:考虑到string.cin.cout会超时,可以使⽤用hash(262626*10+10)将学⽣生姓名变为int型,然后 ...
- 容器网络插件那么多,博云为什么基于OVS深度自研?
背景 从2015年开始,博云开始基于Kubernetes和容器帮助客户交付应用管理平台.在开始阶段,博云选择了业界使用度非常广泛且成熟稳定的calico作为默认的网络方案并在calico方面积累了大量 ...
- Visual Studio 定制模板类---详细步骤
1.先定义一个类文件,将要定义的信息写入类文件 比如我每次写一个命令都是这个套路,要继承接口,要写上相应的特性,每次都 是重复的工作: 2.提取类模板 项目=>导出模板 这里你可以导出项目模板和 ...