本文小编为大家详细介绍“怎么使用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。