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
|