Logging.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "Logging.h"
  2. #include "Config.h"
  3. #include "FileSystem.h"
  4. #include "Path.h"
  5. #include "StringUtils.h"
  6. #include <spdlog/spdlog.h>
  7. #include <spdlog/sinks/stdout_color_sinks.h>
  8. #include <spdlog/sinks/basic_file_sink.h>
  9. namespace gameplay
  10. {
  11. Logging::Logging()
  12. {
  13. if (GP_DEBUG)
  14. {
  15. spdlog::set_level(spdlog::level::debug);
  16. }
  17. else
  18. {
  19. spdlog::set_level(spdlog::level::info);
  20. }
  21. }
  22. Logging::~Logging()
  23. {
  24. }
  25. void Logging::startup()
  26. {
  27. auto config = App::get_app()->get_config();
  28. // setup the file logger path from settings
  29. std::string logLevelStr = config->get_string("logging.level", "INFO");
  30. std::string logFileStr = config->get_string("logging.file", "");
  31. auto fs = App::get_app()->get_file_system();
  32. if (logFileStr.size() > 0)
  33. {
  34. std::string logPath = Path(fs->get_app_directory_path()).join(logFileStr);
  35. try
  36. {
  37. // create a console and file logger
  38. std::vector<spdlog::sink_ptr> sinks;
  39. sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
  40. sinks.push_back(std::make_shared<spdlog::sinks::basic_file_sink_mt>(logPath));
  41. auto logger = std::make_shared<spdlog::logger>("gameplay_logger", begin(sinks), end(sinks));
  42. spdlog::register_logger(logger);
  43. spdlog::set_default_logger(logger);
  44. Logging::Level level = Logging::parse_level(logLevelStr.c_str());
  45. set_level(level);
  46. spdlog::set_pattern("[%Y-%m-%d][%H:%M:%S.%e] [%^%l%$] %v");
  47. spdlog::flush_on(spdlog::level::info);
  48. //spdlog::flush_every(std::chrono::seconds(1));
  49. GP_LOG_INFO("=================================================================================");
  50. GP_LOG_INFO("LOG LEVEL: {}", logLevelStr.c_str());
  51. GP_LOG_INFO("LOG FILE: {}", logPath.c_str());
  52. GP_LOG_INFO("==================================================================================", logPath.c_str());
  53. }
  54. catch (const spdlog::spdlog_ex& ex)
  55. {
  56. GP_LOG_WARN("Failed to initialize file logger: {}, {}", logPath.c_str(), ex.what());
  57. }
  58. }
  59. }
  60. void Logging::shutdown()
  61. {
  62. }
  63. Logging::Level Logging::parse_level(const char* str)
  64. {
  65. std::string levelStr = str;
  66. StringUtils::to_upper(levelStr);
  67. if (levelStr.compare("TRACE") == 0)
  68. return Level::LEVEL_TRACE;
  69. else if (levelStr.compare("DEBUG") == 0)
  70. return Level::LEVEL_DEBUG;
  71. else if (levelStr.compare("INFO") == 0)
  72. return Level::LEVEL_INFO;
  73. else if (levelStr.compare("WARN") == 0)
  74. return Level::LEVEL_WARN;
  75. else if (levelStr.compare("ERROR") == 0)
  76. return Level::LEVEL_ERROR;
  77. else if (levelStr.compare("CRITICAL") == 0)
  78. return Level::LEVEL_CRITICAL;
  79. else if (levelStr.compare("OFF") == 0)
  80. return Level::LEVEL_OFF;
  81. GP_LOG_WARN("Failed to parse Logging::Level str: {}", str);
  82. return Level::LEVEL_INFO;
  83. }
  84. void Logging::set_level(Logging::Level level)
  85. {
  86. switch(level)
  87. {
  88. case Logging::Level::LEVEL_TRACE:
  89. spdlog::set_level(spdlog::level::trace);
  90. break;
  91. case Logging::Level::LEVEL_DEBUG:
  92. spdlog::set_level(spdlog::level::debug);
  93. break;
  94. case Logging::Level::LEVEL_INFO:
  95. spdlog::set_level(spdlog::level::info);
  96. break;
  97. case Logging::Level::LEVEL_WARN:
  98. spdlog::set_level(spdlog::level::warn);
  99. break;
  100. case Logging::Level::LEVEL_ERROR:
  101. spdlog::set_level(spdlog::level::err);
  102. break;
  103. case Logging::Level::LEVEL_CRITICAL:
  104. spdlog::set_level(spdlog::level::critical);
  105. break;
  106. case Logging::Level::LEVEL_OFF:
  107. spdlog::set_level(spdlog::level::off);
  108. break;
  109. }
  110. }
  111. Logging::Level Logging::get_level() const
  112. {
  113. auto level = spdlog::get_level();
  114. switch(level)
  115. {
  116. case spdlog::level::trace:
  117. return Logging::Level::LEVEL_TRACE;
  118. case spdlog::level::debug:
  119. return Logging::Level::LEVEL_DEBUG;
  120. case spdlog::level::info:
  121. return Logging::Level::LEVEL_INFO;
  122. case spdlog::level::warn:
  123. return Logging::Level::LEVEL_WARN;
  124. case spdlog::level::err:
  125. return Logging::Level::LEVEL_ERROR;
  126. case spdlog::level::critical:
  127. return Logging::Level::LEVEL_CRITICAL;
  128. case spdlog::level::off:
  129. return Logging::Level::LEVEL_OFF;
  130. default:
  131. return Logging::Level::LEVEL_INFO;
  132. }
  133. }
  134. }