自定义日志库
来源:互联网 发布:个人如何开源节流 知乎 编辑:程序博客网 时间:2024/05/23 15:29
暂时设计成这样,后续持续优化中:
#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
- 自定义日志库
- log4j日志-自定义日志文件
- 自定义日志记录文件
- 自定义Apache日志格式
- 自定义打印日志
- log4j 自定义日志文件
- log4j自定义日志级别
- 自定义QTP执行日志
- linux syslog自定义日志
- hadoop 添加自定义日志
- 学习日志--自定义控件
- log4j自定义日志等级
- Java 自定义日志写入
- JAVA自定义日志
- 自定义log4j日志级别
- NJLog 自定义日志打印
- log4j日志自定义名称
- Apache自定义日志格式
- 一句话讲清楚什么是JavaEE
- java基础-文件复制,修改后缀名
- udp调用sendmsg报错Invalid argument
- CSS初涉(2)
- Unity Assets目录下的特殊文件夹名称(作用和是否会被打包到build中)
- 自定义日志库
- 禁止玩家创建某个角色名
- C语言头文件的使用
- 剑指offer的java实现(2)
- 1973-求最大公约数
- Android studio 底部 run 窗口不显示报错内容了!
- LINQ学习实例
- HDU
- Java关于初始化问题的总结(一)