glog下載和編譯
- glog開源地址
https://github.com/google/glog
- glog靜態庫編譯
cd /home/wangz/3rdParty/hldglog/glogmkdir out
mkdir build && cd buildcmake .. -DCMAKE_INSTALL_PREFIX=../out -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
本文選擇的glog版本為glog-0.7.0 |
Hldglog類封裝
#ifndef HLD_GLOG_H
#define HLD_GLOG_H#define GLOG_USE_GLOG_EXPORT
#include <glog/logging.h>#define HLD_LOG_INFO LOG(INFO)
#define HLD_LOG_WARNING LOG(WARNING)
#define HLD_LOG_ERROR LOG(ERROR)
// #define LOG_FATAL LOG(FATAL) FATAL消息會終止程序(在記錄消息之后),禁用class Hldglog
{
public:static Hldglog *InitGlog(const char *argv, std::string logPath);private:Hldglog() = default;virtual ~Hldglog();Hldglog(const Hldglog &) = delete;Hldglog &operator=(const Hldglog &) = delete;Hldglog(Hldglog &&) = delete;Hldglog &operator=(Hldglog &&) = delete;private:static void CustomePrefixFormatter(std::ostream &s, const google::LogMessage &m, void *data);private:static std::string m_FilePath;static Hldglog *m_instance;
};#endif
#include "hldglog.h"
#include <iostream>
#include <chrono>
#include <iomanip>
#include <ctime>
#include <functional>using namespace std::chrono_literals;std::string Hldglog::m_FilePath = "./log";
Hldglog *Hldglog::m_instance = nullptr;Hldglog::~Hldglog()
{google::ShutdownGoogleLogging();
}Hldglog *Hldglog::InitGlog(const char *argv, std::string logPath)
{if (m_instance == nullptr){if (logPath.empty()){Hldglog::m_FilePath = "./log";}else{Hldglog::m_FilePath = logPath;}google::InitGoogleLogging(argv); // 初始化谷歌的日志庫// 自定義日志格式google::InstallPrefixFormatter(Hldglog::CustomePrefixFormatter, nullptr);FLAGS_log_dir = Hldglog::m_FilePath; // 設置日志文件存放的目錄FLAGS_minloglevel = 0; // 設置日志抑制級別FLAGS_stderrthreshold = google::GLOG_INFO; // 設置日志記錄到文件的級別FLAGS_alsologtostderr = true; // 錯誤信息同時輸出到終端和文件FLAGS_colorlogtostderr = true; // 設置輸出到屏幕的日志顯示相應顏色FLAGS_max_log_size = 2; // 最大日志大小(單位為MB)FLAGS_logbufsecs = 0; // 緩沖日志輸出,默認為30秒,此處改為立即輸出(日志實時輸出)FLAGS_stop_logging_if_full_disk = true; // 當磁盤被寫滿時,停止日志輸出FLAGS_timestamp_in_logfile_name = false; // 日志文件名取消時間戳// 獲取當前日期time_t now = time(nullptr);struct tm *local_time = localtime(&now);// 從tm結構體中獲取年、月、日int year = local_time->tm_year + 1900; // tm_year是以1900年為基的int month = local_time->tm_mon + 1; // tm_mon是以0為1月的int day = local_time->tm_mday; // tm_mday是月份中的哪一天std::stringstream ss;ss << year << "-" << month << "-" << day;std::string current_date = ss.str();std::string info_log_path = Hldglog::m_FilePath + "/INFO_" + current_date;std::string warn_log_path = Hldglog::m_FilePath + "/WARNING_" + current_date;std::string error_log_path = Hldglog::m_FilePath + "/ERROR_" + current_date;google::SetLogDestination(google::GLOG_INFO, info_log_path.c_str()); // 設置google::GLOG_INFO級別的日志存儲路徑和文件名前綴google::SetLogDestination(google::GLOG_WARNING, warn_log_path.c_str()); // 設置google::GLOG_WARNING級別的日志存儲路徑和文件名前綴google::SetLogDestination(google::GLOG_ERROR, error_log_path.c_str()); // 設置google::GLOG_ERROR級別的日志存儲路徑和文件名前綴google::SetLogFilenameExtension(".log"); // 設置日志文件的擴展名google::EnableLogCleaner(24h * 7); // 自動刪除舊的日志,設置期限為7天m_instance = new Hldglog();}return m_instance;
}void Hldglog::CustomePrefixFormatter(std::ostream &s, const google::LogMessage &m, void *data)
{// [L thread_id] yyyymmdd hh:mm:ss.uuuuuu [file:line]// msg...// google::GetLogSeverityName(m.severity())[0] 獲取日志級別s << "[" << google::GetLogSeverityName(m.severity())[0] << ' ' << m.thread_id() << "]"<< ' '<< std::setw(4) << 1900 + m.time().year() << "-"<< std::setw(2) << 1 + m.time().month() << "-"<< std::setw(2) << m.time().day()<< ' '<< std::setw(2) << m.time().hour() << ':'<< std::setw(2) << m.time().min() << ':'<< std::setw(2) << m.time().sec() << "."<< std::setw(6) << m.time().usec()<< ' '<< "[" << m.basename() << ':' << m.line() << "]"<< "\n";
}
- 使用方法
#include <iostream>
#include "hldglog.h"
#include <unistd.h>using namespace std;int main(int argc, char *argv[])
{Hldglog::InitGlog(argv[0], "./log");HLD_LOG_INFO << "HLD_LOG_INFO";HLD_LOG_WARNING << "HLD_LOG_WARNING";HLD_LOG_ERROR << "HLD_LOG_ERROR";while (true){sleep(10);}return 0;
}
-
該類設置日志保留的時間為7天
-
該類的日志輸出格式:
[L thread_id] yyyymmdd hh:mm:ss.uuuuuu [file:line]
msg…
-
效果展示
- 日志文件的格式
- INFO_日期.log
- WARNING_日期.log
- ERROR_日期.log
std::string info_log_path = Hldglog::m_FilePath + "/INFO_" + current_date;
std::string warn_log_path = Hldglog::m_FilePath + "/WARNING_" + current_date;
std::string error_log_path = Hldglog::m_FilePath + "/ERROR_" + current_date;google::SetLogDestination(google::GLOG_INFO, info_log_path.c_str()); // 設置google::GLOG_INFO級別的日志存儲路徑和文件名前綴
google::SetLogDestination(google::GLOG_WARNING, warn_log_path.c_str()); // 設置google::GLOG_WARNING級別的日志存儲路徑和文件名前綴
google::SetLogDestination(google::GLOG_ERROR, error_log_path.c_str()); // 設置google::GLOG_ERROR級別的日志存儲路徑和文件名前綴
這樣設計的好處:確保了當應用程序在同一日內多次啟動時,不會生成多個日志文件,從而有效避免了日志分散的問題,保持日志的連續性和管理的便捷性