|
|
@@ -24,53 +24,27 @@ INSTANTIATE_PROTOTYPE_FACTORY_2(logging::layouts);
|
|
|
|
|
|
using namespace logging;
|
|
|
|
|
|
+using p_appender = std::shared_ptr<appender>;
|
|
|
+using p_layout = std::shared_ptr<layout>;
|
|
|
+using p_logger = std::shared_ptr<logger_impl>;
|
|
|
+
|
|
|
struct logging::manager_impl {
|
|
|
- using p_appender = std::shared_ptr<appender>;
|
|
|
- using p_layout = std::shared_ptr<layout>;
|
|
|
- using p_logger = std::shared_ptr<logger_impl>;
|
|
|
-
|
|
|
- void load_appender(std::string const & name, properties const & props);
|
|
|
- void load_layout(std::string const & source, properties const & props);
|
|
|
p_logger get_logger(properties const & props);
|
|
|
|
|
|
p_logger default_logger;
|
|
|
- std::unordered_map<std::string, p_appender> appenders;
|
|
|
- std::unordered_map<std::string, p_layout> layouts;
|
|
|
+ std::unordered_map<std::string, std::pair<p_appender, p_layout>> appenders;
|
|
|
std::unordered_map<std::string, p_logger> loggers;
|
|
|
};
|
|
|
|
|
|
-void manager_impl::load_appender(std::string const & name,
|
|
|
- properties const & props) {
|
|
|
- auto & factory = appenders::instance();
|
|
|
- appenders.emplace(name, factory.get(name, props));
|
|
|
-}
|
|
|
-
|
|
|
-static bool is_layout(std::string const & str) {
|
|
|
- return str.find("Layout") != std::string::npos;
|
|
|
-}
|
|
|
-
|
|
|
-void manager_impl::load_layout(std::string const & source,
|
|
|
- properties const & props) {
|
|
|
- auto & factory = layouts::instance();
|
|
|
- for (auto & layout : props.obj) {
|
|
|
- if (is_layout(layout.first)) {
|
|
|
- layouts.emplace(source, factory.get(layout.first, layout.second));
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
std::shared_ptr<logger_impl>
|
|
|
manager_impl::get_logger(properties const & props) {
|
|
|
auto out = std::make_shared<logger_impl>();
|
|
|
if (props.type == properties::OBJECT) {
|
|
|
// TODO include settings on the parent
|
|
|
- std::string ref = props["ref"];
|
|
|
- out->impls_.push_back({appenders.at(ref), layouts.at(ref)});
|
|
|
+ out->impls_.push_back(appenders.at(props["ref"]));
|
|
|
} else if (props.type == properties::ARRAY) {
|
|
|
for (auto & part : props.array) {
|
|
|
- std::string ref = part["ref"];
|
|
|
- out->impls_.push_back({appenders.at(ref), layouts.at(ref)});
|
|
|
+ out->impls_.push_back(appenders.at(part["ref"]));
|
|
|
}
|
|
|
} else {
|
|
|
throw invalid_property_type{"appenders cannot be a STRING"};
|
|
|
@@ -78,6 +52,25 @@ manager_impl::get_logger(properties const & props) {
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
+static p_appender load_appender(std::string const & name,
|
|
|
+ properties const & props) {
|
|
|
+ return appenders::instance().get(name, props);
|
|
|
+}
|
|
|
+
|
|
|
+static bool is_layout(std::string const & str) {
|
|
|
+ return str.find("Layout") != std::string::npos;
|
|
|
+}
|
|
|
+
|
|
|
+static p_layout load_layout(std::string const & source,
|
|
|
+ properties const & props) {
|
|
|
+ for (auto & layout : props.obj) {
|
|
|
+ if (is_layout(layout.first)) {
|
|
|
+ return layouts::instance().get(layout.first, layout.second);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return layouts::instance().get("default", {});
|
|
|
+}
|
|
|
+
|
|
|
manager::manager() : pimpl_(new manager_impl) {}
|
|
|
|
|
|
manager::~manager() {}
|
|
|
@@ -98,15 +91,15 @@ c_logger manager::c_get(std::string const & name) {
|
|
|
return c_logger(name, pimpl_->loggers.at(name));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
void manager::configure(properties const & props) {
|
|
|
// TODO: Load logger_impl here
|
|
|
auto & impls = props["configuration"]["appenders"];
|
|
|
// TODO: Support multiple File loggers, etc.
|
|
|
expects(impls.type == properties::OBJECT);
|
|
|
for (auto & app : impls.obj) {
|
|
|
- pimpl_->load_appender(app.first, app.second);
|
|
|
- pimpl_->load_layout(app.first, app.second);
|
|
|
+ auto pair = std::make_pair(load_appender(app.first, app.second),
|
|
|
+ load_layout(app.first, app.second));
|
|
|
+ pimpl_->appenders.emplace(app.first, pair);
|
|
|
}
|
|
|
|
|
|
auto & configs = props["configuration"]["loggers"];
|