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类封装

#ifndef HLD_GLOG_H
#define HLD_GLOG_H

#define GLOG_USE_GLOG_EXPORT
#include <glog/logging.h>

#define HLD_LOG_INFO LOG(INFO)
#define HLD_LOG_WARNING LOG(WARNING)
#define HLD_LOG_ERROR LOG(ERROR)
// #define LOG_FATAL LOG(FATAL) FATAL消息会终止程序(在记录消息之后),禁用

class Hldglog
{
public:
    static Hldglog *InitGlog(const char *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:
    static void CustomePrefixFormatter(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>

using namespace std::chrono_literals;

std::string Hldglog::m_FilePath = "./log";
Hldglog *Hldglog::m_instance = nullptr;

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

Hldglog *Hldglog::InitGlog(const char *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);
        struct tm *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 = new Hldglog();
    }

    return m_instance;
}

void Hldglog::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>

using namespace std;

int main(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);
    }

    return 0;
}
  • 该类设置日志保留的时间为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级别的日志存储路径和文件名前缀

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

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++程序中使用glog,需要按照以下步骤进行操作: 1. 下载glog并进行编译安装。 2. 在程序中引入glog头文件:`#include <glog/logging.h>` 3. 初始化glog,在main函数中调用:`google::InitGoogleLogging(argv[0]);` 4. 在程序需要记录日志的地方使用glog提供的宏进行记录。例如:`LOG(INFO) << "message";` 5. 可以使用不同的日志级别进行记录,如:`LOG(INFO)`、`LOG(WARNING)`、`LOG(ERROR)`、`LOG(FATAL)`等。 6. 可以通过设置`FLAGS_log_dir`变量,指定日志文件的存储路径。 7. 在程序结束前,可以调用`google::ShutdownGoogleLogging();`来停止glog日志记录。 下面是一个简单的例子: ```c++ #include <iostream> #include <glog/logging.h> int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]); LOG(INFO) << "Program start."; int a = 10, b = 0; if (b == 0) { LOG(ERROR) << "Division by zero!"; } else { LOG(INFO) << "a / b = " << a / b; } LOG(INFO) << "Program end."; google::ShutdownGoogleLogging(); return 0; } ``` 这段程序中,我们在程序开始和结束时记录了日志,同时在进行除法运算时,如果除数为0则记录了一个错误日志。执行程序后,会在控制台上输出日志信息: ``` I0714 16:22:10.187763 3221 main.cpp:7] Program start. E0714 16:22:10.187795 3221 main.cpp:12] Division by zero! I0714 16:22:10.187804 3221 main.cpp:14] Program end. ``` 同时会在默认路径下生成一个日志文件,记录了同样的日志信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓琴儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值