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

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库的源码,也不会引入新的日志等级值导致程序崩溃。

相关文章:

  • HCIA-AI人工智能笔记3:数据预处理
  • 编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化
  • 二项式分布(Binomial Distribution)
  • YOLO魔改之SAM空间注意力模块
  • 网络基础梳理
  • GAF-CNN-DBO-LSSVM故障诊断/分类预测(Matlab)
  • 【AI速读】30分钟搭建持续集成:用Jenkins拯救你的项目
  • Python 用户账户(让用户拥有自己的数据)
  • “大国品牌”建设全面启动,工业电商生态加速成型
  • 清华大学《DeepSeek从入门到精通》04
  • MacOS安装 nextcloud 的 Virtual File System
  • 使用 Docker 部署 mysql 应用
  • STM32八股【2】-----ARM架构
  • 安装PaddlePaddle2.6.2和PaddleSpeech1.4的CPU版本——基于Ubuntu22.04
  • uniapp中的路由、本地存储与网络请求
  • 经典笔试题 小于 n 的最大整数 贪心 回溯 剪枝 全排列
  • YOLO-UniOW: 高效通用开放世界目标检测模型【附论文与源码】
  • 用户说 | 零基础用通义灵码 AI 程序员开发个人笔记网站
  • Docker与K8S是什么该怎么选?
  • lvgl学习(三)之常用控件
  • 云南铁路:打造“铁路+金融+产业”融合发展生态
  • TCL科技一季度净利增超三倍,去年半导体显示业务营收创新高
  • 辽宁省委书记郝鹏、省长王新伟赶到辽阳火灾事故现场指导善后处置工作
  • 王毅会见泰国外长玛里:坚决有力打击电诈等跨境犯罪
  • 船只深夜撞上海上风机后沉没1死1失踪,调查报告公布
  • 葡萄牙总理:未来几小时内将全面恢复供电