浏览代码

Start fleshing out file_appender.

Sam Jaffe 6 年之前
父节点
当前提交
303cca38b5
共有 2 个文件被更改,包括 24 次插入8 次删除
  1. 1 1
      src/loggers/default_layout.cxx
  2. 23 7
      src/loggers/file_appender.cxx

+ 1 - 1
src/loggers/default_layout.cxx

@@ -23,7 +23,7 @@ std::shared_ptr<layout> default_layout::create(properties const &) {
 }
 
 std::string default_layout::format(logpacket const & pkt) const {
-  return pkt.message.str();
+  return pkt.message.str() + "\n";
 }
 
 namespace {

+ 23 - 7
src/loggers/file_appender.cxx

@@ -20,24 +20,40 @@ class file_appender : public appender {
 public:
   static std::shared_ptr<appender> create(properties const&);
   
-  explicit file_appender(const std::string& fname);
+  explicit file_appender(const std::string& fname, bool append);
   
+  void write(std::string const & msg) override;
   void flush() override;
 private:
+  bool flush_immediately_{false};
   std::ofstream out_;
 };
 
-std::shared_ptr<appender> file_appender::create(properties const&) {
-  return std::shared_ptr<appender>(); // TODO
+static bool is_append(properties const & props) {
+  return props.obj.count("append") && props["append"].value == "true";
 }
 
-file_appender::file_appender(const std::string& fname)
-: out_(fname) {}
+std::shared_ptr<appender> file_appender::create(properties const & props) {
+  file_appender app(props["file"], is_append(props));
+  return std::make_shared<file_appender>(std::move(app));
+}
 
-void file_appender::flush() {
-  out_.flush();
+static std::ios_base::openmode mode(bool append) {
+  return (append ? std::ios_base::app : 0) | std::ios_base::out;
 }
 
+file_appender::file_appender(const std::string& fname, bool append)
+: out_(fname, mode(append)) {}
+
+void file_appender::write(std::string const & msg) {
+  out_ << msg;
+  if (flush_immediately_) {
+    flush();
+  }
+}
+
+void file_appender::flush() { out_.flush(); }
+
 namespace {
   bool _ = appenders::instance().bind("File", file_appender::create);
 }