本文同时发布在我的个人博客上:https://dragon_boy.gitee.io
Debug,或者说日志系统,这对于调试来说非常重要。
这里我们使用开源库spdlog
,github地址:https://github.com/gabime/spdlog。
在Log类中,我们将核心端和客户端的日志分开。
Log.h
#pragma once
#include "Core.h"
#include "spdlog/spdlog.h"
#include "spdlog/fmt/ostr.h"
namespace Dragon
{
class Log
{
public:
static void Init();
inline static std::shared_ptr<spdlog::logger>& GetCoreLogger() { return s_CoreLogger; }
inline static std::shared_ptr<spdlog::logger>& GetClientLogger() { return s_ClientLogger; }
private:
static std::shared_ptr<spdlog::logger> s_CoreLogger;
static std::shared_ptr<spdlog::logger> s_ClientLogger;
};
}
// Core log maros
#define DG_CORE_TRACE(...) ::Dragon::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define DG_CORE_INFO(...) ::Dragon::Log::GetCoreLogger()->info(__VA_ARGS__)
#define DG_CORE_WARN(...) ::Dragon::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define DG_CORE_ERROR(...) ::Dragon::Log::GetCoreLogger()->error(__VA_ARGS__)
#define DG_CORE_CRITICAL(...) ::Dragon::Log::GetCoreLogger()->critical(__VA_ARGS__)
//Client log macros
#define DG_TRACE(...) ::Dragon::Log::GetClientLogger()->trace(__VA_ARGS__)
#define DG_INFO(...) ::Dragon::Log::GetClientLogger()->info(__VA_ARGS__)
#define DG_WARN(...) ::Dragon::Log::GetClientLogger()->warn(__VA_ARGS__)
#define DG_ERROR(...) ::Dragon::Log::GetClientLogger()->error(__VA_ARGS__)
#define DG_CRITICAL(...) ::Dragon::Log::GetClientLogger()->critical(__VA_ARGS__)
我们定义的都是静态方法,不需要创建对象实例。同时,为了方便调用方法,我们定义了几个宏定义。Trace
显示白字,Info
显示绿字,Warn
显示黄字,Error
显示红字,Critical
显示红底白字。...
和__VA_ARGS__
代表使用可变参数。
Log.cpp
#include "dgpch.h"
#include "Log.h"
#include "spdlog/sinks/stdout_color_sinks.h"
namespace Dragon
{
std::shared_ptr<spdlog::logger> Log::s_CoreLogger;
std::shared_ptr<spdlog::logger> Log::s_ClientLogger;
void Log::Init()
{
spdlog::set_pattern("%^[%T] %n: %v%$");
s_CoreLogger = spdlog::stdout_color_mt("Dragon");
s_CoreLogger->set_level(spdlog::level::trace);
s_ClientLogger = spdlog::stdout_color_mt("APP");
s_ClientLogger->set_level(spdlog::level::trace);
}
}
在Init()
方法中,我们初始化每次默认会打印的字符,"%^[%T] %n: %v%$"
对应[时:分:秒]
。
我们在EntryPoint.h
中设置一些初始化日志输出:
#pragma once
#ifdef DG_PLATFORM_WINDOWS
extern Dragon::Application* Dragon::CreateApplication();
int main(int argc, char** argv)
{
Dragon::Log::Init();
DG_CORE_WARN("Initialized Log!");
DG_INFO("Hello!");
auto app = Dragon::CreateApplication();
app->Run();
delete app;
return 0;
}
#endif
运行效果:

之后我们可以使用日志系统来帮助我们Debug。
项目github地址:https://github.com/Dragon-Baby/Dragon
网友评论