Logger.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #ifndef CORE_LOGGER_H
  2. #define CORE_LOGGER_H
  3. #include "utils/ArrayString.h"
  4. namespace Core::Logger {
  5. enum class Level { ERROR, WARNING, INFO, DEBUG };
  6. extern Level level;
  7. // aborts on critical logging failure
  8. template<typename... Args>
  9. void log(Level l, const char* file, int line, const char* start,
  10. const char* format, Args&&... args) {
  11. if(Core::Logger::level < l) {
  12. return;
  13. }
  14. Core::ArrayString<2048> s;
  15. if(s.append(format)) {
  16. printf(
  17. "\33[1;31m%s:%d contains an invalid format string\33[39;49m\n",
  18. file, line);
  19. } else if(s.format(Core::forward<Args>(args)...)) {
  20. printf("\33[1;31m%s:%d formatting failed\33[39;49m\n", file, line);
  21. } else if(fputs(start, stdout) < 0 || s.print() ||
  22. printf("\33[39;49m\n") <= 0) {
  23. Core::exitWithHandler(1);
  24. }
  25. }
  26. }
  27. #if defined(CORE_LOG_LEVEL) && CORE_LOG_LEVEL >= 1
  28. #define CORE_LOG_ERROR(format, ...) \
  29. log(Core::Logger::Level::ERROR, __FILE__, __LINE__, "\33[1;31m[ERROR] ", \
  30. format, __VA_ARGS__);
  31. #else
  32. #define CORE_LOG_ERROR(format, ...)
  33. #endif
  34. #if defined(CORE_LOG_LEVEL) && CORE_LOG_LEVEL >= 2
  35. #define CORE_LOG_WARNING(format, ...) \
  36. log(Core::Logger::Level::WARNING, __FILE__, __LINE__, \
  37. "\33[1;33m[WARNING] ", format, __VA_ARGS__);
  38. #else
  39. #define CORE_LOG_WARNING(format, ...)
  40. #endif
  41. #if defined(CORE_LOG_LEVEL) && CORE_LOG_LEVEL >= 3
  42. #define CORE_LOG_INFO(format, ...) \
  43. log(Core::Logger::Level::INFO, __FILE__, __LINE__, "\33[1;37m[INFO] ", \
  44. format, __VA_ARGS__);
  45. #else
  46. #define CORE_LOG_INFO(format, ...)
  47. #endif
  48. #if defined(CORE_LOG_LEVEL) && CORE_LOG_LEVEL >= 4
  49. #define CORE_LOG_DEBUG(format, ...) \
  50. log(Core::Logger::Level::DEBUG, __FILE__, __LINE__, "\33[1;32m[DEBUG] ", \
  51. format, __VA_ARGS__);
  52. #else
  53. #define CORE_LOG_DEBUG(format, ...)
  54. #endif
  55. #endif