【C++】spdlog光速入門,C++logger最簡單最快的庫( 二 )


sink的flush問題創建好sink后建議設置flush方式,否則可能無法立刻在file中看到logger的內容以下為兩種重要的flush方式設置(直接設置全局)
spdlog::flush_every(std::chrono::seconds(1));spdlog::flush_on(spdlog::level::debug);logger日志對象,每個logger內包含了一個vector用于存放sink,每個sink都是相互獨立因此一個日志對象在輸出日志時可以同時輸出到控制臺和文件等位置
使用默認logger如果整個項目中只需要一個logger,spdlog提供了最為便捷的默認logger,注意,該logger在全局公用,輸出到控制臺、多線程、彩色
//Use the default logger (stdout, multi-threaded, colored)spdlog::info("Hello, {}!", "World");創建特定的logger大部分情況下默認logger是不夠用的,因為我們可能需要做不同項目模塊各自的logger,可能需要logger輸出到文件進行持久化,所以創建logger是很重要的一件事 。好在創建logger也是非常簡單的!
方式一:直接創建與創建sink類似 , 我們可以非常便捷的創建logger由于大部分時候一個logger只會有一個sink,所以spdlog提供了創建logger的接口并封裝了創建sink的過程
auto console = spdlog::stdout_color_mt("some_unique_name");//一個輸出到控制臺的彩色多線程logger,可以指定名字auto file_logger = spdlog::rotating_logger_mt("file_logger", "logs/mylogfile", 1048576 * 5, 3);//一個輸出到指定文件的輪轉文件logger,后面的參數指定了文件的信息方式二:組合sinks方式創建有時候,單sink的logger不夠用,那么可以先創建sink的vector , 然后使用sinks_vector創建logger以下樣例中,首先創建了sink的vector,然后創建了兩個sink并放入vector,最后使用該vector創建了logger,其中 , set_level的過程不是必須的 , register_logger一般是必須的,否則只能在創建logger的地方使用該logger,關于register的問題可以往下看
std::vector<spdlog::sink_ptr> sinks;auto sink1 = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();sink1->set_level(SidecarLoggers::getGlobalLevel());sinks.push_back(sink1);auto sink2 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(log_file_name, 1024 * 1024 * 10, 100, false);sink2->set_level(spdlog::level::debug);sinks.push_back(sink2);auto logger = std::make_shared<spdlog::logger>("logger_name", begin(sinks), end(sinks));logger->set_level(spdlog::level::debug);spdlog::register_logger(logger);logger的注冊與獲取在一個地方創建了logger卻只能在該處使用肯定是不好用的,所以spdlog提供了一個全局注冊和獲取logger , 我們只需要在某處先創建logger并注冊 , 那么后面在其他地方使用時直接獲取就可以了注冊:spdlog::register_logger()獲?。簊pdlog::get()
//上面的代碼中我們注冊了一個logger,名字是logger_name,接下來嘗試獲取auto logger = SidecarLoggers::getLogger("logger_name");關于注冊與獲取需要注意的事

  • 必須先創建注冊才能獲取 , 建議每個模塊的logger都在整個模塊最開始初始化時創建并注冊 。如果在全局嘗試獲取不存在的logger,會返回空指針,如果恰好又使用空指針嘗試輸出logger,會造成整個程序的崩潰(訪問非法內存了,segment fault)
  • 通過上述的方式一創建的logger是自動注冊的,不需要手動注冊,但是方式二創建的logger需要手動注冊
  • 一旦注冊,全局使用,名字標識logger,在各個模塊獲取同一個名字的logger會獲取到同一個logger的指針
logger的使用獲取到一個logger之后,就可以愉快的使用它了,使用起來很簡單
logger->debug("this is a debug msg");logger->warn("warn!!!!");logger->info("hello world");logger->error("燙燙燙燙");logger的level設置logger的默認level是info,如果處于開發環境或者生產環境,會只需要debug級別以上或者warn級別以上的log要設置logger的級別,很簡單:
logger->set_level(spdlog::level::debug);可以設置全局logger級別spdlog::set_level(spdlog::level::warn);可以設置sink級別的loggersink1->set_level(spdlog::level::info);注意:一個logger內假如有多個sink,那么這些sink分別設置level是可以不同的,但是由于logger本身也有level,所以真正使用時,logger的level如果高于某個sink,會覆蓋該sink的level,所以建議此時把logger的level手動設置為debug(默認為info)
樣例代碼以下代碼為本人對spdlog的簡單使用封裝,主要功能有: