global.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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/Converters/UTF8Converter.h"
  10. #include "plog/Formatters/FuncMessageFormatter.h"
  11. #include "plog/Formatters/TxtFormatter.h"
  12. #include "plog/Init.h"
  13. #include "plog/Log.h"
  14. #include "plog/Logger.h"
  15. //
  16. #include "global.hpp"
  17. #include "impl/init.hpp"
  18. #include <mutex>
  19. namespace {
  20. void plogInit(plog::Severity severity, plog::IAppender *appender) {
  21. using Logger = plog::Logger<PLOG_DEFAULT_INSTANCE_ID>;
  22. static Logger *logger = nullptr;
  23. if (!logger) {
  24. PLOG_DEBUG << "Initializing logger";
  25. logger = new Logger(severity);
  26. if (appender) {
  27. logger->addAppender(appender);
  28. } else {
  29. using ConsoleAppender = plog::ColorConsoleAppender<plog::TxtFormatter>;
  30. static ConsoleAppender *consoleAppender = new ConsoleAppender();
  31. logger->addAppender(consoleAppender);
  32. }
  33. } else {
  34. logger->setMaxSeverity(severity);
  35. if (appender)
  36. logger->addAppender(appender);
  37. }
  38. }
  39. } // namespace
  40. namespace rtc {
  41. struct LogAppender : public plog::IAppender {
  42. synchronized_callback<LogLevel, string> callback;
  43. void write(const plog::Record &record) override {
  44. const auto severity = record.getSeverity();
  45. auto formatted = plog::FuncMessageFormatter::format(record);
  46. formatted.pop_back(); // remove newline
  47. const auto &converted =
  48. plog::UTF8Converter::convert(formatted); // does nothing on non-Windows systems
  49. if (!callback(static_cast<LogLevel>(severity), converted))
  50. std::cout << plog::severityToString(severity) << " " << converted << std::endl;
  51. }
  52. };
  53. void InitLogger(LogLevel level, LogCallback callback) {
  54. const auto severity = static_cast<plog::Severity>(level);
  55. static LogAppender *appender = nullptr;
  56. static std::mutex mutex;
  57. std::lock_guard lock(mutex);
  58. if (appender) {
  59. appender->callback = std::move(callback);
  60. plogInit(severity, nullptr); // change the severity
  61. } else if (callback) {
  62. appender = new LogAppender();
  63. appender->callback = std::move(callback);
  64. plogInit(severity, appender);
  65. } else {
  66. plogInit(severity, nullptr); // log to cout
  67. }
  68. }
  69. void InitLogger(plog::Severity severity, plog::IAppender *appender) {
  70. plogInit(severity, appender);
  71. }
  72. void Preload() { impl::Init::Instance().preload(); }
  73. std::shared_future<void> Cleanup() { return impl::Init::Instance().cleanup(); }
  74. void SetSctpSettings(SctpSettings s) { impl::Init::Instance().setSctpSettings(std::move(s)); }
  75. RTC_CPP_EXPORT std::ostream &operator<<(std::ostream &out, LogLevel level) {
  76. switch (level) {
  77. case LogLevel::Fatal:
  78. out << "fatal";
  79. break;
  80. case LogLevel::Error:
  81. out << "error";
  82. break;
  83. case LogLevel::Warning:
  84. out << "warning";
  85. break;
  86. case LogLevel::Info:
  87. out << "info";
  88. break;
  89. case LogLevel::Debug:
  90. out << "debug";
  91. break;
  92. case LogLevel::Verbose:
  93. out << "verbose";
  94. break;
  95. default:
  96. out << "none";
  97. break;
  98. }
  99. return out;
  100. }
  101. } // namespace rtc