《Linux C++项目必备》glog日志管理

2023-11-04

一、简介

Google Glog 是一个C++语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种助手宏。

二、下载

git clone https://github.com/google/glog.git
cd glog
./autogen.sh
./configure  --prefix=path(install)
make
make install

三、glog用法

1、级别

enum SeverityLevel
{
    INFO,
    WARNING,
    ERROR,
    FATAL
};

2、日志输出:

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

3、条件输出

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 次都输出日志,然后不再输出

4、常用函数

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

5、常用参数设置

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;//设置是否在磁盘已满时避免日志记录到磁盘

三、例子

main.cpp

#include "gloghelper.h"
using namespace std;

int main()
{
    GLogHelper loghelper;
    loghelper.InitLogger();
    LOG(ERROR)<<"log test";

    return 0;

}


 gloghelper.cpp

#include "gloghelper.h"


void CoreDumped(const char *data, int size)
{
    std::string str = std::string(data,size);
    LOG(ERROR)<<str;
}


GLogHelper::GLogHelper()
{

}

GLogHelper::~GLogHelper()
{
    google::ShutdownGoogleLogging();
}

/**
 * @brief:
 * @param: const char *program --程序名称
 * @param: uint32_t log_level  --需要输出到日志等级包括:(INFO、WARNING、ERROR)
 * @param: const char *log_dir --存放日志到目录
 * @return: void
 * @date:   
 * @autor:  
 */
void GLogHelper::InitLogger(const char *program, const uint32_t log_level, const char* log_dir)
{
    if(access(log_dir,F_OK))
    {
        mkdir(log_dir,S_IRWXU | S_IRWXG | S_IXOTH);
    }
    //初始化应用进程名
    google::InitGoogleLogging(program);

    char info_path[100];
    char warning_path[100];
    char error_path[100];

    snprintf(info_path,sizeof(info_path),"%s%s",log_dir,"/INFO_");
    snprintf(warning_path,sizeof(warning_path),"%s%s",log_dir,"/WARNING_");
    snprintf(error_path,sizeof(error_path),"%s%s",log_dir,"/ERROR_");

    //取消默认链接文件(链接文件为最新到日志输出)
    google::SetLogSymlink(google::GLOG_INFO,"");
    google::SetLogSymlink(google::GLOG_WARNING,"");
    //google::SetLogSymlink(google::GLOG_ERROR,"");
    //google::SetLogSymlink(google::GLOG_FATAL,"");
    
    //将段错误详细信息输出到日志文件
    google::InstallFailureSignalHandler();
    google::InstallFailureWriter(CoreDumped);

    //是否将日志输出到标准错误而不是日志文件
    FLAGS_logtostderr = false;
    //是否同时将日志发送到标准错误和日志文件中
    FLAGS_alsologtostderr = false;
    //当日志级别大于此级别时,自动将此日志输出到标准错误中
    FLAGS_stderrthreshold = google::WARNING;
    //当日志级别大于此级别时会马上输出,而不缓存
    FLAGS_logbuflevel = google::ERROR;
    //实时刷新日志到硬盘,默认是会缓存
    FLAGS_logbufsecs = 0;
    //日志大小大于30M时,创建新到日志
    FLAGS_max_log_size = 30;
    //当磁盘满时,停止输出日志文件
    FLAGS_stop_logging_if_full_disk = true;

    //如果未指定日志输出等级,glog不会输出日志
    //设置错误级别大于等于多少时输出到文件
    //参数2为日志存放到目录和日志文件前缀
    if(log_level == google::GLOG_INFO)
    {

        google::SetLogDestination(google::INFO,info_path);
    }
    else if(log_level == google::GLOG_WARNING)
    {
        google::SetLogDestination(google::GLOG_WARNING,warning_path);
    }
    else if(log_level == google::GLOG_ERROR)
    {
        google::SetLogDestination(google::ERROR,error_path);
    }
    else
    {
        google::ShutdownGoogleLogging();
    }
}

 gloghelper.h

#ifndef GLOGHELPER_H
#define GLOGHELPER_H
#include<glog/logging.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <time.h>

