Apollo中的glog

在Apollo中google glog 被广泛使用,glog 是 google 的一个 c++ 开源日志系统,轻巧灵活,入门简单,而且功能也比较完善。

1. 安装

以下是官方的安装方法,一句命令:

$ git clone https://github.com/google/glog.git 
$ cd glog
$ ./autogen.sh && ./configure && make && make install

2. 使用

2.1 菜鸟级

从一个最简单的程序开始:

#include <glog/logging.h>

int main(int argc,char* argv[])
{
google::InitGoogleLogging(argv[]); //初始化 glog
LOG(INFO) << "Hello,GOOGLE!";
}

编译:

. glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test #编译

. glog ./glog_test

. glog ll /tmp #ll是小写的L

. glog cat /tmp/glog_test.INFO 

这里 g++ 编译的时候注意链接的库是要按顺序的(我也是才知道)。gcc 和 g++ 中库的链接顺序是从右往左进行,所以要把最基础实现的库放在最后,这样左边的 lib 就可以调用右边的 lib 中的代码。

一开始没注意顺序出现各种找不到函数,用 nm -C 定位了好久。而且这里我必须再链接上 gflags 才能成功编译,看网上其他人都没有。如果有大神知道为什么麻烦带带我。

这里没有指定日志文件的目录,默认会放在 /tmp 下,文件名的格式为 <program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>。

2.2 新手级

日志文件的位置可以通过 gflags 命令行参数 log_dir 来指定,这时注意在 main 函数开始时初始化 gflags: google::ParseCommandLineFlags(&argc, &argv, true);,也可以直接在代码里 指定 FLAGS_log_dir 的值。这里还是推荐标准的做法,即用命令行参数。

glog 的日志会根据日志严重性分级记录日志,标准的分级为:INFO, WARNING, ERROR, FATAL。不同级别的日志信息会输出到不同文件,同时高级别的日志也会写入到低级别中。

再看个例子:

#include <glog/logging.h>

int main(int argc,char* argv[])

{
google::InitGoogleLogging(argv[]); // 初始化 glog
google::ParseCommandLineFlags(&argc, &argv, true); // 初始化 gflags
LOG(INFO) << "Hello, GOOGLE!"; // INFO 级别的日志
LOG(ERROR) << "ERROR, GOOGLE!"; // ERROR 级别的日志 return ;
}

再次编译运行:

glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test
glog mkdir log # 建一个目录放日志文件
glog ./glog_test -log_dir=./log
glog ll log

这里可以看到,我们通过 log_dir 指定了日志存放目录。而这里虽然我们没有输出 WARNING 级别的日志信息,但却有该级别的日志。看一下分别是什么:

glog cd log
log cat glog_test.ERROR
log cat glog_test.WARNING
log cat glog_test.INFO

WARNING 级别的日志里放了 ERROR 的输出信息,这就是我们说的高级别的日志会写入到低级别中,而且是每个低级别。

还有一个常用的日志输出语句,即自定义日志类型 VLOG。VLOG 的用法也很简单,像这样 VLOG(50) << "MY VLOG INFO";。这里的 50 只是自己定义的一个级别,事实上你可以定义任何一个数字,但一般越小的数字代表这条输出日志越重要。通过命令行参数 -v 50 这样子来指定 VLOG 输出的级别,-v 50 意味着只有小于 50 以下的 VLOG 才会被输出(这里不会影响 LOG(INFO)这些)。一般项目里越底层的库使用越大数字的 VLOG 来打印调试信息,这样可以使得日志不会被一堆底层库的运行信息淹没。

再看个例子:

#include <glog/logging.h>
int main(int argc,char* argv[])
{
google::InitGoogleLogging(argv[]);
google::ParseCommandLineFlags(&argc, &argv, true);
LOG(INFO) << "Hello, GOOGLE!";
VLOG() << "VLOG INFO 100";
VLOG() << "VLOG INFO 50";
VLOG() << "VLOG INFO 10"; return ;
}

