哈哈哈哈哈哈哈,实在懒得写了,这是直接找到了之前有心情写的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__);		

好吧这真的很语塞因为根本就很简单,没必要讲吼吼吼吼吼,每次看都会被这个愚蠢的解析器气笑,我会在这个下面提交修改的代码。之前没注意,甚至于没有删除这两个变量,不过静态变量始终是从程序开始就会到程序死亡,所以没必要删除吼吼吼吼吼,骗你的。

下次再修改吧,洗澡睡觉了,本来想再写一个,想想算了。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