【C++】google glog详解
0、简介
glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志。
源码下载:https://github.com/google/glog
ubuntu安装:
sudo apt-get install libgoogle-glog*
参考博客:
https://blog.csdn.net/jcjc918/article/details/51682853
https://www.cnblogs.com/hiloves/p/6009707.html
1、基础用法
头文件:
#include <glog/logging.h>
四个打印级别:
LOG(INFO) << "<INFO> Hello World!";
LOG(WARNING) << "<WARNING> Hello World!";
LOG(ERROR) << "<ERROR>Hello World!";
LOG(FATAL) << "<FATAL>Hello World!";
2、自定义日志,需要配合命令行参数 -v 和 -vmodule
VLOG(100) << "VLOG INFO 100";
3、glog 和 gflags 配合管理日志,命令行参数说明如下
1> 除了使用命令行参数外,可以在程序中使用 FLAGS_ 宏来指定如:
FLAGS_logbufsecs = 0; //日志实时输出
FLAGS_max_log_size=10; //最大日志文件大小 10M
2> 如果没有安装gflags,可以在环境变量中使用“GLOG_”前缀的宏代替
GLOG_logtostderr=1
3> 命令行参数列表
Flags from src/logging.cc:
-alsologtoemail (log messages go to these email addresses in addition to logfiles) type: string default: “”
除了日志文件外,日志消息还将传到这些电子邮件地址(测试无效???需要-logemaillevel,并安装mail(sudo apt-get install mailutils),并配置mail)
-alsologtostderr (log messages go to stderr in addition to logfiles) type: bool default: false
除日志文件外,日志消息还将被发送到stderr
-colorlogtostderr (color messages logged to stderr (if supported by terminal)) type: bool default: false
记录到stderr的彩色消息(如果终端支持)INFO白色、WARNING黄色、ERROR红色、FATAL红色
-drop_log_memory (Drop in-memory buffers of log contents. Logs can grow very quickly and they are rarely read before they need to be evicted from memory. Instead, drop them from memory as soon as they are flushed to disk.) type: bool default: true
删除日志内容的内存缓冲区。日志可以增长得非常快,并且在需要从内存中删除日志之前很少被读取。相反,一旦将它们刷新到磁盘,就将它们从内存中删除。
-log_backtrace_at (Emit a backtrace when logging at file:linenum.) type: string default: “”
在file:linenum上进行日志记录时发出回溯跟踪(不知道啥作用,跟gdb有关)
-log_dir (If specified, logfiles are written into this directory instead of the default logging directory.) type: string default: “”
如果指定,日志文件将写入该目录,默认目录"/tmp/...log...
Flags from src/utilities.cc:
-symbolize_stacktrace (Symbolize the stack trace in the tombstone) type: bool default: true
表示墓碑上的堆栈轨迹(未知???)
Flags from src/vlog_is_on.cc:
-v (Show all VLOG(m) messages for m <= this. Overridable by --vmodule.) type: int32 default: 0
使用VLOG(m)时,显示小于m的信息
-vmodule (per-module verbose level. Argument is a comma-separated list of =. is a glob pattern, matched against the filename base (that is, name ignoring .cc/.h./-inl.h). overrides any value given by --v.) type: string default: “”
详细级别。参数是一个以逗号分隔的列表,其中包含=。是一个glob模式,与文件名基础匹配(即忽略.cc/.h /-inl.h)。覆盖——v给出的任何值。
4、常用函数和宏
1> google::InitGoogleLogging(argv[0]);
2> google::ShutdownGoogleLogging(); 关闭
3> LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”; //当条件满足时输出日志
4> LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << “th cookie”; //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
5> LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << “th big cookie”; //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果是则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息
6> LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << “th cookie”; //当此语句执行的前 20 次都输出日志,然后不再输出
7> google::SetLogDestination(google::GLOG_INFO, “log/prefix_”); //设置特定严重级别的日志的输出目录和前缀。第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀
8> google::SetLogFilenameExtension(“logExtension”); //在日志文件名中级别后添加一个扩展名。适用于所有严重级别
9> google::SetStderrLogging(google::GLOG_INFO); //大于指定级别的日志都输出到标准输出
10> 调试宏,只有在调试模式下有效
DLOG(INFO) << “Found cookies”;
DLOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”;
DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << “th cookie”;
11> void InstallFailureSignalHandler(); //安装处理程序,当程序收到SIGSEGV、SIGILL、SIGFPE、SIGABRT、SIGBUS、SIGTERM信号而崩溃时,
默认情况下,信号处理程序将把故障(信号信息和堆栈)转储写入标准错误。可以通过InstallFailureWriter()安装自己的writer函数来定制目标。
如果希望对所有线程使用故障信号处理程序,则应该在创建线程之前调用该函数。堆栈跟踪将只显示接收信号的线程。换句话说,不会显示其他线程的堆栈跟踪。
5、检查宏CHECK*
1>条件检测
CHECK(condition) //测试条件condition是否正确
源码分析
#define CHECK(condition) LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) << "Check failed: " #condition " "
当检测的条件不成立是,执行 FATAL ( 致命的)级别的打印,并退出
#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2) // 检测 val1 是否等于 val2
#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2) // 检测 val1 是否不等于 val2
#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2) // 检测 val1 是否小于等于 val2
#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2) // 检测 val1 是否小于 val2
#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2) // 检测 val1 是否大于等于 val2
#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2) // 检测 val1 是否大于 val2CHECK_NOTNULL(val) //检测val是否不为空NULL
2> 字符串char*检测
#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2) //检测字符串 s1 和 s2 相同
#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2) //检测字符串 s1 和 s2 不相同
#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2) //检测字符串 s1 和 s2 相同,忽略大小写
#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2) //检测字符串 s1 和 s2 不相同,忽略大小写
3> 浮点数比较
#define CHECK_DOUBLE_EQ(val1, val2) // 检测浮点数 val1 和 val2 相等
#define CHECK_NEAR(val1, val2, margin) // 检测浮点数 val1 和 val2 相等,前后相差margin以内认为是相等的
源码分析
#define CHECK_DOUBLE_EQ(val1, val2) \do { \CHECK_LE((val1), (val2)+0.000000000000001L); \CHECK_GE((val1), (val2)-0.000000000000001L); \} while (0)#define CHECK_NEAR(val1, val2, margin) \do { \CHECK_LE((val1), (val2)+(margin)); \CHECK_GE((val1), (val2)-(margin)); \} while (0)
6、glog 的功能全列出来:
参数设置,以命令行参数的方式设置标志参数来控制日志记录行为
严重性分级,根据日志严重性分级记录日志
可有条件地记录日志信息
条件中止程序。丰富的条件判定宏,可预设程序终止条件
异常信号处理。程序异常情况,可自定义异常处理过程
支持debug功能。可只用于debug模式
自定义日志信息
线程安全日志记录方式
系统级日志记录
google perror风格日志信息
精简日志字符串信息
相关文章:

