您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“怎么使用C++ cmake實現日志類”,內容詳細,步驟清晰,細節處理妥當,希望這篇“怎么使用C++ cmake實現日志類”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Logger.h
#pragma once #include <fstream> #include <sstream> #include <iostream> #include <string> #define NAME_SPACE_START(name) namespace name { #define NAME_SPACE_END } #ifndef _LOGGER_ #define _LOGGER_ NAME_SPACE_START(Log) class Logger{ public: Logger() = delete; Logger(const Logger&) = delete; Logger(std::string logFilePath = "", std::string logFileName = ""); ~Logger() = default; void LogStart(std::string context); void LogEnd(std::string context); void Debug(std::string context); void Error(std::string context); void Warning(std::string context); void Info(std::string context); bool OpenFile(std::string absolutePath); bool CloseFile(); std::stringstream GetCurrentTime(); public: static std::string m_logFilePath; static std::string m_title; private: std::ofstream _file; std::string absPath; }; NAME_SPACE_END #endif //!_LOGGER_
Logger.cpp
#include "logger.h" #include <ctime> #include <exception> #include <fstream> #include <ios> #include <iterator> #include <ostream> #include <sstream> #include <streambuf> #include <string> #include <time.h> std::string basePath = "C:\\"; //日志路徑 std::string baseTitle = "logger.txt"; //日志文件名 NAME_SPACE_START(Log) std::string Logger::m_logFilePath = basePath; std::string Logger::m_title = baseTitle; Logger::Logger(std::string logFilePath, std::string logFileName){ std::string absolutePath = ""; if(logFilePath != ""){ absolutePath += logFilePath; } else{ absolutePath += Logger::m_logFilePath; } if(logFileName != ""){ absolutePath += logFileName; } else{ absolutePath += Logger::m_title; } this->absPath = absolutePath; } void Logger::LogStart(std::string context = ""){ if(!this->OpenFile(this->absPath)) return; std::stringstream ss=GetCurrentTime(); _file<<ss.str() <<"------------------------------Log Start" <<" "<<context<<" " <<"------------------------------"<<std::endl; this->CloseFile(); } void Logger::LogEnd(std::string context = ""){ if(!this->OpenFile(this->absPath)) return; std::stringstream ss=GetCurrentTime(); _file<<ss.str() <<"------------------------------Log End" <<" "<<context<<" " <<"------------------------------"<<std::endl; this->CloseFile(); } void Logger::Debug(std::string context = ""){ if(!this->OpenFile(this->absPath)) return; std::stringstream ss=GetCurrentTime(); _file<<ss.str() <<"[Log Debug]:" <<context<<std::endl; this->CloseFile(); } void Logger::Error(std::string context = ""){ if(!this->OpenFile(this->absPath)) return; std::stringstream ss=GetCurrentTime(); _file<<ss.str() <<"[Log Error]:" <<context<<std::endl; this->CloseFile(); } void Logger::Warning(std::string context = ""){ if(!this->OpenFile(this->absPath)) return; std::stringstream ss=GetCurrentTime(); _file<<ss.str() <<"[Log Warning]:" <<context<<std::endl; this->CloseFile(); } void Logger::Info(std::string context = ""){ if(!this->OpenFile(this->absPath)) return; std::stringstream ss=GetCurrentTime(); _file<<ss.str() <<"[Log Info]:" <<context<<std::endl; this->CloseFile(); } bool Logger::OpenFile(std::string absolutePath){ try { this->_file.open(absolutePath, std::ios::out | std::ios::app); if(!_file.is_open()){ return false; } return true; } catch (std::exception ex) { return false; } } bool Logger::CloseFile(){ try{ this->_file.close(); return true; } catch(std::exception ex){ return false; } } std::stringstream Logger::GetCurrentTime(){ std::stringstream ss; time_t now=time(nullptr); tm curr_tm; localtime_s(&curr_tm, &now); ss<<curr_tm.tm_year<<"-"<<curr_tm.tm_mon<<"-"<<curr_tm.tm_yday <<" "<<curr_tm.tm_hour<<":"<<curr_tm.tm_min<<":"<<curr_tm.tm_sec <<" "; return ss; } NAME_SPACE_END
main.cpp
#include <iostream> #include "logger.h" using namespace std; using namespace Log; int main(){ Logger log("F:/Visual-Studio-practice/vscode/mySource/"); log.LogStart("main"); log.Debug("main"); log.Warning("main"); log.Error("main"); log.Info("main"); log.LogEnd("main"); return 0; }
日志圖片
本程序使用cmake生成
cmake文件
cmake_minimum_required(VERSION 3.0.0)
project(logger CXX)
set(CMAKE_INSTALL_PREFIX "F:/Visual-Studio-practice/vscode/mySource/build")
file(GLOB SOURCE_FILE ./src/logger.cpp)
add_library(logger_static STATIC ${SOURCE_FILE})
target_include_directories(logger_static PUBLIC header)
最外層cmake
cmake_minimum_required(VERSION 3.0.0)
project(MAIN VERSION 0.1.0)
set(CMAKE_BUILD_TYPE Debug)
set(UTILS_PATH ${PROJECT_SOURCE_DIR}/utils)
add_subdirectory(utils/Log)
add_executable(MAIN main.cpp)
include_directories(${UTILS_PATH}/Log/header)
target_link_libraries(MAIN logger_static)
enable_testing()
add_test(NAME MAIN_TEST COMMAND MAIN)
目錄結構如下
讀到這里,這篇“怎么使用C++ cmake實現日志類”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。