ubuntu下编译、安装及使用glog

What is glog?

Google Logging (glog) is a C++98 library that implements application-level logging. The library provides logging APIs based on C++-style streams and various helper macros.

Glog defines a series of macros that simplify many common logging tasksYou can log messages by severity levelcontrol logging behavior from the command linelog based on conditionalsabort the program when expected conditions are not metintroduce your own verbose logging levelsand more.

1,安装glog

https://blog.csdn.net/qq_22634949/article/details/101718879

git clone https://github.com/google/glog
cd glog
mkdir build && cd build
cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

安装好后

# glog的头文件位于/usr/local/include

# glog的库文件位于/usr/local/lib

2,glog的使用

https://blog.csdn.net/Pig_Pig_Bang/article/details/81632962

#define GOOGLE_GLOG_DLL_DECL    // 由于我们使用的glog的静态库,一定要定义这个宏
 
#include "glog/logging.h"
#include <iostream>

using namespace std;

#define NDEBUG 0
int main(int argc, char* argv[])
{
    //几个参数设置
	// 设置日志消息是否转到标准输出而不是日志文件
	FLAGS_logtostderr = false;
	// 设置日志前缀是否应该添加到每行输出
	FLAGS_log_prefix = true;
	// 设置可以缓冲日志的最大秒数,0指实时输出
	FLAGS_logbufsecs = 0;
	// 设置最大日志文件大小(以MB为单位)
	FLAGS_max_log_size = 10;
	// 设置是否在磁盘已满时避免日志记录到磁盘
	FLAGS_stop_logging_if_full_disk = true;
	// 设置记录到stderr的log的级别。这仅仅是对于记录Log到stderr中的设置,当我们需要将WARNING等级的log记录到stderr时,
	// 我们可以通过设置FLAGS_stderrthreshold = 1,那么WARNING以及更高级别的Log将会记录到stderr中。INFO: 0, WARNING: 
	// 1, ERROR: 2 FATAL: 3;
	FLAGS_stderrthreshold = WARNING;
	// 设置需要记录log的级别。我们可以指定那些Log被记录(无论是在本地还是stderr),通过设置FLAGS_minloglevel = 0标志,
	// 默认是0,设置这个标志表明,INFO以及更高级别的Log将会被记录;INFO: 0, WARNING: 1, ERROR: 2 FATAL: 3。
	FLAGS_minloglevel = 0;
	 
    #if NDEBUG
		std::cout << "Build-RELASE" << std::endl;
		FLAGS_alsologtostderr = false;
	#else
		std::cout << "Build-DEBUG" << std::endl;
		//设置日志消息除日志文件之外同时输出到标准输出
		FLAGS_alsologtostderr = true;
		//设置记录到标准输出的颜色消息(如果终端支持)
		FLAGS_colorlogtostderr = true;
	#endif
	// 设置日志文件保存目录,这个目录必须是已经存在的,否则不能生成日志文件.
	FLAGS_log_dir = "log";

    google::InitGoogleLogging(argv[0]);                // 全局初始化glog,argv[0]是程序名
    google::SetStderrLogging(google::GLOG_INFO);       // 设置glog的输出级别,这里的含义是输出INFO级别以上的信息
    // 设置INFO级别以上的信息log文件的路径和前缀名
    google::SetLogDestination(google::GLOG_INFO, "log/info_");
 
    // 设置WARNING级别以上的信息log文件的路径和前缀名
    google::SetLogDestination(google::GLOG_WARNING, "log/warn_");
 
    // 设置ERROR级别以上的信息log文件的路径和前缀名
    google::SetLogDestination(google::GLOG_ERROR, "log/errr_");
 
    FLAGS_colorlogtostderr = true;                     // 开启终端颜色区分
 
    LOG(INFO) << "This is my first glog INFO ";        // 像C++标准流一样去使用就可以了,把这条信息定义为INFO级别
    LOG(WARNING) << "This is my first glog WARNING";   // 像C++标准流一样去使用就可以了,把这条信息定义为WARNING级别
    LOG(ERROR) << "This is my first glog ERROR";       // 像C++标准流一样去使用就可以了,把这条信息定义为ERROR级别
 
    google::ShutdownGoogleLogging();                   // 全局关闭glog
    return 0;
}
  • 编译
