哈哈哈哈哈哈哈,实在懒得写了,这是直接找到了之前有心情写的log。ok我会抽空所有代码上传到github
https://github.com/yanan-0604/YaoEngine-DEV
怎么样,是不是很唬人,总体来说他只是记不清是什么时候写的这个了。总之非常垃圾的代码,之后会优化他,
YaoLog放着整个模块的代码,而Log则是使用他们的demo,
#pragma once #include "../YaoLogcore.h" #include<iostream> #include<chrono> namespace YaoEngine { namespace LogSystem { class base_formatter { public: virtual ~base_formatter()=default; virtual void Log(const char*) = 0; }; class string_formatter :public base_formatter { public: string_formatter(char str) { m_Str = str; } virtual ~string_formatter() {} virtual void Log(const char*) override { std::cout << m_Str; } private: char m_Str; }; class Timer_formatter :public base_formatter { public: Timer_formatter(Timetype t = Timetype::None) { m_time = t; }; virtual ~Timer_formatter() {}; virtual void Log(const char*) override { auto time = std::chrono::system_clock::now(); std::time_t t = std::chrono::system_clock::to_time_t(time); std::tm localTime; #ifdef _WIN32 localtime_s(&localTime, &t); #else localtime_r(&t, &localTime); #endif // 分别取出年月日时分秒 int year = localTime.tm_year + 1900; // 从1900开始 int month = localTime.tm_mon + 1; // 从0开始 int day = localTime.tm_mday; int hour = localTime.tm_hour; int minute = localTime.tm_min; int second = localTime.tm_sec; switch (m_time) { case Timetype::Year: std::cout << year; break; case Timetype::Month: std::cout << month; break; case Timetype::Day: std::cout << day; break; case Timetype::Hour: std::cout << hour; break; case Timetype::Min: std::cout << minute; break; case Timetype::Seconds: std::cout << second; break; default: std::cout << "error code"; break; } } public: Timetype m_time; }; class Level_formatter :public base_formatter { public: Level_formatter(Level l = Level::None) { m_level = l; } virtual ~Level_formatter() {}; virtual void Log(const char*) override { std::cout << LevelToString(m_level); } private: Level m_level; }; /*class EntityId_formatter :public base_formatter { public: virtual void Log(const char*) override; };*/ class msg_formatter :public base_formatter { public: msg_formatter() {}; virtual ~msg_formatter() {}; virtual void Log(const char*msg) override { std::cout << msg; } }; } }#include"Logger.h" #include<Mysystem/Windowtool/Windowstool.h> namespace YaoEngine { namespace LogSystem { Logger::Logger(const char *name, Level l) { m_name = name; m_level = l; m_formatterarray = {}; } Logger::~Logger() { } void Logger::parseformat(const char *fmt) { if (fmt == nullptr) { return; } std::string formatstr = fmt; for (int i = 0; i < formatstr.size(); i++) { if (formatstr[i]!='%') { m_formatterarray.emplace_back(new string_formatter(formatstr[i])); } else if (formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] == 'Y') { m_formatterarray.emplace_back(new Timer_formatter(Timetype::Year)); i++; } else if(formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] == 'M') { m_formatterarray.emplace_back(new Timer_formatter(Timetype::Month)); i++; } else if (formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] == 'D') { m_formatterarray.emplace_back(new Timer_formatter(Timetype::Day)); i++; } else if (formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] == 'h') { m_formatterarray.emplace_back(new Timer_formatter(Timetype::Hour)); i++; } else if (formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] == 'm') { m_formatterarray.emplace_back(new Timer_formatter(Timetype::Min)); i++; } else if (formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] =='s') { m_formatterarray.emplace_back(new Timer_formatter(Timetype::Seconds)); i++; } else if (formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] == 'l') { m_formatterarray.emplace_back(new Level_formatter(m_level)); } else if (formatstr[i] == '%' && i + 1 < formatstr.size() && formatstr[i + 1] == 'v') { m_formatterarray.emplace_back(new msg_formatter()); i++; } } } void Logger::Resetformat(const char* fmt) { } void Logger::SetLevel(Level l) { m_level = l; } void Logger::Log(const char* msg, ...) { va_list args; char buffer[1024]; va_start(args, msg); vsnprintf(buffer, sizeof(buffer), msg, args); va_end(args); switch (m_level) { case Level::Trace: ConsleCommand::SetFreeColor(1); break; case Level::Debug: ConsleCommand::SetFreeColor(2); break; case Level::Info: ConsleCommand::SetFreeColor(3); break; case Level::Warn: ConsleCommand::SetFreeColor(4); break; case Level::Error: ConsleCommand::SetFreeColor(5); break; case Level::Fatal: ConsleCommand::SetFreeColor(6); break; default: std::cout<<"Invalid Level"<<std::endl; break; } std::cout<<m_name<<": "; for (auto& formatter : m_formatterarray) { formatter->Log(buffer); } std::cout << std::endl; ConsleCommand::SetFreeColor(15); } } }#include"./Log.h" namespace YaoEngine { namespace LogSystem { Logger* YLog::YaoEngine = new Logger("YaoEngine"); Logger* YLog::client = new Logger("cilent"); } }#pragma once #include"YaoLog/Logger.h" namespace YaoEngine { namespace LogSystem { class YLog { public: static void Init() { YaoEngine->parseformat("[%Y-%M-%D, %h:%m:%s]:%v"); client->parseformat("[%Y-%M-%D, %h:%m:%s]:%v"); } static Logger* GetYaoEngineLog() { return YaoEngine; } static Logger* GetclientLog() { return client; } private: static Logger* YaoEngine; static Logger* client; }; } } #define YaoInfo(msg, ...)\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->SetLevel(YaoEngine::LogSystem::Level::Info);\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->Log(msg, ##__VA_ARGS__); #define Yaoerror(msg, ...)\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->SetLevel(YaoEngine::LogSystem::Level::Error);\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->Log(msg, ##__VA_ARGS__); #define YaoWarning(msg, ...)\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->SetLevel(YaoEngine::LogSystem::Level::Warn);\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->Log(msg, ##__VA_ARGS__); #define YaoDebug(msg, ...)\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->SetLevel(YaoEngine::LogSystem::Level::Debug);\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->Log(msg, ##__VA_ARGS__); #define YaoTrace(msg, ...)\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->SetLevel(YaoEngine::LogSystem::Level::Trace);\ YaoEngine::LogSystem::YLog::GetYaoEngineLog()->Log(msg, ##__VA_ARGS__); #define clientInfo(msg, ...)\ YaoEngine::LogSystem::YLog::GetclientLog()->SetLevel(YaoEngine::LogSystem::Level::Info);\ YaoEngine::LogSystem::YLog::GetclientLog()->Log(msg, ##__VA_ARGS__); #define clienterror(msg, ...)\ YaoEngine::LogSystem::YLog::GetclientLog()->SetLevel(YaoEngine::LogSystem::Level::Error);\ YaoEngine::LogSystem::YLog::GetclientLog()->Log(msg, ##__VA_ARGS__); #define clientWarning(msg, ...)\ YaoEngine::LogSystem::YLog::GetclientLog()->SetLevel(YaoEngine::LogSystem::Level::Warn);\ YaoEngine::LogSystem::YLog::GetclientLog()->Log(msg, ##__VA_ARGS__); #define clientDebug(msg, ...)\ YaoEngine::LogSystem::YLog::GetclientLog()->SetLevel(YaoEngine::LogSystem::Level::Debug);\ YaoEngine::LogSystem::YLog::GetclientLog()->Log(msg, ##__VA_ARGS__);好吧这真的很语塞因为根本就很简单,没必要讲吼吼吼吼吼,每次看都会被这个愚蠢的解析器气笑,我会在这个下面提交修改的代码。之前没注意,甚至于没有删除这两个变量,不过静态变量始终是从程序开始就会到程序死亡,所以没必要删除吼吼吼吼吼,骗你的。
下次再修改吧,洗澡睡觉了,本来想再写一个,想想算了。