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

附件是VS2010的工程,C++日志类,谷歌的东西,很好用,也很强大哦! glog简介 Google glog是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,例: LOG(INFO) << "Found " << num_cookies << " cookies"; “LOG”宏为日志输出关键字,“INFO”为严重性程度。 主要支持功能: 1, 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为; 2, 严重性分级,根据日志严重性分级记录日志; 3, 可有条件地记录日志信息; 4, 条件中止程序。丰富的条件判定宏,可预设程序终止条件; 5, 异常信号处理。程序异常情况,可自定义异常处理过程; 6, 支持debug功能。可只用于debug模式; 7, 自定义日志信息; 8, 线程安全日志记录方式; 9, 系统级日志记录; 10, google perror风格日志信息; 11, 精简日志字符串信息。 开源代码托管 开源代码地址:https://github.com/google/glog 其实官方开源代码已经有大量demo可以参考了,也提供了VS可以直接打开编译的项目。 如何使用 1:把glog文件夹拷贝到源代码目录 2:在工程设置中添加附加包含目录(glog\include;)和附加库目录(glog\lib;),在附件依赖项中添加对应lib文件,一一对应关系如下: MDd libglog32MDd.lib MD libglog32MD.lib MTd libglog32MTd.lib MT libglog32MT.lib 建议使用MDd和MD方式,带上对应的dll(在glog\bin目录,需要时拷贝到bin文件输出目录)可以避免使用MTd,MT引起的内存泄露是值得的。 #include #include using namespace std; //包含glog头文件,建议放在stdafx.h中 //#define GOOGLE_GLOG_DLL_DECL // 使用静态库的时候用这个,不过我测试静态库有内存泄露,所以不推荐使用静态库 #define GLOG_NO_ABBREVIATED_SEVERITIES #include "glog/logging.h" //获取当前程序的运行目录 string GetAppPathA() { char szExePath[MAX_PATH] = {0}; GetModuleFileNameA(NULL,szExePath,MAX_PATH); char *pstr = strrchr(szExePath,'\\'); memset(pstr+1,0,1); string strAppPath(szExePath); return strAppPath; } void main() { //glog初始化 google::InitGoogleLogging("重签程序"); string strLogPath = GetAppPathA().append("LogInfo\\"); CreateDirectoryA(strLogPath.c_str(),NULL); google::SetLogDestination(google::GLOG_INFO,strLogPath.c_str()); //功能测试 LOG(INFO)<<"log start...";//普通日志 LOG(WARNING)<<"Warning log";//警告日志 LOG(ERROR)<<"Error log";//错误日志 int i = 4; LOG_IF(INFO,i == 4)<<"Log if Test"; //以上就是我常用的几个日志函数了,当然还有很多更加强大的日志相关函数,大家如有有兴趣,可以参照官方给的示例使用, //开源代码地址:https://github.com/google/glog MessageBoxA(NULL,"Test Over",":)",MB_ICONINFORMATION); } 测试程序中,我使用的动态链接库方式。(Debug模式中代码生成为MDd,Release为MD)。lib是截止现在2015-11-04-21:35是最新的。采用VS2010编译,MTd,MT,MDd,MD方式编译在测试项目中都有提供。 博文地址: http://blog.youkuaiyun.com/sunflover454/article/details/49643625
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奇树谦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值