in libminifi/src/core/logging/LoggerConfiguration.cpp [192:268]
std::shared_ptr<internal::LoggerNamespace> LoggerConfiguration::initialize_namespaces(const std::shared_ptr<LoggerProperties> &logger_properties, const std::shared_ptr<Logger> &logger) {
std::map<std::string, std::shared_ptr<spdlog::sinks::sink>> sink_map = logger_properties->initial_sinks();
std::string appender = "appender";
for (auto const & appender_key : logger_properties->get_keys_of_type(appender)) {
std::string appender_name = appender_key.substr(appender.length() + 1);
std::string appender_type;
if (!logger_properties->getString(appender_key, appender_type)) {
appender_type = "stderr";
}
std::transform(appender_type.begin(), appender_type.end(), appender_type.begin(), ::tolower);
if ("nullappender" == appender_type || "null appender" == appender_type || "null" == appender_type) {
sink_map[appender_name] = std::make_shared<spdlog::sinks::null_sink_st>();
} else if ("rollingappender" == appender_type || "rolling appender" == appender_type || "rolling" == appender_type) {
sink_map[appender_name] = getRotatingFileSink(appender_key, logger_properties);
} else if ("stdout" == appender_type) {
sink_map[appender_name] = std::make_shared<spdlog::sinks::stdout_sink_mt>();
} else if ("stderr" == appender_type) {
sink_map[appender_name] = std::make_shared<spdlog::sinks::stderr_sink_mt>();
} else if ("syslog" == appender_type) {
sink_map[appender_name] = LoggerConfiguration::create_syslog_sink();
} else if ("alert" == appender_type) {
if (auto sink = AlertSink::create(appender_key, logger_properties, logger)) {
sink_map[appender_name] = sink;
}
} else {
sink_map[appender_name] = LoggerConfiguration::create_fallback_sink();
}
}
std::shared_ptr<internal::LoggerNamespace> root_namespace = std::make_shared<internal::LoggerNamespace>();
std::string logger_type = "logger";
for (auto const & logger_key : logger_properties->get_keys_of_type(logger_type)) {
std::string logger_def;
if (!logger_properties->getString(logger_key, logger_def)) {
continue;
}
bool first = true;
spdlog::level::level_enum level = spdlog::level::info;
std::vector<std::shared_ptr<spdlog::sinks::sink>> sinks;
for (auto const & segment : utils::StringUtils::split(logger_def, ",")) {
std::string level_name = utils::StringUtils::trim(segment);
if (first) {
first = false;
auto opt_level = utils::parse_log_level(level_name);
if (opt_level) {
level = *opt_level;
}
} else {
if (auto it = sink_map.find(level_name); it != sink_map.end()) {
sinks.push_back(it->second);
} else {
logger->log_error("Couldn't find sink '%s'", level_name);
}
}
}
std::shared_ptr<internal::LoggerNamespace> current_namespace = root_namespace;
if (logger_key != "logger.root") {
for (auto const & name : utils::StringUtils::split(logger_key.substr(logger_type.length() + 1, logger_key.length() - logger_type.length()), "::")) {
auto child_pair = current_namespace->children.find(name);
std::shared_ptr<internal::LoggerNamespace> child;
if (child_pair == current_namespace->children.end()) {
child = std::make_shared<internal::LoggerNamespace>();
current_namespace->children[name] = child;
} else {
child = child_pair->second;
}
current_namespace = child;
}
}
current_namespace->level = level;
current_namespace->has_level = true;
current_namespace->sinks = sinks;
}
return root_namespace;
}