0


C++开源库glog使用封装--自定义日志输出格式,设置日志保留时间

glog下载和编译

  • glog开源地址

https://github.com/google/glog

  • glog静态库编译
cd /home/wangz/3rdParty/hldglog/glog

mkdir out 
mkdir build &&cd build

cmake ..-DCMAKE_INSTALL_PREFIX=../out -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF

本文选择的glog版本为glog-0.7.0

Hldglog类封装

#ifndefHLD_GLOG_H#defineHLD_GLOG_H#defineGLOG_USE_GLOG_EXPORT#include<glog/logging.h>#defineHLD_LOG_INFOLOG(INFO)#defineHLD_LOG_WARNINGLOG(WARNING)#defineHLD_LOG_ERRORLOG(ERROR)// #define LOG_FATAL LOG(FATAL) FATAL消息会终止程序(在记录消息之后),禁用classHldglog{public:static Hldglog *InitGlog(constchar*argv, std::string logPath);private:Hldglog()=default;virtual~Hldglog();Hldglog(const Hldglog &)=delete;
    Hldglog &operator=(const Hldglog &)=delete;Hldglog(Hldglog &&)=delete;
    Hldglog &operator=(Hldglog &&)=delete;private:staticvoidCustomePrefixFormatter(std::ostream &s,const google::LogMessage &m,void*data);private:static std::string m_FilePath;static Hldglog *m_instance;};#endif

#include"hldglog.h"#include<iostream>#include<chrono>#include<iomanip>#include<ctime>#include<functional>usingnamespace std::chrono_literals;

std::string Hldglog::m_FilePath ="./log";
Hldglog *Hldglog::m_instance =nullptr;Hldglog::~Hldglog(){
    google::ShutdownGoogleLogging();}

Hldglog *Hldglog::InitGlog(constchar*argv, std::string logPath){if(m_instance ==nullptr){if(logPath.empty()){
            Hldglog::m_FilePath ="./log";}else{
            Hldglog::m_FilePath = logPath;}

        google::InitGoogleLogging(argv);// 初始化谷歌的日志库// 自定义日志格式
        google::InstallPrefixFormatter(Hldglog::CustomePrefixFormatter,nullptr);

        FLAGS_log_dir = Hldglog::m_FilePath;// 设置日志文件存放的目录
        FLAGS_minloglevel =0;// 设置日志抑制级别
        FLAGS_stderrthreshold = google::GLOG_INFO;// 设置日志记录到文件的级别
        FLAGS_alsologtostderr =true;// 错误信息同时输出到终端和文件
        FLAGS_colorlogtostderr =true;// 设置输出到屏幕的日志显示相应颜色
        FLAGS_max_log_size =2;// 最大日志大小(单位为MB)
        FLAGS_logbufsecs =0;// 缓冲日志输出,默认为30秒,此处改为立即输出(日志实时输出)
        FLAGS_stop_logging_if_full_disk =true;// 当磁盘被写满时,停止日志输出
        FLAGS_timestamp_in_logfile_name =false;// 日志文件名取消时间戳// 获取当前日期
        time_t now =time(nullptr);structtm*local_time =localtime(&now);// 从tm结构体中获取年、月、日int year = local_time->tm_year +1900;// tm_year是以1900年为基的int month = local_time->tm_mon +1;// tm_mon是以0为1月的int day = local_time->tm_mday;// tm_mday是月份中的哪一天

        std::stringstream ss;
        ss << year <<"-"<< month <<"-"<< day;
        std::string current_date = ss.str();

        std::string info_log_path = Hldglog::m_FilePath +"/INFO_"+ current_date;
        std::string warn_log_path = Hldglog::m_FilePath +"/WARNING_"+ current_date;
        std::string error_log_path = Hldglog::m_FilePath +"/ERROR_"+ current_date;

        google::SetLogDestination(google::GLOG_INFO, info_log_path.c_str());// 设置google::GLOG_INFO级别的日志存储路径和文件名前缀
        google::SetLogDestination(google::GLOG_WARNING, warn_log_path.c_str());// 设置google::GLOG_WARNING级别的日志存储路径和文件名前缀
        google::SetLogDestination(google::GLOG_ERROR, error_log_path.c_str());// 设置google::GLOG_ERROR级别的日志存储路径和文件名前缀

        google::SetLogFilenameExtension(".log");// 设置日志文件的扩展名
        google::EnableLogCleaner(24h *7);// 自动删除旧的日志,设置期限为7天

        m_instance =newHldglog();}return m_instance;}voidHldglog::CustomePrefixFormatter(std::ostream &s,const google::LogMessage &m,void*data){// [L thread_id] yyyymmdd hh:mm:ss.uuuuuu [file:line]// msg...// google::GetLogSeverityName(m.severity())[0] 获取日志级别

    s <<"["<< google::GetLogSeverityName(m.severity())[0]<<' '<< m.thread_id()<<"]"<<' '<< std::setw(4)<<1900+ m.time().year()<<"-"<< std::setw(2)<<1+ m.time().month()<<"-"<< std::setw(2)<< m.time().day()<<' '<< std::setw(2)<< m.time().hour()<<':'<< std::setw(2)<< m.time().min()<<':'<< std::setw(2)<< m.time().sec()<<"."<< std::setw(6)<< m.time().usec()<<' '<<"["<< m.basename()<<':'<< m.line()<<"]"<<"\n";}
  • 使用方法
#include<iostream>#include"hldglog.h"#include<unistd.h>usingnamespace std;intmain(int argc,char*argv[]){Hldglog::InitGlog(argv[0],"./log");

    HLD_LOG_INFO <<"HLD_LOG_INFO";
    HLD_LOG_WARNING <<"HLD_LOG_WARNING";
    HLD_LOG_ERROR <<"HLD_LOG_ERROR";while(true){sleep(10);}return0;}
  • 该类设置日志保留的时间为7天
  • 该类的日志输出格式: [L thread_id] yyyymmdd hh:mm:ss.uuuuuu [file:line] msg…
  • 效果展示

在这里插入图片描述

  • 日志文件的格式
  1. INFO_日期.log
  2. WARNING_日期.log
  3. ERROR_日期.log
std::string info_log_path = Hldglog::m_FilePath +"/INFO_"+ current_date;
std::string warn_log_path = Hldglog::m_FilePath +"/WARNING_"+ current_date;
std::string error_log_path = Hldglog::m_FilePath +"/ERROR_"+ current_date;

google::SetLogDestination(google::GLOG_INFO, info_log_path.c_str());// 设置google::GLOG_INFO级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_WARNING, warn_log_path.c_str());// 设置google::GLOG_WARNING级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_ERROR, error_log_path.c_str());// 设置google::GLOG_ERROR级别的日志存储路径和文件名前缀

这样设计的好处:确保了当应用程序在同一日内多次启动时,不会生成多个日志文件,从而有效避免了日志分散的问题,保持日志的连续性和管理的便捷性

标签: c++ 开发语言 glog

本文转载自: https://blog.csdn.net/Love_XiaoQinEr/article/details/138964966
版权归原作者 晓琴儿 所有, 如有侵权,请联系我们删除。

“C++开源库glog使用封装--自定义日志输出格式,设置日志保留时间”的评论:

还没有评论