自定义日志库

        暂时设计成这样,后续持续优化中:

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<fstream>
#include<string>
#include<mutex>
#include<direct.h>
#include<time.h>
#include<io.h>
#include<algorithm>
#include<condition_variable>
#include<cstdio>
#include "macro_define.h"
#include<stdarg.h>
#include<sstream>

typedef enum LOG_LEVEL {
	VERBOSE,
	DEBUG,
	INFO,
	WARN,
	ERROR
} LogLevel;

class LogWriter {
private:
	const int MAX_CACHE_FILE_COUNT = 1;
	static LogWriter *Writer; // 引用性声明
	std::mutex Mutex;
	std::string FileDir = "E:/fsi/log/";
	std::string FileName = "";
	std::string CurrTime = "";
	std::string FilePath = "";

	

public:
 	LogWriter() {
		CreateDirectory();
		CreateFileName();
		CreateFilePath();
	}

public:
	~LogWriter() {
		Close();
	}

public:
	const char* LogLevelToString(LogLevel l) {
		switch (l) {
		case VERBOSE:
			return "VERBOSE";
		case DEBUG:
			return "DEBUG";
		case INFO:
			return "INFO";
		case WARN:
			return "WARN";
		case ERROR:
			return "ERROR";
		default:
			return "UNKNOWN";
		}
	}

	static LogWriter* GetInstance() {
		if (Writer == nullptr) {
			Writer = new LogWriter;
		}
		return Writer;
	}

	LogWriter* SetFileDirectory(std::string fileDriectory) {
		FileDir.assign(fileDriectory);
		CreateDirectory();
		CreateFilePath();
		return this;
	}

	void Write(LogLevel level, std::string message, int cnt, ...) {
		Mutex.lock();
		if (GetLogFileCount() > MAX_CACHE_FILE_COUNT) {
			DeleteDirectoryFile();
		}

		std::ofstream file_out(FilePath, std::ios::out | std::ios::app);

		if (file_out.is_open()) {
			va_list args;
			// std::string arg;
			std::string arg;
			va_start(args, cnt);
			int len = 0;
			std::cout << args << std::endl;
			while (len < cnt) {
				arg = va_arg(args, std::string);
				len++;
				file_out << "[" << arg << "]";
				
			}
			va_end(args);
			file_out << GetWriteTime();
			file_out << message << std::endl;
			file_out.close();
		}
		
		Mutex.unlock();
	}

	void CreateFileName() {
		char now[255];
		time_t Today;
		tm* Time;

		time(&Today);
		Time = localtime(&Today);

		strftime(now, 255, "%Y%m%d", Time);
		if (CurrTime.empty() || CurrTime != now) {
			FileName.assign("log").append(now).append(".txt");
		}
	}

	std::string GetWriteTime() {
		char now[255];
		time_t Today;
		tm* Time;

		time(&Today);
		Time = localtime(&Today);

		strftime(now, 255, "[%Y/%m/%d %H:%M:%S]", Time);
		return now;
	}


	void CreateDirectory() {
		// 判断目录是否存在  
		if (_chdir(FileDir.c_str()) == 0) {
			_mkdir(FileDir.c_str());
		}
	}

	void CreateFilePath() {
		FilePath = FileDir + FileName;
	}

	int GetLogFileCount()
	{
		//文件句柄
		long   hFile = 0;
		//文件信息
		struct _finddata_t fileinfo;
		int file_count = 0;

		if ((hFile = _findfirst((FileDir + "*").c_str(), &fileinfo)) != -1) {
			while (_findnext(hFile, &fileinfo) == 0) {
				if (fileinfo.name[0] == '.' && fileinfo.name[1] == '.') {
					continue;
				}
				file_count++;
			}
			_findclose(hFile);
		}
		return file_count;
	}

	void DeleteDirectoryFile() {
		//文件句柄
		long   hFile = 0;
		//文件信息
		struct _finddata_t fileinfo;
		int file_count = 0;

		if ((hFile = _findfirst((FileDir + "*").c_str(), &fileinfo)) != -1) {
			while (_findnext(hFile, &fileinfo) == 0) {
				if (fileinfo.name[0] == '.' && fileinfo.name[1] == '.') {
					continue;
				}
				remove((FileDir + fileinfo.name).c_str());
			}
			_findclose(hFile);
		}
	}

	void Close() {
		delete Writer;
		Writer = nullptr;
	}
};

// 定义性声明
LogWriter * LogWriter::Writer; 
std::string Int_to_String(int n){
	std::ostringstream stream;
	// n为int类型
	stream << n;  
	return stream.str();
}

void main() {
	std::string auto_file = __FILE__;
	std::cout << __FILE__ << std::endl;
	LogWriter::GetInstance()->Write(LogLevel::VERBOSE, "wode未来不是梦1", 2, auto_file, "Line" + Int_to_String(__LINE__));
	LogWriter::GetInstance()->Write(LogLevel::DEBUG, "wode未来不是梦2", 2, auto_file, Int_to_String(__LINE__));
	LogWriter::GetInstance()->Write(LogLevel::INFO, "wode未来不是梦3", 2, auto_file, Int_to_String(__LINE__));
	LogWriter::GetInstance()->Write(LogLevel::WARN, "wode未来不是梦4", 2, auto_file, Int_to_String(__LINE__));
	LogWriter::GetInstance()->Write(LogLevel::ERROR, "wode未来不是梦5", 2, auto_file, Int_to_String(__LINE__));
	LogWriter::GetInstance()->Write(LogLevel::VERBOSE, "wode未来不是梦6", 2, auto_file, Int_to_String(__LINE__));
	LogWriter::GetInstance()->Write(LogLevel::DEBUG, "wode未来不是梦7", 2, auto_file, Int_to_String(__LINE__));

	system("pause");
	return;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值