global.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /**
  2. * Copyright (c) 2020-2021 Paul-Louis Ageneau
  3. *
  4. * This Source Code Form is subject to the terms of the Mozilla Public
  5. * License, v. 2.0. If a copy of the MPL was not distributed with this
  6. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
  7. */
  8. #include "plog/Appenders/ColorConsoleAppender.h"
  9. #include "plog/Formatters/FuncMessageFormatter.h"
  10. #include "plog/Formatters/TxtFormatter.h"
  11. #include "plog/Init.h"
  12. #include "plog/Log.h"
  13. #include "plog/Logger.h"
  14. //
  15. #include "global.hpp"
  16. #include "impl/init.hpp"
  17. #include <mutex>
  18. #ifdef _WIN32
  19. #include <codecvt>
  20. #include <locale>
  21. #endif
  22. namespace {
  23. void plogInit(plog::Severity severity, plog::IAppender *appender) {
  24. using Logger = plog::Logger<PLOG_DEFAULT_INSTANCE_ID>;
  25. static Logger *logger = nullptr;
  26. if (!logger) {
  27. PLOG_DEBUG << "Initializing logger";
  28. logger = new Logger(severity);
  29. if (appender) {
  30. logger->addAppender(appender);
  31. } else {
  32. using ConsoleAppender = plog::ColorConsoleAppender<plog::TxtFormatter>;
  33. static ConsoleAppender *consoleAppender = new ConsoleAppender();
  34. logger->addAppender(consoleAppender);
  35. }
  36. } else {
  37. logger->setMaxSeverity(severity);
  38. if (appender)
  39. logger->addAppender(appender);
  40. }
  41. }
  42. } // namespace
  43. namespace rtc {
  44. struct LogAppender : public plog::IAppender {
  45. synchronized_callback<LogLevel, string> callback;
  46. void write(const plog::Record &record) override {
  47. const auto severity = record.getSeverity();
  48. auto formatted = plog::FuncMessageFormatter::format(record);
  49. formatted.pop_back(); // remove newline
  50. #ifdef _WIN32
  51. using convert_type = std::codecvt_utf8<wchar_t>;
  52. std::wstring_convert<convert_type, wchar_t> converter;
  53. std::string str = converter.to_bytes(formatted);
  54. #else
  55. std::string str = formatted;
  56. #endif
  57. if (!callback(static_cast<LogLevel>(severity), str))
  58. std::cout << plog::severityToString(severity) << " " << str << std::endl;
  59. }
  60. };
  61. void InitLogger(LogLevel level, LogCallback callback) {
  62. const auto severity = static_cast<plog::Severity>(level);
  63. static LogAppender *appender = nullptr;
  64. static std::mutex mutex;
  65. std::lock_guard lock(mutex);
  66. if (appender) {
  67. appender->callback = std::move(callback);
  68. plogInit(severity, nullptr); // change the severity
  69. } else if (callback) {
  70. appender = new LogAppender();
  71. appender->callback = std::move(callback);
  72. plogInit(severity, appender);
  73. } else {
  74. plogInit(severity, nullptr); // log to cout
  75. }
  76. }
  77. void InitLogger(plog::Severity severity, plog::IAppender *appender) {
  78. plogInit(severity, appender);
  79. }
  80. void Preload() { impl::Init::Instance().preload(); }
  81. std::shared_future<void> Cleanup() { return impl::Init::Instance().cleanup(); }
  82. void SetSctpSettings(SctpSettings s) { impl::Init::Instance().setSctpSettings(std::move(s)); }
  83. } // namespace rtc
  84. RTC_CPP_EXPORT std::ostream &operator<<(std::ostream &out, rtc::LogLevel level) {
  85. switch (level) {
  86. case rtc::LogLevel::Fatal:
  87. out << "fatal";
  88. break;
  89. case rtc::LogLevel::Error:
  90. out << "error";
  91. break;
  92. case rtc::LogLevel::Warning:
  93. out << "warning";
  94. break;
  95. case rtc::LogLevel::Info:
  96. out << "info";
  97. break;
  98. case rtc::LogLevel::Debug:
  99. out << "debug";
  100. break;
  101. case rtc::LogLevel::Verbose:
  102. out << "verbose";
  103. break;
  104. default:
  105. out << "none";
  106. break;
  107. }
  108. return out;
  109. }