Cleaned level loading from env var

This commit is contained in:
gabime
2020-09-27 02:08:24 +03:00
parent 7542e42e4f
commit 8923922f30
7 changed files with 51 additions and 48 deletions

View File

@@ -30,8 +30,7 @@ inline void load_argv_levels(int argc, const char **argv)
if (arg.find(spdlog_level_prefix) == 0)
{
auto levels_string = arg.substr(spdlog_level_prefix.size());
auto levels = helpers::extract_levels(levels_string);
details::registry::instance().set_levels(std::move(levels));
helpers::load_levels(levels_string);
}
}
}

View File

@@ -30,8 +30,7 @@ inline void load_env_levels()
auto env_val = details::os::getenv("SPDLOG_LEVEL");
if (!env_val.empty())
{
auto levels = helpers::extract_levels(env_val);
details::registry::instance().set_levels(std::move(levels));
helpers::load_levels(env_val);
}
}

View File

@@ -73,19 +73,22 @@ inline std::unordered_map<std::string, std::string> extract_key_vals_(const std:
continue;
}
auto kv = extract_kv_('=', token);
if (kv.first.empty())
{
kv.first = "*";
}
rv[kv.first] = kv.second;
}
return rv;
}
SPDLOG_INLINE std::unordered_map<std::string, spdlog::level::level_enum> extract_levels(const std::string &input)
SPDLOG_INLINE void load_levels(const std::string &input)
{
if (input.empty() || input.size() > 512)
{
return;
}
auto key_vals = extract_key_vals_(input);
std::unordered_map<std::string, spdlog::level::level_enum> rv;
std::unordered_map<std::string, level::level_enum> levels;
level::level_enum global_level = level::info;
bool global_level_found = false;
for (auto &name_level : key_vals)
{
@@ -97,9 +100,18 @@ SPDLOG_INLINE std::unordered_map<std::string, spdlog::level::level_enum> extract
{
continue;
}
rv[logger_name] = level;
if (logger_name.empty()) // no logger name indicate global level
{
global_level_found = true;
global_level = level;
}
else
{
levels[logger_name] = level;
}
}
return rv;
details::registry::instance().set_levels(std::move(levels), global_level_found ? &global_level : nullptr);
}
} // namespace helpers

View File

@@ -18,7 +18,7 @@ namespace helpers {
// turn off all logging except for logger1: "off,logger1=debug"
// turn off all logging except for logger1 and logger2: "off,logger1=debug,logger2=info"
//
SPDLOG_API std::unordered_map<std::string, spdlog::level::level_enum> extract_levels(const std::string &txt);
SPDLOG_API void load_levels(const std::string &txt);
} // namespace helpers
} // namespace cfg