5 #define STRINGIFY(x) #x
6 #define TO_STRING(x) STRINGIFY(x)
7 #define TRACE_FILE_LOG "[" __TIME__ "]" "[EMBER_ENGINE - " __FILE__ ":" TO_STRING(__LINE__)"] - "
35 void Push(
const std::string& formatted_log);
45 std::mutex _mutex = std::mutex();
46 SDL_Thread* _log_thread =
nullptr;
47 std::condition_variable _condition = std::condition_variable();
48 std::atomic<bool> _bIsRunning =
false;
49 std::deque<std::string> _log_queue = std::deque<std::string>();
60 #define LOG_ERROR(...) \
63 SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
64 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
65 Logger::Get().Push(buffer); \
75 #define LOG_INFO(...) \
78 SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
79 SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
80 Logger::Get().Push(buffer); \
90 #define LOG_DEBUG(...) \
93 SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
94 SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
95 Logger::Get().Push(buffer); \
105 #define LOG_VERBOSE(...) \
108 SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
109 SDL_LogVerbose(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
110 Logger::Get().Push(buffer); \
120 #define LOG_WARN(...) \
123 SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
124 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
125 Logger::Get().Push(buffer); \
135 #define LOG_TRACE(...) \
138 SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
139 SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
140 Logger::Get().Push(buffer); \
150 #define LOG_CRITICAL(...) \
153 SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
154 SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
155 Logger::Get().Push(buffer); \
165 #define LOG_QUIT_ON_FAIL(x) \
167 LOG_ERROR("%s", SDL_GetError()); \
168 return SDL_APP_FAILURE; \
180 unsigned int error = glGetError(); \
181 if (error != GL_NO_ERROR) { \
182 LOG_ERROR("API ERROR_CODE: %d", error); \
192 #define EMBER_TIMER_START() auto start = std::chrono::high_resolution_clock::now();
201 #define EMBER_TIMER_END(description) \
203 auto end = std::chrono::high_resolution_clock::now(); \
204 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); \
205 LOG_INFO("%s took %lld (us), %.2f (ms)", description, duration, (float) duration / 1000.f); \
static void Start()
Definition: logging.cpp:3
void Push(const std::string &formatted_log)
Definition: logging.cpp:19
static void Destroy()
Definition: logging.cpp:26
static Logger & Get()
Definition: logging.h:28