Ember
A C++ 20 'game engine' built with SDL3 with wide platform support.
logging_sys.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "core/ember_utils.h"
4 
5 #define STRINGIFY(x) #x
6 #define TO_STRING(x) STRINGIFY(x)
7 #define TRACE_FILE_LOG \
8  "[" __TIME__ "]" \
9  "[EMBER_ENGINE][" __FILE__ ":" TO_STRING(__LINE__) "]: "
10 
28 class Logger {
29 public:
30  static Logger& get_instance();
31 
32  static void initialize();
33 
34  void push(const std::string& formatted_log);
35 
36  static void destroy();
37 
38 private:
39  Logger() = default;
40  ~Logger() = default;
41 
42  void log_thread();
43 
44  std::mutex _mutex = std::mutex();
45  SDL_Thread* _thread = nullptr;
46  std::condition_variable _condition = std::condition_variable();
47  std::atomic<bool> _is_running = false;
48 
49  std::deque<std::string> _log_queue = std::deque<std::string>();
50 };
51 
52 
60 #define LOG_ERROR(...) \
61  do { \
62  char buffer[1024]; \
63  SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
64  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
65  Logger::get_instance().push(buffer); \
66  } while (0)
67 
75 #define LOG_INFO(...) \
76  do { \
77  char buffer[1024]; \
78  SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
79  SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
80  Logger::get_instance().push(buffer); \
81  } while (0)
82 
90 #define LOG_DEBUG(...) \
91  do { \
92  char buffer[1024]; \
93  SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
94  SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
95  Logger::get_instance().push(buffer); \
96  } while (0)
97 
105 #define LOG_VERBOSE(...) \
106  do { \
107  char buffer[1024]; \
108  SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
109  SDL_LogVerbose(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
110  Logger::get_instance().push(buffer); \
111  } while (0)
112 
120 #define LOG_WARN(...) \
121  do { \
122  char buffer[1024]; \
123  SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
124  SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
125  Logger::get_instance().push(buffer); \
126  } while (0)
127 
135 #define LOG_TRACE(...) \
136  do { \
137  char buffer[1024]; \
138  SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
139  SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
140  Logger::get_instance().push(buffer); \
141  } while (0)
142 
150 #define LOG_CRITICAL(...) \
151  do { \
152  char buffer[1024]; \
153  SDL_snprintf(buffer, sizeof(buffer), TRACE_FILE_LOG __VA_ARGS__); \
154  SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "%s", buffer); \
155  Logger::get_instance().push(buffer); \
156  } while (0)
157 
165 #define LOG_QUIT_ON_FAIL(x) \
166  if (!x) { \
167  LOG_ERROR("%s", SDL_GetError()); \
168  return SDL_APP_FAILURE; \
169  }
170 
171 
178 #define GL_ERROR() \
179  { \
180  unsigned int error = glGetError(); \
181  if (error != GL_NO_ERROR) { \
182  LOG_ERROR("API ERROR_CODE: %d", error); \
183  } \
184  }
185 
192 #define EMBER_TIMER_START() auto start = std::chrono::high_resolution_clock::now();
193 
194 
201 #define EMBER_TIMER_END(description) \
202  do { \
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); \
206  } while (0)
Class for logging, tracing and debugging.
Definition: logging_sys.h:28
static Logger & get_instance()
Definition: logging_sys.cpp:4
void push(const std::string &formatted_log)
Definition: logging_sys.cpp:25
static void destroy()
Definition: logging_sys.cpp:36
static void initialize()
Definition: logging_sys.cpp:9