enum SeverityLevel
{
    INFO,
    WARNING,
    ERROR,
    FATAL
};

class GLogHelper
{
public:
    GLogHelper();
    ~GLogHelper();

    /**
     * @brief:
     * @param: const char *program --程序名称
     * @param: uint32_t log_level  --需要输出到日志等级包括:(INFO、WARNING、ERROR)
     * @param: const char *log_dir --存放日志到目录
     * @return: void
     * @date:  
     * @autor:  
     */
    void InitLogger(const char* program="ARHUD", const uint32_t log_level = google::ERROR, const char* log_dir="log");



private:


};


#endif // GLOGHELPER_H

makefile

CXX = g++ #编译工具
SOURCES = *.cpp #资源文件
OBJECTS = $(SOURCES:.cpp=.o)#目标文件 
TARGET = app #可执行文件 
LIBS += -lglog -lpthread #glog库
$(TARGET):$(OBJECTS)  
	$(CXX) -o $(TARGET) $(OBJECTS) $(LIBS) 
$(OBJECTS):$(SOURCES)  
	$(CXX) -c $(SOURCES) $(INCLUDE) 
 
# 编译规则 $@代表目标文件 $< 代表第一个依赖文件  
%.o:%.cpp  
	$(CXX) -o $@ -c $<  
#清除编译过程中产生的文件
clean:  
	$(RM) $(OBJECTS) $(TARGET) 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Linux C++项目必备》glog日志管理 的相关文章

  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • GCC 详细模式输出解释

    我是 Linux 新手 谁能向我解释一下我的 hello world 程序的以下详细模式输出 另外 这些文件是做什么用的crt1 o crti o crtend o crtbegin o and crtn o and lc and lgcc
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • PHP mail() 函数不发送邮件

    我有一个小问题 我正在使用一个工作脚本 在我的测试帐户 共享服务器上工作 使用 mail 函数通过 PHP 发送邮件 我刚刚得到了一个专用服务器 但我还无法让该功能发挥作用 在过去的 10 个小时左右的时间里 我阅读了有关 BIND 用于
  • gpg:抱歉,根本没有请求终端 - 无法获取输入

    解密时出现以下错误 eyaml decrypt s ENC and the key goes on here gnupg quiet no secmem warning no permission warning no tty yes de
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015