仿抖音注册界面制作
话说上次完成了仿抖音我的界面制作之后,今天抽空又把注册界面给做了,还是做了些小改动,将第三方登录去掉了 注册还是老规矩直接奉上psd源码:仿抖音注册界面psd源码 个人博客https://myml666.github.io

00后的AI开发者进阶之道:从入门到鏖战MIT编程大赛 | 人物志
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑作者 | 若名出品 | AI科技大本营(ID:rgznai100)当所有中国的高中生都在拼命为跨过高考这道窄门疲惫不堪时,美国的准高中毕业生们也开始申请大学&#x…

js的全部替换函数replaceAll
JS替换功能函数,用正则表达式解决,js的全部替换,学习js的朋友可以参考下。 alert("abacacf".replace(a,9)); alert("abacacf".replace(/a/g,9)); 第一个运行的结果 9bacaf 这个只是替换了第一个 第二个运行的结果 9b9c9f…
【C++】Google Protocol Buffer(protobuf)详解(一)
1、简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准, Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通…

python使用difflib对比文件示例
使用difflib模块对比文件内容1 示例:字符串差异对比 vim duibi.py#!/usr/bin/env python # -*- coding: utf-8 -*- import re import os import difflib tex1"""tex1: this is a test for difflib ,just try to get difference of the log 现在试试…

技术大佬们都推荐的vim学习指南来了,值得收藏!
「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑作者 | kbsc13,京东算法工程师,研究领域计算机视觉来源 | 机器学习与计算机视觉(ID:AI_Developer)编辑 | Jane【导语】在 Linux 下最常使用的文本编辑…

NoSQl分类
2019独角兽企业重金招聘Python工程师标准>>> http://nosql-database.org/ nosql简单分类 类型 部分代表 特点 列存储 hbase cassandra hypertable 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩&…

手撕代码之七大常用排序算法 | 附完整代码
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑0.导语本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法:直接插入排序冒泡排序选择排序快速排序希尔排序堆排序归并排序…

【C++】google gtest 详解
1、参考博客; https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 2、编译和安装 $ git clone https://github.com/google/googletest.git $ cd googletest $ mkdir mybuild $ cd mybui…

JS学习笔记之call、apply的用法
1、call和apply的区别 call和apply唯一的区别是传入参数的形式不同。 apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带下标的集合,可以是数组,也可以是类数组,apply方法会把集合中的元素…

实验LVS+keepalived
lvs说明:目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转…

Spark Streaming笔记整理(二):案例、SSC、数据源与自定义Receiver
[TOC] 实时WordCount案例 主要是监听网络端口中的数据,并实时进行wc的计算。 Java版 测试代码如下: package cn.xpleaf.bigdata.spark.java.streaming.p1;import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.spark.Spar…

复旦邱锡鹏教授公布《神经网络与深度学习》,中文免费下载 | 极客头条
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑整理 | Jane出品 | AI科技大本营优质的人工智能学习资源一直是大家非常关注的,以往我们也推荐过很多优秀的课程、书籍等,不过大多来自国外的名校、名师,…

