#include "logging/logger.hpp" #include "config/config.hpp" #include "fslib.hpp" #include #include #include #include #include #include namespace { constexpr const char *PATH_JKSV_LOG = "sdmc:/config/JKSV/JKSV.log"; /// @brief This is the buffer size for log strings. constexpr size_t VA_BUFFER_SIZE = 0x1000; constexpr size_t TIME_BUFFER = 0x80; constexpr int64_t SIZE_LOG_LIMIT = 0x10000; } // namespace void logger::initialize() { // Can't really log errors for the log before it exists? const fslib::Path logPath{PATH_JKSV_LOG}; const bool exists = fslib::file_exists(logPath); if (!exists) { fslib::create_file(logPath); } } void logger::log(const char *format, ...) noexcept { static std::mutex logLock{}; static const fslib::Path logPath{PATH_JKSV_LOG}; std::array vaBuffer = {0}; std::va_list vaList{}; va_start(vaList, format); vsnprintf(vaBuffer.data(), VA_BUFFER_SIZE, format, vaList); va_end(vaList); std::array timeDateBuffer{}; std::time_t currentTime = std::time(nullptr); std::tm localTime = *std::localtime(¤tTime); std::strftime(timeDateBuffer.data(), TIME_BUFFER, "[%c] ", &localTime); std::lock_guard logGuard(logLock); fslib::File logFile(logPath, FsOpenMode_Append); if (logFile.is_open() && logFile.get_size() >= SIZE_LOG_LIMIT) { logFile.close(); logFile.open(logPath, FsOpenMode_Create | FsOpenMode_Write); } if (!logFile.is_open()) { return; } logFile << timeDateBuffer.data() << vaBuffer.data() << "\n"; logFile.flush(); }