file_appender.cxx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. //
  2. // file_logger.cxx
  3. // logging
  4. //
  5. // Created by Sam Jaffe on 4/1/19.
  6. //
  7. #include <fstream>
  8. #include "../../../../paradigm/declarative/expect/include/expect/expect.hpp"
  9. #include "../../../../types/resource_factory/include/resource_factory/prototype_factory.hpp"
  10. #include "logger/detail/appender.h"
  11. #include "logger/log_manager.h"
  12. #include "logger/properties.h"
  13. using namespace logging;
  14. class file_appender : public appender {
  15. public:
  16. static std::shared_ptr<appender> create(properties const&);
  17. explicit file_appender(const std::string& fname, bool append);
  18. void write(std::string const & msg) override;
  19. void flush() override;
  20. private:
  21. bool flush_immediately_{false};
  22. std::ofstream out_;
  23. };
  24. static bool is_append(properties const & props) {
  25. return props.contains("append") && props["append"];
  26. }
  27. std::shared_ptr<appender> file_appender::create(properties const & props) {
  28. file_appender app(props["file"], is_append(props));
  29. return std::make_shared<file_appender>(std::move(app));
  30. }
  31. static std::ios_base::openmode mode(bool append) {
  32. return (append ? std::ios_base::app : 0) | std::ios_base::out;
  33. }
  34. file_appender::file_appender(const std::string& fname, bool append)
  35. : out_(fname, mode(append)) {}
  36. void file_appender::write(std::string const & msg) {
  37. out_ << msg;
  38. if (flush_immediately_) {
  39. flush();
  40. }
  41. }
  42. void file_appender::flush() { out_.flush(); }
  43. namespace {
  44. bool _ = appenders::instance().bind("File", file_appender::create);
  45. }