/ src / common / utils / logger_helper.h
logger_helper.h
  1  #pragma once
  2  
  3  #include <filesystem>
  4  #include <common/version/version.h>
  5  #include <common/SettingsAPI/settings_helpers.h>
  6  #include "../logger/logger.h"
  7  
  8  namespace LoggerHelpers
  9  {
 10      inline std::filesystem::path get_log_folder_path(std::wstring_view appPath)
 11      {
 12          std::filesystem::path logFolderPath(appPath);
 13          logFolderPath.append(LogSettings::logPath);
 14          logFolderPath.append(get_product_version());
 15          return logFolderPath;
 16      }
 17  
 18      inline bool delete_old_log_folder(const std::filesystem::path& logFolderPath)
 19      {
 20          try
 21          {
 22              std::filesystem::remove_all(logFolderPath);
 23              return true;
 24          }
 25          catch (std::filesystem::filesystem_error& e)
 26          {
 27              Logger::error("Failed to delete old log folder: {}", e.what());
 28          }
 29  
 30          return false;
 31      }
 32  
 33      inline bool dir_exists(std::filesystem::path dir)
 34      {
 35          std::error_code err;
 36          auto entry = std::filesystem::directory_entry(dir, err);
 37          if (err.value())
 38          {
 39              Logger::error("Failed to create directory entry. {}", err.message());
 40              return false;
 41          }
 42  
 43          return entry.exists();
 44      }
 45  
 46      inline bool delete_other_versions_log_folders(std::wstring_view appPath, const std::filesystem::path& currentVersionLogFolder)
 47      {
 48          bool result = true;
 49          std::filesystem::path logFolderPath(appPath);
 50          logFolderPath.append(LogSettings::logPath);
 51  
 52          if (!dir_exists(logFolderPath))
 53          {
 54              Logger::trace("Directory {} does not exist", logFolderPath.string());
 55              return true;
 56          }
 57  
 58          std::error_code err;
 59          auto folders = std::filesystem::directory_iterator(logFolderPath, err);
 60          if (err.value())
 61          {
 62              Logger::error("Failed to create directory iterator for {}. {}", logFolderPath.string(), err.message());
 63              return false;
 64          }
 65  
 66          for (const auto& dir : folders)
 67          {
 68              if (dir != currentVersionLogFolder)
 69              {
 70                  try
 71                  {
 72                      std::filesystem::remove_all(dir);
 73                  }
 74                  catch (std::filesystem::filesystem_error& e)
 75                  {
 76                      Logger::error("Failed to delete previous version log folder: {}", e.what());
 77                      result = false;
 78                  }                
 79              }
 80          }
 81  
 82          return result;
 83      }
 84  
 85      inline void init_logger(std::wstring moduleName, std::wstring internalPath, std::string loggerName)
 86      {
 87          std::filesystem::path rootFolder(PTSettingsHelper::get_module_save_folder_location(moduleName));
 88          rootFolder.append(internalPath);
 89          
 90          auto currentFolder = rootFolder;
 91          currentFolder.append(LogSettings::logPath);
 92          currentFolder.append(get_product_version());
 93  
 94          auto logsPath = currentFolder;
 95          logsPath.append(L"log.log");
 96          Logger::init(loggerName, logsPath.wstring(), PTSettingsHelper::get_log_settings_file_location());
 97  
 98          delete_other_versions_log_folders(rootFolder.wstring(), currentFolder); 
 99      }
100  }