2021-04-20 21:46:48 +02:00
|
|
|
#pragma once
|
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
#include <hex.hpp>
|
|
|
|
|
2022-02-02 17:19:50 +01:00
|
|
|
#include <chrono>
|
2022-09-19 16:54:19 +02:00
|
|
|
#include <mutex>
|
2022-02-02 17:19:50 +01:00
|
|
|
|
2021-04-20 21:46:48 +02:00
|
|
|
#include <fmt/core.h>
|
|
|
|
#include <fmt/color.h>
|
2022-02-02 17:19:50 +01:00
|
|
|
#include <fmt/chrono.h>
|
2021-04-20 21:46:48 +02:00
|
|
|
|
2023-05-22 13:24:48 +02:00
|
|
|
#include <wolv/io/file.hpp>
|
|
|
|
|
2021-04-20 21:46:48 +02:00
|
|
|
namespace hex::log {
|
|
|
|
|
2023-06-18 22:32:55 +02:00
|
|
|
namespace impl {
|
|
|
|
|
|
|
|
FILE *getDestination();
|
|
|
|
wolv::io::File& getFile();
|
|
|
|
bool isRedirected();
|
|
|
|
[[maybe_unused]] void redirectToFile();
|
|
|
|
|
2023-07-23 23:37:47 +02:00
|
|
|
extern std::mutex g_loggerMutex;
|
2023-06-18 22:32:55 +02:00
|
|
|
|
2023-07-23 23:37:47 +02:00
|
|
|
struct LogEntry {
|
|
|
|
std::string project;
|
|
|
|
std::string level;
|
|
|
|
std::string message;
|
|
|
|
};
|
|
|
|
|
|
|
|
std::vector<LogEntry>& getLogEntries();
|
2023-06-18 22:32:55 +02:00
|
|
|
}
|
2022-02-06 00:42:38 +01:00
|
|
|
|
2022-02-02 17:19:50 +01:00
|
|
|
namespace {
|
|
|
|
|
2023-07-23 23:37:47 +02:00
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
[[maybe_unused]] void printPrefix(FILE *dest, const fmt::text_style &ts, const std::string &level) {
|
2023-05-06 10:07:22 +02:00
|
|
|
const auto now = fmt::localtime(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()));
|
2022-02-16 21:31:47 +01:00
|
|
|
|
|
|
|
fmt::print(dest, "[{0:%H:%M:%S}] ", now);
|
|
|
|
|
2023-06-18 22:32:55 +02:00
|
|
|
if (impl::isRedirected())
|
2022-02-16 21:31:47 +01:00
|
|
|
fmt::print(dest, "{0} ", level);
|
|
|
|
else
|
|
|
|
fmt::print(dest, ts, "{0} ", level);
|
|
|
|
|
|
|
|
fmt::print(dest, "[{0}] ", IMHEX_PROJECT_NAME);
|
2023-09-03 11:45:20 +02:00
|
|
|
|
|
|
|
constexpr static auto ProjectNameLength = std::char_traits<char>::length(IMHEX_PROJECT_NAME);
|
2023-09-03 14:07:47 +02:00
|
|
|
fmt::print(dest, "{}", std::string(ProjectNameLength > 10 ? 0 : 10 - ProjectNameLength, ' '));
|
2022-02-02 17:19:50 +01:00
|
|
|
}
|
|
|
|
|
2022-02-06 00:42:38 +01:00
|
|
|
template<typename... T>
|
2022-03-27 00:01:28 +01:00
|
|
|
[[maybe_unused]] void print(const fmt::text_style &ts, const std::string &level, const std::string &fmt, auto... args) {
|
2023-07-23 23:37:47 +02:00
|
|
|
std::scoped_lock lock(impl::g_loggerMutex);
|
2023-06-12 08:24:36 +02:00
|
|
|
|
2023-06-18 22:32:55 +02:00
|
|
|
auto dest = impl::getDestination();
|
2022-02-16 21:31:47 +01:00
|
|
|
printPrefix(dest, ts, level);
|
2023-07-23 23:37:47 +02:00
|
|
|
|
|
|
|
auto message = fmt::format(fmt::runtime(fmt), args...);
|
|
|
|
fmt::print(dest, "{}\n", message);
|
2023-08-26 01:44:10 +02:00
|
|
|
fflush(dest);
|
2023-07-23 23:37:47 +02:00
|
|
|
|
|
|
|
impl::getLogEntries().push_back({ IMHEX_PROJECT_NAME, level, std::move(message) });
|
2022-02-06 00:42:38 +01:00
|
|
|
}
|
|
|
|
|
2022-01-17 20:06:00 +01:00
|
|
|
}
|
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
[[maybe_unused]] void debug(const std::string &fmt, auto &&...args) {
|
2023-07-23 23:37:47 +02:00
|
|
|
#if defined(DEBUG)
|
|
|
|
hex::log::print(fg(fmt::color::light_green) | fmt::emphasis::bold, "[DEBUG]", fmt, args...);
|
|
|
|
#else
|
|
|
|
impl::getLogEntries().push_back({ IMHEX_PROJECT_NAME, "[DEBUG]", fmt::format(fmt::runtime(fmt), args...) });
|
|
|
|
#endif
|
2021-04-20 21:46:48 +02:00
|
|
|
}
|
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
[[maybe_unused]] void info(const std::string &fmt, auto &&...args) {
|
2022-04-07 12:47:45 +02:00
|
|
|
hex::log::print(fg(fmt::color::cadet_blue) | fmt::emphasis::bold, "[INFO] ", fmt, args...);
|
2021-04-20 21:46:48 +02:00
|
|
|
}
|
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
[[maybe_unused]] void warn(const std::string &fmt, auto &&...args) {
|
2022-04-07 12:47:45 +02:00
|
|
|
hex::log::print(fg(fmt::color::orange) | fmt::emphasis::bold, "[WARN] ", fmt, args...);
|
2021-04-20 21:46:48 +02:00
|
|
|
}
|
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
[[maybe_unused]] void error(const std::string &fmt, auto &&...args) {
|
2022-04-07 12:47:45 +02:00
|
|
|
hex::log::print(fg(fmt::color::red) | fmt::emphasis::bold, "[ERROR]", fmt, args...);
|
2021-04-20 21:46:48 +02:00
|
|
|
}
|
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
[[maybe_unused]] void fatal(const std::string &fmt, auto &&...args) {
|
2022-04-07 12:47:45 +02:00
|
|
|
hex::log::print(fg(fmt::color::purple) | fmt::emphasis::bold, "[FATAL]", fmt, args...);
|
2021-04-20 21:46:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|