【Qt】信号和槽传递自定义结构体
一、使用信号和槽传递自定义结构体 这是一个老问题了,但是每次使用都要bing,因此做个笔记整理下。 一共有三种方法,可以让结构体在信号和槽之间传递。前两种方法可以让结构体在线程之间传递,最后一种方法只能在同一线程中传递。 Q_DECLARE_METATYPE qRegisterMetaType(推…

Tomcat:Connection reset by peer: socket write error
Connection reset by peer: socket write error错误分析及解决 Connection reset by peer: socket write error错误分析: 常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是: ①:服务器的并发连接数超过…

人脸识别的“生意经”
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑作者 | Jeff John Roberts译者 | 孙薇责编 | 琥珀出品 | AI科技大本营(ID:rgznai100)导语:不经意间,科技公司便拿着你的照片,推…

【Qt】pro中使用DEFINES来实现条件编译
1、pro中使用DEFINES来实现条件编译 在Qt的pro文件中使用DEFINES 来实现类似gcc -D的条件编译功能。 如,在pro中: #定义条件编译宏LAOER DEFINES += LAOER #依赖编译宏LAOER的编译选项: contains(DEFINES, LAOER){message(hello Laoer) } #与编译宏LAOER冲突的编译选项: …

nodejs -- promise的返回
为什么80%的码农都做不了架构师?>>> [javascript] view plain copy const a async () > { return Sequelize.findAll({}) //这里返回一个promise,"aaaaa"也行 } const b async ()>{ const result await a…

SQL 将一列数据转为一行字符串[转]
比如:我用select department,userName from users从表中查询出如下数据department | userName--------------- --------------it it1it it2it it3ur ur1ur ur2我能不能用什么SQL对department进行分组然后变成如下的结果呢?department | userName--------…

【C++】C++11的enum class enum struct和enum
1、问题描述 在走读QtCreator中看到一段代码 在QtCreator-v4.9.2源码中 src\plugins\projectexplorer\projectnodes.h enum class NodeType : quint16 {File 1,Folder,VirtualFolder,Project };以前一直使用enum,这里使用的是enum class,新enum的好处…

浙大首届AI专业本科生将于9月入学,纳入竺院图灵班
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)近日,据澎湃新闻报道,浙江大学计算机科学与技术学院副院长、浙江大学人工智能研究所所长吴飞…
解决阿里云无法正常使用samba的问题【转】
转自:https://blog.csdn.net/u011949148/article/details/54311288 昨天在阿里云上申请了一个云服务器,系统用的是ubuntu14.04,由于是免费的(初次使用),配置较低(单核1G内存,40G硬盘…

Google又放大招:高效实时实现视频目标检测 | 技术头条
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑作者 | 陈泰红,算法工程师,研究方向为机器学习、图像处理来源 | 极市平台(ID:extrememart)图像目标检测是图像处理领域的基础。…

一个java删除文件夹的小方法
java删除文件夹都是从里向外删除,使用递归的方法。public class IO_FILEdemo09 {public static void main(String[] args) {// TODO Auto-generated method stub// 删除目录演示File dir new File("C:\\version1");DeleteAll(dir);}public static void D…

【C++】operator bool() 和 operator const bool() const
1、问题描述 在走读QtCreator源码时,看到如下运算符重载 源码在QtCreator-v4.9.2中 src\plugins\projectexplorer\projectexplorer.h class OpenProjectResult { public:OpenProjectResult(const QList<Project *> &projects, const QList<Project *…

tomcat高并发的配置
以下内容来源于互联网,具体出处不详 据说服务器运行TOMCATJDK环境能负载到动态1W的并发,贴上他的配置,以后有机会在测试! java 环境配置: export JAVA_OPTS"-server -Xms8g -Xmx8g -Xss128k -XX:ParallelGCThread…

【AI】图示:精确度(查准率)Precision、召回率(查全率)Recall
对Precision、Recall的直译是“精确度”和“召回率”,第一次接触这两个词,很难从字面上知道它们的含义。而翻译成“查准率”和“查全率”就比较好理解,下面统一使用“查准率”和“查全率”。 1、真假正负例 真正例(True Positive…

@程序员,如何“终身成长”与跨界?
文 / Ant说《终身成长》是一碗“鸡汤”并不为过,截止到我看过的前半部分,围绕在一个主题展开——人的潜力是不可知的。换句话说,任何人都有可能成为自己想成为的人。书中列举了大量明星企业与管理者的真实案例,也引用了许多对比实…

TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击。 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的。 限流可以控制本软件或者应用的流量大小,从而减少对部署在相同物理…

WPF及Silverlight中将DataGrid数据导出
这段源码是我在项目中实际应用的源码,没有经过删减及处理。 如果你认为有用可以摘去作为自己的导出类中的一个小工具使用。 ///<summary>///数据源导出辅助类 ///</summary>///<remarks>///Author: sucsy ///Create date: 2011-…