參考:
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::stringstd::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] " << msgint 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庫的源碼,也不會引入新的日志等級值導致程序崩潰。