这里我们有三条 VLOG 信息,分别是 100 50 10 三个级别。VLOG 的信息只会出现在 INFO 级别的日志中:

glog g++ glog_test3.cpp -lglog -lgflags -lpthread -o glog_test

glog ./glog_test -log_dir=./log -v 

glog cat log/glog_test.INFO

我们可以看到,指定了 -v 50 后,只有小于等于 50 的 VLOG 及正常 LOG(INFO) 信息被打印出来。如果你问如果不指定会怎样,回答就是一条 VLOG 信息都不会出现。

2.3进阶版

如果你以为这里还有进阶版介绍的话,我只能向你表示抱歉。我的使用只是简单级别,目前项目也没有必要更复杂的 glog 接口。

当然,我们也可以像其他博客把 glog 的功能全列出来:

  • 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为
  • 严重性分级,根据日志严重性分级记录日志
  • 可有条件地记录日志信息
  • 条件中止程序。丰富的条件判定宏,可预设程序终止条件
  • 异常信号处理。程序异常情况,可自定义异常处理过程
  • 支持debug功能。可只用于debug模式
  • 自定义日志信息
  • 线程安全日志记录方式
  • 系统级日志记录
  • google perror风格日志信息
  • 精简日志字符串信息

原文:https://blog.csdn.net/dinnerhowe/article/details/79911728

版权声明:本文为博主原创文章,转载请附上博文链接!

