Bladeren bron

Start adding default configurations to appenders.
- File Appender

Sam Jaffe 6 jaren geleden
bovenliggende
commit
7629866d98
3 gewijzigde bestanden met toevoegingen van 37 en 7 verwijderingen
  1. 2 0
      include/logger/properties.h
  2. 18 7
      src/loggers/file_appender.cxx
  3. 17 0
      src/loggers/properties.cxx

+ 2 - 0
include/logger/properties.h

@@ -20,6 +20,8 @@ namespace logging {
   using array_t = std::vector<properties>;
 
   struct properties {
+    properties mergedWith(properties const & other) const;
+    
     bool contains(std::string const & key) const;
     bool contains(std::size_t idx) const;
     

+ 18 - 7
src/loggers/file_appender.cxx

@@ -16,6 +16,10 @@
 
 using namespace logging;
 
+namespace logging {
+  level level_from_string(std::string const & value);
+}
+
 class file_appender : public appender {
 public:
   static std::shared_ptr<appender> create(properties const&);
@@ -29,12 +33,21 @@ private:
   std::ofstream out_;
 };
 
-static bool is_append(properties const & props) {
-  return props.contains("append") && props["append"];
-}
+using namespace logging::property;
+properties const DEFAULT_FILE_APPENDER{_obj({
+  {"immediateFlush", _v(true)},
+  {"threshold", _v("ERROR")},
+  {"filename", {}}, // Will throw if accessed
+  {"fileAppend", _v(true)}/*,
+  {"bufferedIO", _v(false)},
+  {"bufferSize", _v(8192)}*/
+})};
 
 std::shared_ptr<appender> file_appender::create(properties const & props) {
-  file_appender app(props["file"], is_append(props));
+  properties const actual = DEFAULT_FILE_APPENDER.mergedWith(props);
+  file_appender app(actual["filename"], actual["fileAppend"]);
+  app.flush_immediately_ = actual["immediateFlush"];
+  app.min_log_level = level_from_string(actual["threshold"]);
   return std::make_shared<file_appender>(std::move(app));
 }
 
@@ -47,9 +60,7 @@ file_appender::file_appender(const std::string& fname, bool append)
 
 void file_appender::write(std::string const & msg) {
   out_ << msg;
-  if (flush_immediately_) {
-    flush();
-  }
+  if (flush_immediately_) { flush(); }
 }
 
 void file_appender::flush() { out_.flush(); }

+ 17 - 0
src/loggers/properties.cxx

@@ -57,6 +57,23 @@ namespace logging {
     })}
   })};
   
+  properties properties::mergedWith(properties const & other) const {
+    if (data.is<object_t>()) {
+      properties out;
+      for (auto & pair : object()) {
+        auto & to = out.data.get<object_t>()[pair.first];
+        if (other.contains(pair.first)) {
+          to = pair.second.mergedWith(other[pair.first]);
+        } else {
+          to = pair.second;
+        }
+      }
+      return out;
+    } else {
+      return other;
+    }
+  }
+  
   bool properties::contains(std::string const & key) const {
     return data.is<object_t>() && object().count(key);
   }