C++ cmake实现日志类的示例代码攻略
前置要求
- 安装cmake工具:在官网 https://cmake.org/download/ 下载对应系统的版本进行安装
- C++编译器:这里以g++为例
- IDE:这里以Visual Studio Code为例
步骤一:创建工程
利用cmake工具创建一个C++工程。
- 在项目根目录创建文件CMakeLists.txt,内容如下
cmake_minimum_required(VERSION 3.0)
project(MyLog)
include_directories(include)
aux_source_directory(src DIR_SRCS)
add_executable(MyLog ${DIR_SRCS})
- 在根目录下创建include和src目录,并分别放入头文件和源文件
步骤二:实现日志类
在include目录下创建Log.h文件,代码如下
#ifndef LOG_H
#define LOG_H
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <stdarg.h>
#include <string>
#include <chrono>
enum LogLevel{LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR};
class Log
{
public:
static Log* GetInstance();
void LogMessage(LogLevel level, const char* format, ...);
void SetLogLevel(LogLevel level);
private:
LogLevel m_logLevel;
std::ofstream m_output;
Log();
virtual ~Log();
Log(const Log&) = delete;
Log& operator=(const Log&) = delete;
};
#endif // LOG_H
在src目录下创建Log.cpp文件,代码如下
#include "Log.h"
Log::Log()
{
m_logLevel = LogLevel::LOG_INFO;
m_output = std::ofstream("log.txt", std::ios_base::app);
}
Log::~Log()
{
m_output.close();
}
Log* Log::GetInstance()
{
static Log log;
return &log;
}
void Log::LogMessage(LogLevel level, const char* format, ...)
{
if (level >= m_logLevel)
{
auto now = std::chrono::system_clock::now();
auto now_time_t = std::chrono::system_clock::to_time_t(now);
auto now_tm = std::localtime(&now_time_t);
char buffer[80];
std::strftime(buffer, sizeof(buffer), "[%Y-%m-%d %H:%M:%S]", now_tm);
m_output << buffer;
va_list args;
va_start(args, format);
char message[1024];
vsprintf(message, format, args);
va_end(args);
m_output << " [" << level << "] " << message << std::endl;
}
}
void Log::SetLogLevel(LogLevel level)
{
m_logLevel = level;
}
步骤三:使用日志类
在main.cpp中使用Log类进行日志输出,代码如下:
#include "Log.h"
int main()
{
auto log = Log::GetInstance();
log->SetLogLevel(LOG_INFO);
log->LogMessage(LOG_INFO, "This is an info message. \n");
log->LogMessage(LOG_WARN, "This is a warning message. \n");
log->LogMessage(LOG_DEBUG, "This is a debug message. \n");
log->LogMessage(LOG_ERROR, "This is an error message. \n");
return 0;
}
示例一
我们将日志级别设为LOG_INFO,执行main函数,可以看到log.txt文件中只有info信息输出。
示例二
我们将日志级别设为LOG_WARN,执行main函数,可以看到log.txt文件中有info和warn信息输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ cmake实现日志类的示例代码 - Python技术站