Apollo中的glog在Apollo中google glog 被广泛使用,glog 是 google 的一个 c++ 开源日志系统,轻巧灵活,入门简单,而且功能也比较完善。
1. 安装以下是官方的安装方法,一句命令:
git clone https://github.com/google/glog.gitcd glog ./autogen.sh && ./configure && make && make install1232. 使用2.1 菜鸟级从一个最简单的程序开始:
#include <glog/logging.h>
int main(int argc,char* argv[]){    google::InitGoogleLogging(argv[0]); //初始化 glog    LOG(INFO) << "Hello,GOOGLE!";}1234567编译:
1. glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_test #编译2. glog ./glog_test3. glog ll /tmp #ll是小写的L4. glog cat /tmp/glog_test.INFO 1234这里 g++ 编译的时候注意链接的库是要按顺序的(我也是才知道)。gcc 和 g++ 中库的链接顺序是从右往左进行,所以要把最基础实现的库放在最后,这样左边的 lib 就可以调用右边的 lib 中的代码。
一开始没注意顺序出现各种找不到函数,用 nm -C 定位了好久。而且这里我必须再链接上 gflags 才能成功编译,看网上其他人都没有。如果有大神知道为什么麻烦带带我。
这里没有指定日志文件的目录,默认会放在 /tmp 下,文件名的格式为 <program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>。
2.2 新手级日志文件的位置可以通过 gflags 命令行参数 log_dir 来指定,这时注意在 main 函数开始时初始化 gflags: google::ParseCommandLineFlags(&argc, &argv, true);,也可以直接在代码里 指定 FLAGS_log_dir 的值。这里还是推荐标准的做法,即用命令行参数。
glog 的日志会根据日志严重性分级记录日志,标准的分级为:INFO, WARNING, ERROR, FATAL。不同级别的日志信息会输出到不同文件,同时高级别的日志也会写入到低级别中。
再看个例子:
#include <glog/logging.h>
int main(int argc,char* argv[]){    google::InitGoogleLogging(argv[0]);  // 初始化 glog    google::ParseCommandLineFlags(&argc, &argv, true);  // 初始化 gflags    LOG(INFO) << "Hello, GOOGLE!";  // INFO 级别的日志    LOG(ERROR) << "ERROR, GOOGLE!";  // ERROR 级别的日志    return 0;}12345678910再次编译运行:
glog g++ glog_test2.cpp -lglog -lgflags -lpthread -o glog_testglog mkdir log # 建一个目录放日志文件glog ./glog_test -log_dir=./logglog ll log 1234这里可以看到,我们通过 log_dir 指定了日志存放目录。而这里虽然我们没有输出 WARNING 级别的日志信息,但却有该级别的日志。看一下分别是什么:
glog cd loglog cat glog_test.ERROR log cat glog_test.WARNING log cat glog_test.INFO1234WARNING 级别的日志里放了 ERROR 的输出信息,这就是我们说的高级别的日志会写入到低级别中,而且是每个低级别。
还有一个常用的日志输出语句,即自定义日志类型 VLOG。VLOG 的用法也很简单,像这样 VLOG(50) << "MY VLOG INFO";。这里的 50 只是自己定义的一个级别,事实上你可以定义任何一个数字,但一般越小的数字代表这条输出日志越重要。通过命令行参数 -v 50 这样子来指定 VLOG 输出的级别,-v 50 意味着只有小于 50 以下的 VLOG 才会被输出(这里不会影响 LOG(INFO)这些)。一般项目里越底层的库使用越大数字的 VLOG 来打印调试信息,这样可以使得日志不会被一堆底层库的运行信息淹没。
再看个例子:
#include <glog/logging.h>
int main(int argc,char* argv[]){    google::InitGoogleLogging(argv[0]);    google::ParseCommandLineFlags(&argc, &argv, true);    LOG(INFO) << "Hello, GOOGLE!";    VLOG(100) << "VLOG INFO 100";    VLOG(50) << "VLOG INFO 50";    VLOG(10) << "VLOG INFO 10";    return 0;}123456789101112这里我们有三条 VLOG 信息,分别是 100 50 10 三个级别。VLOG 的信息只会出现在 INFO 级别的日志中:
glog g++ glog_test3.cpp -lglog -lgflags -lpthread -o glog_testglog ./glog_test -log_dir=./log -v 50glog cat log/glog_test.INFO123我们可以看到,指定了 -v 50 后,只有小于等于 50 的 VLOG 及正常 LOG(INFO) 信息被打印出来。如果你问如果不指定会怎样,回答就是一条 VLOG 信息都不会出现。
2.3进阶版如果你以为这里还有进阶版介绍的话,我只能向你表示抱歉。我的使用只是简单级别,目前项目也没有必要更复杂的 glog 接口。
当然,我们也可以像其他博客把 glog 的功能全列出来:
参数设置,以命令行参数的方式设置标志参数来控制日志记录行为严重性分级,根据日志严重性分级记录日志可有条件地记录日志信息条件中止程序。丰富的条件判定宏,可预设程序终止条件异常信号处理。程序异常情况,可自定义异常处理过程支持debug功能。可只用于debug模式自定义日志信息线程安全日志记录方式系统级日志记录google perror风格日志信息精简日志字符串信息--------------------- 作者:DinnerHowe 来源:CSDN 原文:https://blog.csdn.net/dinnerhowe/article/details/79911728 版权声明:本文为博主原创文章,转载请附上博文链接!

百度Apollo解析——2.log系统的更多相关文章

  1. 百度Apollo解析——3.common

    1.略读 该目录下主要提供了各个模块公用的函数和class以及一些数学API还有公共的宏定义. 在Apollo 1.0中,common是整个框架的基础.configs是配置文件加载.adapters是 ...

  2. 百度Apollo解析——1.总介绍

    1. 概括 Apollo源码主要是c++实现的,也有少量python,主要程序在apollo/modules目录中,共18个包,功能包17个: 其中每个模块的作用如下: apollo/modules/ ...

  3. 百度Apollo解析——0.使用VSCode编译Apollo项目

    1.安装微软Visual Studio Code 1.1 方法一 开始之前,首先需要安装Ubuntu Make.虽然Ubuntu Make存在Ubuntu15.04官方库中,但是需要Ubuntu Ma ...

  4. 别用symbolicatecrash来解析crash Log了

    今天突然发现了一个解析iOS crash log的好方法,忍不住来分享一下. 相信每个做iOS开发的TX都应该不会对symbolicatecrash陌生,我们第一次遇到真机上产生的崩溃日志时,在网上搜 ...

  5. 百度Apollo搭建步骤(待更新)

    百度Apollo搭建步骤 ##一.安装ubuntu16.04 无需多说,安装完成打开命令行. ##二.下载Apollo镜像 git clone https://github.com/ApolloAut ...

  6. 百度Apollo安装说明

    前言:最近在和百度Apollo合作,Apollo的人很nice,大家都在全力帮助我们解决问题.但Apollo系统有点难搞,安装起来很费劲,为了避免再次踩坑,留下笔记,流传后人,O(∩_∩)O. 1. ...

  7. 三维重建:GitHub百度Apollo 2.0

    GitHub:https://github.com/ApolloAuto/apollo 1. 关于Apollo的数据:Apollo的数据会如何开放? 自动驾驶数据将包括具有高分辨率图像和像素级别标注的 ...

  8. log4j:ERROR setFile(null,true) call failed.java.io.FileNotFoundException: ..\logs\2010-1-19.log (系统找不到指定的路径。)

    log4j:ERROR setFile(null,true) call failed.java.io.FileNotFoundException: ..\logs\2010-1-19.log (系统找 ...

  9. 百度Apollo无人驾驶入门课程下载

    本文提供 百度Apollo官网的无人驾驶入门课程下载,主要为视频文件. 视频数量:101个:文件格式:MP4:视频总时长:2小时40分钟:文件总大小:约1.13GB: 马上下载 关注公众号罗孚传说(R ...

随机推荐

  1. hdu5692 dfs序线段树

    这是补的知识点,按先序遍历的顺序建立dfs序,用左右两个值代表整个区间,因为dfs序最重要的特点就是子树的区间是连续的 建立线段树时,需要用重新标过的 下标来建立 #pragma comment(li ...

  2. Sublime2 + SASS + Koala 测试

    Sublime SASS语法高亮插件下载地址:https://github.com/kuroir/SCSS.tmbundle/zipball/SublimeText2 koala_2.0.4_setu ...

  3. IE跨Iframe时Session丢失问题

    例如IIS下,可以打开IIS窗口——〉选择一个网站——〉属性——〉http头,增加一个http头 然后输入头名:P3P 输入头内容:CP=CAO PSA OUR 点评:与上一个方法类似,此方法也要求第 ...

  4. C/C++ 字符串与数字相互转换

    一.利用stringstream类 1. 字符串到整数     stringstream sstr(str);     int x;     sstr >> x;(即从sstr中提取数据) ...

  5. C++结构体成员列表初始化

    C++关于struct和class的区别,可以看上一篇文章:c ++ class和struct[转] 结构体成员列表初始化,来个例子: #include <iostream> #inclu ...

  6. MySQL相关日志介绍

    1.MySQL中主要日志如下: ① 错误日志(Log Error) ② 查询日志(Query Log) ③ 二进制日志(Binary Log) 2.相关日志的作用: 1) 错误日志(Error Log ...

  7. Redis底层探秘(一):简单动态字符串(SDS)

    redis是我们使用非常多的一种缓存技术,他的性能极高,读的速度是110000次/s,写的速度是81000次/s.这么高的性能背后,到底是怎么样的实现在支撑,这个系列的文章,我们一起去看看. redi ...

  8. LeetCode 688. Knight Probability in Chessboard

    原题链接在这里:https://leetcode.com/problems/knight-probability-in-chessboard/description/ 题目: On an NxN ch ...

  9. facebook注册不了无法打开官网的解决办法

    上周有一个朋友问到我一个问题,问怎么facebook注册不了,facebook官网也无法打开?这个问题不知道有没有人遇到过,以前这个问题也困扰了我挺长时间的,其实想想也挺简单的,由于facebook, ...

  10. Windows Server 2008 修改系统的SID

    故事背景:用VMware搭建了几个操作系统相同的虚拟机.安装成功一台后,直接拷贝已经生成的VMDK文件来构建其它的虚拟机. 一般情况下,如果复制的各个虚拟机只是单独使用,并且这些虚拟机不加入到域(Ac ...