|
@@ -20,24 +20,40 @@ class file_appender : public appender {
|
|
|
public:
|
|
public:
|
|
|
static std::shared_ptr<appender> create(properties const&);
|
|
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;
|
|
void flush() override;
|
|
|
private:
|
|
private:
|
|
|
|
|
+ bool flush_immediately_{false};
|
|
|
std::ofstream out_;
|
|
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 {
|
|
namespace {
|
|
|
bool _ = appenders::instance().bind("File", file_appender::create);
|
|
bool _ = appenders::instance().bind("File", file_appender::create);
|
|
|
}
|
|
}
|