随机推荐

  • linux搭建geth私有节点

    linux创建节点 下载文件并上传服务器解压 Downloads Go Ethereum tar zxvf geth linux amd64 1 10 11 7231b3ef tar gz mv geth linux amd64 1 10
  • 2022年智能机器人与系统国际研讨会(ISoIRS 2022)

    2022年智能机器人与系统国际研讨会 ISoIRS 2022 重要信息 会议网址 www isoirs org 会议时间 2022年10月14 16日 召开地点 中国成都 截稿时间 2022年8月30日 录用通知 投稿后2周内 出版社 IO
  • C/C++时间戳转换函数

    目录 生成时间戳 time函数 函数原型 获取当前时间戳 转换时间戳为北京时间
  • 基于springboot+vue前后端分离的小区物业管理系统

    小区物业管理系统 简介 这是一个 SpringBoot Vue 的前后端分离小区物业管理系统 前端使用了若依的后台管理模板 使用 ElementUI 作为 UI 组件 使用 Vue Router 来进行路由跳转 使用 Vuex 来存储状态信
  • WPF自定义控件CustomControl中依赖属性、命令的使用

    Generic xaml中的UI代码
  • Redis中key的操作命令

    文章目录 Redis中key的操作命令 1 keys 查找所有符合模式pattern的key 2 exists 判断key是否存在于数据库中 3 move 移动指定的key到指定的数据库实例 4 ttl 查看key的剩余生存时间 5 exp
  • CoreML 的 C++部署 [2] 模型类抽象

    接上一篇 CoreML 的 C 部署 1 模型转换和预处理 再解决了预处理的问题后 部署部署还剩下模型类的抽象 主要包括初始化 推理以及获取输出 模型类的抽象 什么是模型类 可以参考 CoreML模型分析 我们是以MobileNetV2 m
  • 【Cinemachine】VirtualCamera虚拟相机详解(一)

    摘要 VirtualCamera虚拟相机是Cinemachine系统中的核心组成部分 咱们一起来看看虚拟相机是怎么用的吧 你好 我是跟着大智学Unity的萌新 我叫小新 这是我本周的学习总结报告哦 虚拟相机 Cinemachine中的Vir
  • 《数据仓库与数据挖掘》期末复习总结

    数据仓库与数据挖掘 期末复习总结 适用教材 数据挖掘概念与技术 第3版 Jiawei Han Mieheline Kamber Jian Pei著 机械工业出版社 提示 与教材内容不完全匹配 有所取舍 写在前面 这份复习总结是笔者根据老师授
  • 数据库期末复习(SQLserver)

    数据库期末复习 填空 1 数据库技术经历了 人工处理 文件系统 数据库系统 三个阶段 2 SQL语言集 数据定义 数据查询 数据 操纵 数据控制 功能于一体 3 E R图的主要元素是 实体型 属性 联系 4 关系系统的完整性控制包括 实体完
  • scrapy DNS lookup failed: no results for hostname lookup

    版权声明 更多最新原创文章请访问 最新原创主页 更多最全原创文章请访问 更多原创主页 DNS lookup failed 问题 第一天还可以正常跑起来的代码 第二天就跑不起来了 scrapy 中 解决方法
  • C语言第二节 分支结构

    1 BOOL数据类型 BOOL数据类型是一种表示非真即假的数据类型 只有 YES和 NO两种情况 YES 1 代表真 NO 0 代表假 BOOL数据类型的变量可以用来接收表达式的返回值 只要返回非0 那么BOOL类型的变量的值就为YES B
  • hdu 1078 FatMouse and Cheese

    Problem acm hdu edu cn showproblem php pid 1078 题意 n n 个洞 每个洞都放有 0 100 个芝士块 老鼠从 0 0 出发 每次都能横着或竖着走最多 k 格 且要走到芝士块数比当前洞多的洞里
  • 支付宝拿技术开刀把扫码无情地革掉

    随着互联网和数据的积累 计算机算力的跃升和算法的优化 人工智能正在让生活变得更加便捷 二维码扫码支付横空出世没多久 我们刚刚习惯扔掉现金的后现代生活 支付宝却突然宣布刷脸支付将全面接管扫码支付 又一次 支付宝拿自己较得心应手的技术开刀 把自
  • AOP功能代码实例---Spring源码从入门到精通(十七)

    上篇文章主要介绍了 Profile注解 可以对不同的开发环境 test dev 选择性加载不同的组件 如果用AnnocationConfigApplicationContext 需要用无参构造函数 先自己getEnviroment 设置指定
  • Unity_Raycasters

    Raycasters The Event System needs a method for detecting where current input events need to be sent to and this is provi
  • Atlantis 【POJ - 1151】【扫描线模板讲解】

    题目链接 是第二次写这道题了 但是也加深了我对扫描线的印象了 具体什么是扫描线 我们就如是讲讲吧 扫描线就是为了方便处理有重的区间面积的方式 我们通过线段树的方式去优化它 可以做到更少的时间复杂度 对于一个二维平面 我们用一个平行于Y轴的线
  • conda遇到的问题

    在使用conda安装python时 使用conda install python 3 6 0出现以下错误 Solving environment failed CondaHTTPError HTTP 000 CONNECTION FAILE
  • cpp基础:对象和类

    1 类名首字母大写 Wakawaka 2 类接口 编写类的人提供的一个操作类成员的方法 3 通过关键字实现类成员的访问控制 4 封装 将实现细节和抽象分开被称为封装 如 h和 cpp文件分开 接口是实现封装的重要一环 5 默认访问权限pri
  • 《Linux C++项目必备》glog日志管理

    一 简介 Google Glog 是一个C 语言的应用级日志记录框架 提供了 C 风格的流操作和各种助手宏 二 下载 git clone https github com google glog git cd glog autogen sh