#ifndef LOG_H #define LOG_H #include #include #include #include #include "well_known.h" enum class LOGLEVEL { INFO, WARN, ERR, VIRUS, RISK }; std::string get_loglevel(LOGLEVEL level); template void log(LOGLEVEL level, const std::string& message, Args&&... args) { std::string prefix = get_loglevel(level); std::time_t now = std::time(nullptr); std::tm tm; localtime_s(&tm, &now); int error = 0; std::ostringstream logStream; logStream << std::put_time(&tm, "%Y-%m-%d %H:%M:%S") << " " << prefix << " " << message; if constexpr (sizeof...(args) > 0) { ((logStream << ' ' << std::forward(args)), ...); } logStream << std::endl; std::string logString = logStream.str(); printf("info from logger: %s", logString.c_str()); // Open the file based on log level FILE* fp; switch (level) { case LOGLEVEL::INFO: error=fopen_s(&fp, INFOFILE, "a"); break; case LOGLEVEL::WARN: error=fopen_s(&fp, WARNFILE, "a"); break; case LOGLEVEL::ERR: error=fopen_s(&fp, ERRORFILE, "a"); break; case LOGLEVEL::VIRUS: error=fopen_s(&fp, VIRUSFILE, "a"); break; case LOGLEVEL::RISK: error=fopen_s(&fp, RISKFILE, "a"); break; default: error=fopen_s(&fp, LOGFILE, "a"); break; } if (error != 0) { //panic, create log entry, return 1; //printf("a"); return; } else { switch (level) { case LOGLEVEL::INFO: fprintf_s(fp, "%s", logString.c_str()); break; case LOGLEVEL::WARN: fprintf_s(fp, "%s", logString.c_str()); break; case LOGLEVEL::ERR: fprintf_s(fp, "%s", logString.c_str()); break; case LOGLEVEL::VIRUS: fprintf_s(fp, "%s", logString.c_str()); break; case LOGLEVEL::RISK: fprintf_s(fp, "%s", logString.c_str()); break; default: fprintf_s(fp, "%s", logString.c_str()); break; } fclose(fp); if (fopen_s(&fp, LOGFILE, "a") == 0) { fprintf_s(fp, "%s", logString.c_str()); fclose(fp); } } } #endif // LOGGER_H