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