gcc aaa.cpp -o aaa.out -lglog -lstdc++
或者
gcc  aaa.cpp -o aaa.out -L/usr/local/lib/ -lglog -lstdc++ -I/usr/local/include/glog/
或者
g++ aaa.cpp -o aaa.out -lglog

https://www.fabianfier.de/blog1.php/gcc-on-ubuntu-16-04

”The issue was the call of the linker. It expects shared library files to appear AFTER the executable using them, so instead of g++ -lgflags -lglog MANY.o-FILES -o EXECUTABLE it wants the libraries at the end. g++ MANY.o-FILES -o EXECUTABLE -lgflags -lglog solved the problem.“

https://blog.csdn.net/tsaiyong_ahnselina/article/details/21198779

”对于C++程序,编译的时候用 gcc 或者 g++ 都可以。但是在进行连接的时候最好用 g++,因为用 g++ 会自动进行 C++ 标准库的连接;用 gcc 连接 C++ 程序也可以,但是需要人为指定连接 C++ 标准库,否则就会出现 undefined reference to `__gxx_personality_v/0' 之类的错误。可见-lstdc++ 所对应的是标准C++库。“

https://www.cnblogs.com/0-lingdu/p/10954708.html

“-lpthread是个啥?

g++ -l参数就是用来指定程序要链接的库,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把 libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了,所以-lpthread指向的是一个叫libpthread.so的库文件,并且我和找到了这个库,是这样的/usr/lib/x86_64-linux-gnu/libpthread.so,话说,为啥中间隔了一层啊喂。这个库据说是处理多线程的,大约glog是自己一个线程跑的吧。也挺科学的。”

  • 运行后结果如下

https://blog.csdn.net/alwaysrun/article/details/108418769?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

日志格式

默认情况下日志会写入本地/tmp/文件夹中,文件名格式:

<program name>.<host name>.<user name>.log.<Severity level>.<date>-<time>.<pid>

默认情况下,GLog还会将ERROR和FATAL错误记录到stderr消息中(会在终端打印出来)。

在终端打印出的消息的格式:

<Serverity level><number> <time>.<number> <pid> <file>:<line number> <messages>

  • 补充

https://www.cnblogs.com/hiloves/p/6009707.html

glog 有四个错误级别,枚举如下

 

enum SeverityLevel
{
  google::INFO = 0,
  google::WARNING = 1,
  google::ERROR = 2,
  google::FATAL = 3,
};

输出日志

LOG(INFO) << "info test";  //输出一个Info日志
LOG(WARNING) << "warning test";  //输出一个Warning日志
LOG(ERROR) << "error test";  //输出一个Error日志
LOG(FATAL) << "fatal test";  //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序

除基本的日志输出外,glog还支持条件输出

// 条件记录
LOG_IF(INFO, get_count > 10) << "Get too many times";   //当条件满足时输出日志 
// 周期记录
LOG_EVERY_N(INFO, 10) << "Got " << google::COUNTER << "times";  // google::COUNTER记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息 
// 条件加周期记录
LOG_FIRST_N(INFO, 10) << "Got " << google::COUNTER << " times";  //当此语句执行的前 10 次都输出日志,然后不再输出 
// 限制Log输出次数
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << " too big";  //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果是则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息

几个函数

google::SetLogDestination(google::GLOG_INFO, "log/prefix_");  //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
google::SetLogFilenameExtension("logExtension");  //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
google::SetStderrLogging(google::GLOG_INFO);  //大于指定级别的日志都输出到标准输出

参数

FLAGS_log_dir = "./"; // 设置log输出文件夹,默认输出到本地/tmp文件夹下
FLAGS_logtostderr = 1; // 设置log输出到stderr,不保存到本地
FLAGS_alsologtostderr = 1; // 设置log输出到stderr和本地
FLAGS_stderrthreshold = 1; // WARNING以及更高级别的log将会记录到stderr中;(INFO: 0, WARNING: 1, ERROR: 2 FATAL: 3)
FLAGS_minloglevel = 0; // 默认是0,INFO以及更高级别的Log将会被记录;(INFO: 0, WARNING: 1, ERROR: 2 FATAL: 3)
FLAGS_colorlogtostderr = 1; // 设置记录到标准输出的颜色消息(如果终端支持)
FLAGS_log_prefix = true; // 设置日志前缀是否应该添加到每行输出
FLAGS_logbufsecs = 0;// 设置可以缓冲日志的最大秒数,0指实时输出
FLAGS_max_log_size =10;// 设置最大日志文件大小(以MB为单位)
FLAGS_stop_logging_if_full_disk = true; // 设置是否在磁盘已满时避免日志记录到磁盘

可在命令行运行程序时指定这些flag,如$ ./a.o  -logtostderr true ,相当于 FLAGS_logtostderr = 1。

https://blog.csdn.net/alwaysrun/article/details/108418769?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

perror风格日志

glog提供了与LOG*和CHECK宏作用等价的PLOG()、PLOG_IF() 和PCHECK()宏,不同的是,后者在记录日志信息的时候,会将errno的状态及其描述附加到日志描述中。

PCHECK(write(fp, NULL, 4) == 4) << "Write NULL failed";
// 当条件不成立时,会输出日志信息:
// F0825 ...] Check failed: write(fp, NULL, 4) == 4 Write NULL failed: Bad address [14]

PLOG需要在函数调用后立即调用,要保证中间没有对errno产生影响。

Debug输出

glog提供特定的只在debug模式下生效的宏。以下分别对应LOG、LOG_IF、DLOG_EVERY_N操作的专用宏。

DLOG(INFO) << "Debug info";
DLOG_IF(INFO, get_count > 10) << "Get too many times"; 
DLOG_EVERY_N(INFO, 10) << "Got " << google::COUNTER << "times";

CHECK条件终止程序

glog提供了CHECK宏,用于在调试出错的时候中止程序,及早发现程序错误。当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的日志信息。功能类似于ASSERT,区别是CHECK宏不受NDEBUG约束,在release版中同样有效。具体使用如下:

  1. 判定大小关系:CHECK_EQ, CHECK_NE, CHECK_LE, CHECK_LT, CHECK_GE, CHECK_GT,使用这些宏需要注意类型一致,如果出现类型不一致的,可使用static_cast转换。
  2. 判定指针是否为空:CHECK_NOTNULL(some_ptr)。
  3. 判定字符串是否相等:CHECK_STREQ, CHECK_STRNE 大小写敏感字符串来判定,CHECK_STRCASEEQ, CHECK_STRCASENE 大小写不敏感字符串判定。
  4. 判定浮点是否相等或相近:CHECK_DOUBLE_EQ,CHECK_NEAR,这两个宏都需要指定一个可容忍的偏差上限。

当这些宏判定条件不成立时,glog会生成一个FATAL级别的日志信息,该信息包含比较的两个值和stream方式传入的字符串,然后中止程序。

CHECK(write(fp, ary, 4) == 4) << "Write failed!"; // 出错时输出日志中包含 “write(fp, ary, 4) == 4” 和 “Write failed!”
CHECK_EQ(string("abc")[1], 'b'); 
CHECK_EQ(some_ptr, static_cast<SomeType*>(NULL));

异常处理

glog提供了比较方便的程序异常处理机制。例如,当程序出现SIGSEGV异常信号时,glog的默认异常处理过程会导出非常有用的异常信息。异常处理过程可以通过google::InstallFailureSignalHandler()来自定义。

 void FailureWriter(const char *data, int size) {
    LOG(ERROR) << data;
 }
 
 google::InstallFailureSignalHandler();
 google::InstallFailureWriter(&FailureWriter);


 

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在给定的命令中,"sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4" 是用于创建一个软链接的命令。软链接是一个指向另一个文件或目录的引用,类似于快捷方式。在这个命令中,我们将"/usr/lib/x86_64-linux-gnu/libmpfr.so.6"软链接到"/usr/lib/x86_64-linux-gnu/libmpfr.so.4"上。这样,当系统在使用"/usr/lib/x86_64-linux-gnu/libmpfr.so.4"时,实际上会访问到"/usr/lib/x86_64-linux-gnu/libmpfr.so.6"这个文件。因此,这个命令的目的是将"libmpfr.so.6"的功能扩展到"libmpfr.so.4"上,以便于程序或系统在使用这个库时的兼容性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [No rule to make target '/usr/lib/x86_64-linux-gnu/libGL.so](https://blog.csdn.net/ba99783/article/details/101559761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值