console_logger.cxx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. //
  2. // console_logger.cxx
  3. // logging
  4. //
  5. // Created by Sam Jaffe on 4/1/19.
  6. //
  7. #include <iostream>
  8. #include "../../../../paradigm/declarative/expect/include/expect/expect.hpp"
  9. #include "../../../../types/resource_factory/include/resource_factory/prototype_factory.hpp"
  10. #include "logger/detail/logger_impl.h"
  11. #include "logger/log_manager.h"
  12. #include "logger/properties.h"
  13. using namespace logging;
  14. static std::string validate_or_throw(logging::properties const& props) {
  15. expects(props.type == properties::OBJECT, "expected properties to be a map");
  16. auto it = props.obj.find("target");
  17. expects(it != props.obj.end(), "expected a console target entry");
  18. expects(it->second.type == properties::STRING,
  19. "expected properties[\"target\"] to be a string");
  20. return it->second.value;
  21. }
  22. class console_logger : public logger_impl {
  23. public:
  24. static std::shared_ptr<logger_impl> create(properties const& props);
  25. explicit console_logger(std::ostream& os);
  26. void write(logpacket const & pkt) override;
  27. void flush() override;
  28. private:
  29. std::ostream& out_;
  30. };
  31. std::shared_ptr<logger_impl> console_logger::create(properties const& props) {
  32. const std::string target = validate_or_throw(props);
  33. if (target == "SYSTEM_OUT") {
  34. return std::make_shared<console_logger>(std::cout);
  35. } else if (target == "SYSTEM_ERR") {
  36. return std::make_shared<console_logger>(std::cerr);
  37. } else {
  38. throw std::logic_error{target + " is not a valid console"};
  39. }
  40. }
  41. console_logger::console_logger(std::ostream& os) : out_(os) {}
  42. void console_logger::write(logpacket const & pkt) {
  43. out_ << pkt.message;
  44. }
  45. void console_logger::flush() {
  46. out_.flush();
  47. }
  48. namespace {
  49. bool _ = impl_factory::instance().bind("Console", console_logger::create);
  50. }