LCOV - code coverage report
Current view: top level - libs/logger - logger_spdlog.cpp (source / functions) Hit Total Coverage
Test: cleared_cor.info Lines: 39 43 90.7 %
Date: 2019-03-07 14:46:43 Functions: 10 10 100.0 %

          Line data    Source code
       1             : /**
       2             :  * Copyright Soramitsu Co., Ltd. All Rights Reserved.
       3             :  * SPDX-License-Identifier: Apache-2.0
       4             :  */
       5             : 
       6             : #include "logger/logger_spdlog.hpp"
       7             : 
       8             : #include <atomic>
       9             : #include <mutex>
      10             : 
      11             : #define SPDLOG_FMT_EXTERNAL
      12             : 
      13             : #include <spdlog/sinks/stdout_color_sinks.h>
      14             : #include <spdlog/spdlog.h>
      15             : #include <boost/assert.hpp>
      16             : 
      17             : namespace {
      18             : 
      19             :   spdlog::level::level_enum getSpdlogLogLevel(logger::LogLevel level) {
      20       98815 :     static const std::map<logger::LogLevel, const spdlog::level::level_enum>
      21          87 :         kSpdLogLevels = {
      22             :             {logger::LogLevel::kTrace, spdlog::level::trace},
      23             :             {logger::LogLevel::kDebug, spdlog::level::debug},
      24             :             {logger::LogLevel::kInfo, spdlog::level::info},
      25             :             {logger::LogLevel::kWarn, spdlog::level::warn},
      26             :             {logger::LogLevel::kError, spdlog::level::err},
      27             :             {logger::LogLevel::kCritical, spdlog::level::critical}};
      28       98941 :     const auto it = kSpdLogLevels.find(level);
      29       98948 :     BOOST_ASSERT_MSG(it != kSpdLogLevels.end(), "Unknown log level!");
      30       99010 :     return it == kSpdLogLevels.end()
      31           0 :         ? kSpdLogLevels.at(logger::kDefaultLogLevel)
      32       98945 :         : it->second;
      33           0 :   }
      34             : 
      35             :   std::shared_ptr<spdlog::logger> getOrCreateLogger(const std::string tag) {
      36        1505 :     std::shared_ptr<spdlog::logger> logger;
      37             :     try {
      38        1504 :       logger = spdlog::stdout_color_mt(tag);
      39        1502 :     } catch (const spdlog::spdlog_ex &) {
      40           3 :       logger = spdlog::get(tag);
      41           3 :     }
      42        1505 :     assert(logger);
      43        1505 :     return logger;
      44        1505 :   }
      45             : 
      46             : }  // namespace
      47             : 
      48             : namespace logger {
      49             : 
      50             :   LogPatterns getDefaultLogPatterns() {
      51          89 :     static std::atomic_flag is_initialized = ATOMIC_FLAG_INIT;
      52          89 :     static LogPatterns default_patterns;
      53          89 :     if (not is_initialized.test_and_set()) {
      54          87 :       default_patterns.setPattern(
      55          87 :           LogLevel::kTrace, R"([%Y-%m-%d %H:%M:%S.%F] [th:%t] [%5l] [%n]: %v)");
      56          87 :       default_patterns.setPattern(LogLevel::kInfo,
      57          87 :                                   R"([%Y-%m-%d %H:%M:%S.%F] [%L] [%n]: %v)");
      58          87 :     }
      59          89 :     return default_patterns;
      60           0 :   }
      61             : 
      62             :   void LogPatterns::setPattern(LogLevel level, std::string pattern) {
      63         174 :     patterns_[level] = pattern;
      64         174 :   }
      65             : 
      66             :   std::string LogPatterns::getPattern(LogLevel level) const {
      67        1506 :     for (auto it = patterns_.rbegin(); it != patterns_.rend(); ++it) {
      68        1505 :       if (it->first <= level) {
      69        1505 :         return it->second;
      70             :       }
      71           0 :     }
      72           1 :     return getDefaultLogPatterns().getPattern(level);
      73        1506 :   }
      74             : 
      75             :   LoggerSpdlog::LoggerSpdlog(std::string tag, ConstLoggerConfigPtr config)
      76        1505 :       : tag_(tag), config_(std::move(config)), logger_(getOrCreateLogger(tag)) {
      77        1504 :     setupLogger();
      78        1505 :   }
      79             : 
      80             :   void LoggerSpdlog::setupLogger() {
      81        1505 :     logger_->set_level(getSpdlogLogLevel(config_->log_level));
      82        1505 :     logger_->set_pattern(config_->patterns.getPattern(config_->log_level));
      83        1505 :   }
      84             : 
      85             :   void LoggerSpdlog::logInternal(Level level, const std::string &s) const {
      86       97412 :     logger_->log(getSpdlogLogLevel(config_->log_level), s);
      87       97412 :   }
      88             : 
      89             :   bool LoggerSpdlog::shouldLog(Level level) const {
      90      171968 :     return config_->log_level <= level;
      91             :   }
      92             : }  // namespace logger

Generated by: LCOV version 1.13