C++|GLog开源库的使用 如何实现自定义类型消息日志
参考:
C++ glog使用教程与代码演示
C++第三方日志库Glog的安装与使用超详解
GLOG从入门到入门
glog 设置日志级别_glog C++版本代码分析
文章目录
- 日志等级
- 自定义消息创建
- 使用宏定义
日志等级
在 glog 中,日志的严重性是通过 LogSeverity 来区分的,glog 默认提供了 4 个等级:
- google::INFO (值为 0)
- google::WARNING (值为 1)
- google::ERROR (值为 2)
- 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库的源码,也不会引入新的日志等级值导致程序崩溃。