1.概括
GLog 是一個應用程序級的日志記錄的庫,它提供了基於C++樣式流和各種幫助程序宏的日志記錄API,你可以很簡單的將信息傳輸到LOG來記錄消息。
官方git https://github.com/google/glog
2. 四個等級
GLog允許你制定消息的嚴重程度,一共有四個級別:INFO, WARNING, ERROR, FATAL。記錄FATAL消息會終止程序(在記錄消息之后),在GLog記錄的消息的開頭以I, W, E, F來標示信息的嚴重級別;
enum SeverityLevel
{
google::INFO = 0,
google::WARNING = 1,
google::ERROR = 2,
google::FATAL = 3,
};
3.日志格式
默認情況下日志會寫入本地/tmp/文件夾中,文件名格式:
4.設置參數
google::SetLogDestination(google::GLOG_INFO, "log/prefix_"); //設置特定嚴重級別的日志的輸出目錄和前綴。第一個參數為日志級別,第二個參數表示輸出目錄及日志文件名前綴
google::SetLogFilenameExtension("logExtension"); //在日志文件名中級別后添加一個擴展名。適用於所有嚴重級別
google::SetStderrLogging(google::GLOG_INFO); //大於指定級別的日志都輸出到標准輸出
FLAGS_logtostderr = true; //設置日志消息是否轉到標准輸出而不是日志文件
FLAGS_alsologtostderr = true; //設置日志消息除了日志文件之外是否去標准輸出
FLAGS_colorlogtostderr = true; //設置記錄到標准輸出的顏色消息(如果終端支持)
FLAGS_log_prefix = true; //設置日志前綴是否應該添加到每行輸出
FLAGS_logbufsecs = 0; //設置可以緩沖日志的最大秒數,0指實時輸出
FLAGS_max_log_size = 10; //設置最大日志文件大小(以MB為單位)
FLAGS_stop_logging_if_full_disk = true; //設置是否在磁盤已滿時避免日志記錄到磁盤
FLAGS_log_dir = "./"; // 將日志文件輸出到本地
在實際項目環境使用中,參數也可以命令行傳入:
./main -alsologtostderr 1 -log_dir ../log -num ${TEST_NUM} -test_list ${TEST_LIST} -threads ${USE_THREAD}
這里的alsologtostderr和log_dir就是glog所需要的參數。
5.條件
這里在caffe源碼大量使用
#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2)
#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2)
#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2)
#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2)
#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2)
#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2)
例子
//有條件地中止程序
/ int a1 = 5;
CHECK(a1 == 4) << "a1 != 4,fail!"; //a1 != 4的時候輸出后面的打印,然后中止程序退出
int a2 = 3;
int a3 = 3;
CHECK_EQ(a2,a3)<<"not equal";//a2==a3的時候才繼續運行 當a2!=a3的時候輸出后面的打印退出中止運行
6.例子1
FLAGS_log_dir = "c:\\Logs";
google::InitGoogleLogging(argv[0]);
google::SetLogDestination(google::GLOG_INFO, "c:\\Logs\\INFO_");
google::SetStderrLogging(google::GLOG_INFO);
google::SetLogFilenameExtension("log_");
FLAGS_colorlogtostderr = true; // Set log color
FLAGS_logbufsecs = 0; // Set log output speed(s)
FLAGS_max_log_size = 1024; // Set max log file size
FLAGS_stop_logging_if_full_disk = true; // If disk is full
char str[20] = "hello log!";
LOG(INFO) << str;
CStringA cStr = "hello google!";
LOG(INFO) << cStr;
LOG(INFO) << "info test" << "hello log!"; //輸出一個Info日志
LOG(WARNING) << "warning test"; //輸出一個Warning日志
LOG(ERROR) << "error test"; //輸出一個Error日志
google::ShutdownGoogleLogging();
7.例子2
CMakeLists.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(test_glogs)
SET(CMAKE_BUILD_TYPE Debug)
#glog
include_directories(/data_2/lib/glog/include/)
link_directories(/data_2/lib/glog/lib)
add_executable(main main.cpp)
target_link_libraries(main glog)
set_property(TARGET main PROPERTY CXX_STANDARD 11)
main.cpp
#include <iostream>
#include <glog/logging.h>
int main(int argc, char** argv)
{
// FLAGS_logtostderr = 1; // 將使日志信息記錄到stderr而不保存到本地日志文件中,即使你設置了FLAGS_log_dir;
FLAGS_alsologtostderr = true; //除了日志文件之外是否需要標准輸出
google::SetLogDestination(google::GLOG_WARNING, "./log/log_warning_"); //設置 google::WARNING 級別的日志存儲路徑和文件名前綴
google::SetLogDestination(google::GLOG_INFO, "./log/log_info_"); //設置 google::INFO 級別的日志存儲路徑和文件名前綴
google::InitGoogleLogging("test_2022");//初始化
// google::SetLogDestination(google::GLOG_INFO,"./log/aTestInfo");//設置日志文件路徑,默認+時間作為生成的日志文件名
LOG(INFO) << "info test"; //輸出一個Info日志
//有條件地中止程序
// int a1 = 5;
// CHECK(a1 == 4) << "a1 != 4,fail!"; //a1 != 4的時候輸出后面的打印,然后中止程序退出
int a2 = 3;
int a3 = 3;
CHECK_EQ(a2,a3)<<"---==";//a2==a3的時候才繼續運行 當a2!=a3的時候輸出后面的打印退出中止運行
LOG(WARNING) << "warning test"; //輸出一個Warning日志
LOG(ERROR) << "error test"; //輸出一個Error日志
// LOG(FATAL) << "fatal test"; //輸出一個Fatal日志,這是最嚴重的日志並且輸出之后會中止程序
std::cout<<"-------end-----"<<std::endl;
return 0;
}
但是這里有個問題就是warning的單獨輸出了到一個日志文件中,
但是info的里面同時輸出了warning和info的信息。