Line data Source code
1 : #include "Logger.h" 2 : 3 : #include <spdlog/sinks/stdout_color_sinks.h> 4 : #include <spdlog/sinks/basic_file_sink.h> 5 : #include <spdlog/sinks/dist_sink.h> 6 : #include <spdlog/sinks/ostream_sink.h> 7 : 8 : namespace elsa 9 : { 10 0 : void Logger::setLevel(LogLevel level) 11 : { 12 0 : getInstance()._level = level; 13 : 14 : // set level globally (probably superfluous..) 15 0 : spdlog::set_level(convertLevelToSpdlog(level)); 16 : 17 : // set level for all active loggers 18 0 : for (auto& [key, logger] : getInstance()._loggers) 19 0 : logger->set_level(convertLevelToSpdlog(level)); 20 0 : } 21 : 22 0 : std::shared_ptr<spdlog::sinks::dist_sink_st> Logger::initSinks() 23 : { 24 0 : auto sink = std::make_shared<spdlog::sinks::dist_sink_st>(); 25 : 26 : // Add a console output sink 27 0 : sink->add_sink(std::make_shared<spdlog::sinks::stdout_color_sink_mt>()); 28 : 29 : // If a filename is set, also add a file output sink 30 0 : if (getInstance()._fileName != "") 31 0 : sink->add_sink( 32 0 : std::make_shared<spdlog::sinks::basic_file_sink_st>(getInstance()._fileName)); 33 : 34 0 : return sink; 35 0 : } 36 : 37 0 : std::shared_ptr<spdlog::sinks::dist_sink_st> Logger::sinks() 38 : { 39 0 : static auto sink = initSinks(); 40 0 : return sink; 41 : } 42 : 43 0 : std::shared_ptr<spdlog::logger> Logger::get(std::string name) 44 : { 45 : // If we don't have sinks setup yet, initialize it 46 : 47 0 : if (getInstance()._loggers.count(name) == 0) { 48 0 : auto newLogger = std::make_shared<spdlog::logger>(name, sinks()); 49 0 : newLogger->set_level(convertLevelToSpdlog(getInstance()._level)); 50 0 : getInstance()._loggers[name] = newLogger; 51 0 : } 52 : 53 0 : return getInstance()._loggers[name]; 54 : } 55 : 56 0 : void Logger::enableFileLogging(std::string filename) 57 : { 58 0 : getInstance()._fileName = std::move(filename); 59 : 60 0 : sinks()->add_sink( 61 0 : std::make_shared<spdlog::sinks::basic_file_sink_st>(getInstance()._fileName)); 62 : 63 : // for (auto& [key, logger] : getInstance()._loggers) {} 64 0 : } 65 : 66 0 : void Logger::flush() 67 : { 68 0 : for (auto& [key, logger] : getInstance()._loggers) { 69 0 : for (auto sink : logger->sinks()) 70 0 : sink->flush(); 71 : } 72 0 : } 73 : 74 0 : void Logger::addSink(std::ostream& os) 75 : { 76 0 : sinks()->add_sink(std::make_shared<spdlog::sinks::ostream_sink_st>(os)); 77 : // for (auto& [key, logger] : getInstance()._loggers) { 78 : // auto distSink = dynamic_cast<spdlog::sinks::dist_sink_st*>(logger->sinks()[0].get()); 79 : // if (distSink) { 80 : // distSink->add_sink(std::make_shared<spdlog::sinks::ostream_sink_st>(os)); 81 : // } 82 : // } 83 0 : } 84 : 85 0 : Logger& Logger::getInstance() 86 : { 87 0 : static Logger instance; 88 0 : return instance; 89 : } 90 : 91 0 : spdlog::level::level_enum Logger::convertLevelToSpdlog(Logger::LogLevel level) 92 : { 93 0 : switch (level) { 94 0 : case LogLevel::TRACE: 95 0 : return spdlog::level::trace; 96 0 : case LogLevel::DEBUG: 97 0 : return spdlog::level::debug; 98 0 : case LogLevel::INFO: 99 0 : return spdlog::level::info; 100 0 : case LogLevel::WARN: 101 0 : return spdlog::level::warn; 102 0 : case LogLevel::ERR: 103 0 : return spdlog::level::err; 104 0 : case LogLevel::CRITICAL: 105 0 : return spdlog::level::critical; 106 0 : case LogLevel::OFF: 107 0 : return spdlog::level::off; 108 0 : default: 109 0 : return spdlog::level::info; 110 : } 111 : } 112 : 113 : } // namespace elsa