Sam Jaffe hace 6 años
padre
commit
36ff8d2a90
Se han modificado 1 ficheros con 29 adiciones y 36 borrados
  1. 29 36
      src/log_manager.cxx

+ 29 - 36
src/log_manager.cxx

@@ -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"];