MINIFICPP-1063 - Log directory location should be configurable

Signed-off-by: Arpad Boda <aboda@apache.org>

This closes #675
diff --git a/conf/minifi-log.properties b/conf/minifi-log.properties
index 55d07c3..7105ced 100644
--- a/conf/minifi-log.properties
+++ b/conf/minifi-log.properties
@@ -26,6 +26,7 @@
 #spdlog.pattern=[%D %H:%M:%S.%e] [%L] %v
 
 appender.rolling=rollingappender
+#appender.rolling.directory=${MINIFI_HOME}/logs
 appender.rolling.file_name=minifi-app.log
 appender.rolling.max_files=3
 appender.rolling.max_file_size=5242880
diff --git a/libminifi/src/core/logging/LoggerConfiguration.cpp b/libminifi/src/core/logging/LoggerConfiguration.cpp
index 0997f09..55b9d90 100644
--- a/libminifi/src/core/logging/LoggerConfiguration.cpp
+++ b/libminifi/src/core/logging/LoggerConfiguration.cpp
@@ -30,6 +30,7 @@
 #include "core/Core.h"
 #include "utils/StringUtils.h"
 #include "utils/ClassUtils.h"
+#include "utils/file/FileUtils.h"
 
 #include "spdlog/spdlog.h"
 #include "spdlog/sinks/stdout_sinks.h"
@@ -135,32 +136,23 @@
     if ("nullappender" == appender_type || "null appender" == appender_type || "null" == appender_type) {
       sink_map[appender_name] = std::make_shared<spdlog::sinks::null_sink_st>();
     } else if ("rollingappender" == appender_type || "rolling appender" == appender_type || "rolling" == appender_type) {
-      std::string file_name = "";
+      std::string file_name;
       if (!logger_properties->get(appender_key + ".file_name", file_name)) {
         file_name = "minifi-app.log";
       }
-      std::string directory = "";
-      directory = logger_properties->getHome();
-      if (!directory.empty()) {
-        // Create the log directory if needed
-        directory += "/logs";
-#ifdef WIN32
-        struct _stat logDirStat;
-        if (_stat(directory.c_str(), &logDirStat) != 0) {
-          if (_mkdir(directory.c_str()) == -1) {
-            exit(1);
-          }
-#else
-        struct stat logDirStat;
-        if (stat(directory.c_str(), &logDirStat) != 0 || !S_ISDIR(logDirStat.st_mode)) {
-          if (mkdir(directory.c_str(), 0777) == -1) {
-            exit(1);
-          }
-#endif
-        }
-        file_name = directory + "/" + file_name;
+      std::string directory;
+      if (!logger_properties->get(appender_key + ".directory", directory)) {
+        // The below part assumes logger_properties->getHome() is existing
+        // Cause minifiHome must be set at MiNiFiMain.cpp?
+        directory = logger_properties->getHome() + utils::file::FileUtils::get_separator() + "logs";
       }
 
+      if (utils::file::FileUtils::create_dir(directory) == -1) {
+        std::cerr << directory << " cannot be created\n";
+        exit(1);
+      }
+      file_name = directory + utils::file::FileUtils::get_separator() + file_name;
+
       int max_files = 3;
       std::string max_files_str = "";
       if (logger_properties->get(appender_key + ".max_files", max_files_str)) {