|
|
@@ -14,23 +14,70 @@
|
|
|
#include "../../../types/resource_factory/include/resource_factory/prototype_factory.hpp"
|
|
|
|
|
|
#include "logger/c_logger.h"
|
|
|
-#include "logger/detail/logger_impl.h"
|
|
|
#include "logger/exception.h"
|
|
|
#include "logger/logger.h"
|
|
|
#include "logger/properties.h"
|
|
|
+#include "logger_impl.h"
|
|
|
|
|
|
-INSTANTIATE_PROTOTYPE_FACTORY_2(logging::impl_factory);
|
|
|
+INSTANTIATE_PROTOTYPE_FACTORY_2(logging::appenders);
|
|
|
+INSTANTIATE_PROTOTYPE_FACTORY_2(logging::layouts);
|
|
|
|
|
|
using namespace logging;
|
|
|
|
|
|
struct logging::manager_impl {
|
|
|
- std::shared_ptr<logger_impl> get_logger(properties const & props);
|
|
|
+ using p_appender = std::shared_ptr<appender>;
|
|
|
+ using p_layout = std::shared_ptr<layout>;
|
|
|
+ using p_logger = std::shared_ptr<logger_impl>;
|
|
|
|
|
|
- std::shared_ptr<logger_impl> default_logger;
|
|
|
- std::unordered_map<std::string, std::shared_ptr<logger_impl>> appenders;
|
|
|
- std::unordered_map<std::string, std::shared_ptr<logger_impl>> loggers;
|
|
|
+ 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, 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)});
|
|
|
+ } 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)});
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw invalid_property_type{"appenders cannot be a STRING"};
|
|
|
+ }
|
|
|
+ return out;
|
|
|
+}
|
|
|
+
|
|
|
manager::manager() : pimpl_(new manager_impl) {}
|
|
|
|
|
|
manager::~manager() {}
|
|
|
@@ -51,41 +98,15 @@ c_logger manager::c_get(std::string const & name) {
|
|
|
return c_logger(name, pimpl_->loggers.at(name));
|
|
|
}
|
|
|
|
|
|
-struct compound_logger : public logger_impl {
|
|
|
- void write(logpacket const & pkt) override {
|
|
|
- for (auto & log : values) { log->write(pkt); }
|
|
|
- }
|
|
|
- void flush() override {
|
|
|
- for (auto & log : values) { log->flush(); }
|
|
|
- }
|
|
|
- std::vector<std::shared_ptr<logger_impl>> values;
|
|
|
-};
|
|
|
-
|
|
|
-std::shared_ptr<logger_impl>
|
|
|
-manager_impl::get_logger(properties const & props) {
|
|
|
- if (props.type == properties::OBJECT) {
|
|
|
- // TODO include settings on the parent
|
|
|
- return appenders.at(props["ref"].value);
|
|
|
- } else if (props.type == properties::ARRAY) {
|
|
|
- auto out = std::make_shared<compound_logger>();
|
|
|
- for (auto & part : props.array) {
|
|
|
- out->values.push_back(get_logger(part));
|
|
|
- }
|
|
|
- return out;
|
|
|
- } else {
|
|
|
- throw invalid_property_type{"appenders cannot be a STRING"};
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
void manager::configure(properties const & props) {
|
|
|
- auto & factory = impl_factory::instance();
|
|
|
// 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_->appenders.emplace(app.first, factory.get(app.first, app.second));
|
|
|
+ pimpl_->load_appender(app.first, app.second);
|
|
|
+ pimpl_->load_layout(app.first, app.second);
|
|
|
}
|
|
|
|
|
|
auto & configs = props["configuration"]["loggers"];
|