当前位置: 首页 > article >正文

C++|GLog开源库的使用 如何实现自定义类型消息日志

参考:
C++ glog使用教程与代码演示
C++第三方日志库Glog的安装与使用超详解
GLOG从入门到入门
glog 设置日志级别_glog C++版本代码分析

文章目录

  • 日志等级
  • 自定义消息创建
    • 使用宏定义

日志等级

在 glog 中,日志的严重性是通过 LogSeverity 来区分的,glog 默认提供了 4 个等级:

  1. google::INFO (值为 0)
  2. google::WARNING (值为 1)
  3. google::ERROR (值为 2)
  4. google::FATAL (值为 3)

自定义消息创建

就20250121搜集到的资料来看glog目前不支持自定义等级消息等级,但是可以通过添加标识符,宏定义,重写glog中的send函数实现。

使用宏定义

可以定义一个宏来封装日志记录操作,同时在宏中添加特定的标签或前缀。
示例代码

#include <glog/logging.h>
#include <sstream>
#include <ctime> // For struct tm

#include "frontend/universal/add_dialog.h"

// 自定义日志接收器
class LogSink : public google::LogSink
{
public:
    LogSink(MessageBoxDialog *widget) : widget_(widget) {}

    void send(google::LogSeverity severity, const char *full_filename,
              const char *base_filename, int line,
              const struct ::tm *tm_time,
              const char *message, size_t message_len) override;

private:
    MessageBoxDialog *widget_;
};

void LogSink::send(google::LogSeverity severity, const char *full_filename, const char *base_filename, int line,
                   const ::tm *tm_time, const char *message, size_t message_len)
{
    // 将日志内容包装为 std::string
    std::string logMessage(message, message_len);

    // 使用 stringstream 获取日志消息内容
    std::stringstream ss;

    // 构造日志输出格式
    ss << "[" << base_filename << ":" << line << "] ";
    ss << "[" << std::put_time(tm_time, "%Y-%m-%d %H:%M:%S") << "] ";

    // 根据 severity 判断日志类型
    if (severity == google::GLOG_INFO)
    {
        ss << "[INFO] ";
    }
    else if (severity == google::GLOG_WARNING)
    {
        ss << "[WARNING] ";
    }
    else if (severity == google::GLOG_ERROR)
    {
        ss << "[ERROR] ";
    }
    else if (severity == google::GLOG_FATAL)
    {
        ss << "[FATAL] ";
    }

    // 检查日志消息中是否包含特定标签
    if (logMessage.find("[COMMUNICATION]") != std::string::npos)
    {
        ss << "[COMMUNICATION] ";
    }

    ss << logMessage;

    // 使用 Qt 的事件机制将日志更新请求发送到主线线
    QMetaObject::invokeMethod(widget_, "appendLog", Qt::QueuedConnection, Q_ARG(QString, QString::fromStdString(ss.str())));
}

// 定义一个宏来封装日志记录操作
#define LOG_COMMUNICATION_INFO(msg) LOG(INFO) << "[COMMUNICATION] " << msg

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MessageBoxDialog widget;
    widget.show();

    google::InitGoogleLogging(argv[0]);

    // 注册自定义日志接收器
    google::AddLogSink(new LogSink(&widget));

    // 使用自定义宏记录通信相关日志
    LOG_COMMUNICATION_INFO("This is a communication info message.");

    // 使用其他日志等级
    LOG(INFO) << "This is an info message.";
    LOG(WARNING) << "This is a warning message.";
    LOG(ERROR) << "This is an error message.";
    LOG(FATAL) << "This is a fatal message.";

    google::ShutdownGoogleLogging();

    return app.exec();
}

在这个示例中,我们定义了一个宏LOG_COMMUNICATION_INFO来封装日志记录操作,并在日志消息中添加了[COMMUNICATION]标签,从而实现对特定日志信息的区分。
总结
通过在日志消息中添加特定的标签或前缀,可以在不改变日志等级的情况下,实现对特定日志信息的区分。这种方法简单且有效,不需要修改glog库的源码,也不会引入新的日志等级值导致程序崩溃。


http://www.kler.cn/a/596850.html

相关文章:

  • 精益架构设计:深入理解与实践 C# 中的单一职责原则
  • QT网页显示的几种方法及对比
  • DeepSeek高校教程大合集(清华,北大,浙大,夏大,天大,湖大,天大,北师大),持续更新
  • 合成层优化
  • 2025新笔记:数字化转型建设的开源安全治理实践
  • 【贝叶斯定理(Bayesian Theorem)】
  • doris:FQDN
  • Flutter 快速接入Fair
  • Vagrant+VMWare 安装Ubuntu24.04
  • 烧结银技术赋能新能源汽车超级快充与高效驱动
  • C# 调用 VITS,推理模型 将文字转wav音频调试 -数字人分支
  • 电力和冷却管理:如何让数据中心“高效降温”同时节能增效
  • 第三十一篇 数据仓库(DW)与商业智能(BI)架构设计与实践指南
  • 3.22日竞蓝全扫盘
  • #include <hello.h> 与 #include “hello.h“的区别
  • RDMA栈架构
  • 并发和并行、同步和异步、进程和线程的关系
  • RK3568开发笔记-egtouch触摸屏ubuntu系统屏幕校准
  • postgresql 对 lz4 压缩算法的支持
  • 2维压缩感知SL0重构实现算法