13 Commits

Author SHA1 Message Date
c5d3f7dc82 Updated README.md 2024-06-19 11:26:53 -04:00
aaa7318672 Merge remote-tracking branch 'origin/main' 2024-06-19 11:25:01 -04:00
95f2c761c7 Rewritten most functionality to be more generic and flexible. Cleaned up code as well. Implemented formatter system for easier wrapping. Made it easier for custom loggers to be built from jlog generics and primitives. Removed unused ultra short and short loggers to remove clutter. 2024-06-19 11:23:57 -04:00
Redacted
16d1eaa1ee Update README.md 2024-06-18 21:49:22 -04:00
Redacted
80d9bcd240 Update include/jlog/jlog.hpp
Fix definition clash when using in multiple projects.
2024-06-18 14:40:31 -04:00
2799c918b8 Implemented log level handling/switching. Use LOGLEVEL macro for setting level/severity. See jlog::severity in jlog.hpp for more information. 2024-06-18 12:11:41 -04:00
a86e70a055 Merge remote-tracking branch 'origin/main' 2024-06-18 11:10:20 -04:00
3cf70f5f4f removed todo from README 2024-06-18 11:10:13 -04:00
3a28d4e43b Update ansi_escape_codes.hpp
Fix problem that'd sometimes cause errors when using the macros in a lot of different files.
2024-06-18 00:44:07 -04:00
e5cfd25fcc Merge remote-tracking branch 'origin/main' 2024-06-17 13:51:29 -04:00
b0793828f6 Try to make dependency private 2024-06-17 13:51:18 -04:00
4b512df77a Windows color codes. 2024-06-16 18:52:05 -04:00
eb21b8a81f Windows 2024-06-16 11:07:24 -07:00
8 changed files with 478 additions and 292 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/cmake-build-debug
/.idea

View File

@@ -16,8 +16,14 @@ include(cmake/CPM.cmake)
file(GLOB_RECURSE jlog_HEADERS "include/jlog/*.h" "include/jlog/*.hpp") file(GLOB_RECURSE jlog_HEADERS "include/jlog/*.h" "include/jlog/*.hpp")
file(GLOB_RECURSE jlog_SRC "src/jlog/*.c" "src/jlog/*.cpp")
if(UNIX AND NOT APPLE)
file(GLOB_RECURSE jlog_SRC "src/jlog/linux/*.c" "src/jlog/linux/*.cpp")
endif()
if(WIN32)
file(GLOB_RECURSE jlog_SRC "src/jlog/windows/*.c" "src/jlog/windows/*.cpp")
endif()
include_directories("include") include_directories("include")
CPMAddPackage( CPMAddPackage(
@@ -42,7 +48,7 @@ install(FILES ${jlog_HEADERS} DESTINATION include/${PROJECT_NAME})
#add_subdirectory(tests) #add_subdirectory(tests)
target_link_libraries(jlog PUBLIC Event) target_link_libraries(jlog PRIVATE Event)
add_executable(LoggerDemo main.cpp) add_executable(LoggerDemo main.cpp)
target_link_libraries(LoggerDemo PUBLIC ${PROJECT_NAME}) target_link_libraries(LoggerDemo PUBLIC ${PROJECT_NAME})

View File

@@ -15,12 +15,11 @@ jlog is a C++ library for logging to file, console, and event callbacks.
## Installation ## Installation
Include this repository as a CPM dependency, and link against the library. Include this repository as a CPM dependency, and link against the library.
(TODO: Show the relevant CMake script lines.)
```cmake ```cmake
CPMAddPackage( CPMAddPackage(
NAME jlog NAME jlog
URL https://git.redacted.cc/josh/jlog/archive/Prerelease-2.zip URL https://git.redacted.cc/josh/jlog/archive/Prerelease-7.zip
) )
# ... # ...
include_directories(${jlog_SOURCE_DIR}/include) include_directories(${jlog_SOURCE_DIR}/include)
@@ -37,6 +36,8 @@ Using jlog is straightforward:
#include <jlog.h> #include <jlog.h>
int main() { int main() {
LOGLEVEL(jlog::severity::debug); // <- see jlog::severity for full list of log levels
INFO("This is barely useful information."); INFO("This is barely useful information.");
DEBUG("Debugging Information"); DEBUG("Debugging Information");
VERBOSE("Yadda Yadda Yadda"); VERBOSE("Yadda Yadda Yadda");
@@ -57,12 +58,10 @@ int main() {
* Custom Contexts: Allow users to specify custom logging contexts for better organization. * Custom Contexts: Allow users to specify custom logging contexts for better organization.
* Disable & sort by context (other categories?) * Disable & sort by context (other categories?)
* Custom Formats: Add support for custom log message formats.
* Documentation * Documentation
* Thread Safety * Thread Safety
* Memory Safety * Memory Safety
* Stream Support * Stream Support
* Identify File, Line, Function name via macros (I hate macros!!!)
## License ## License

View File

@@ -4,106 +4,136 @@
#include <cstdint> #include <cstdint>
#include <format> #include <format>
#define ESC "\033[" #ifdef _WIN32
#include <windows.h>
#endif
#ifdef _WIN32
namespace jlog::ansi_escape_codes namespace jlog::ansi_escape_codes
{ {
static const std::string CURSOR_HOME = "\033[H"; const WORD FG_BLACK = 0;
const WORD FG_RED = FOREGROUND_RED;
const WORD FG_GREEN = FOREGROUND_GREEN;
const WORD FG_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN;
const WORD FG_BLUE = FOREGROUND_BLUE;
const WORD FG_MAGENTA = FOREGROUND_RED | FOREGROUND_BLUE;
const WORD FG_CYAN = FOREGROUND_GREEN | FOREGROUND_BLUE;
const WORD FG_WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
const WORD FG_DEFAULT = FG_WHITE;
static const std::string ERASE_SCREEN_AFTER_CURSOR = "\033[0J"; const WORD FG_BRIGHT_BLACK = 0 | FOREGROUND_INTENSITY;
static const std::string ERASE_SCREEN_BEFORE_CURSOR = "\033[1J"; const WORD FG_BRIGHT_RED = FOREGROUND_RED | FOREGROUND_INTENSITY;
static const std::string ERASE_SCREEN_ALL = "\033[2J"; const WORD FG_BRIGHT_GREEN = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
static const std::string ERASE_LINE_AFTER_CURSOR = "\033[0K"; const WORD FG_BRIGHT_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
static const std::string ERASE_LINE_BEFORE_CURSOR = "\033[1K"; const WORD FG_BRIGHT_BLUE = FOREGROUND_BLUE | FOREGROUND_INTENSITY;
static const std::string ERASE_LINE_ALL = "\033[2K"; const WORD FG_BRIGHT_MAGENTA = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
const WORD FG_BRIGHT_CYAN = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
const WORD FG_BRIGHT_WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
static const std::string RESET = "\033[0m"; inline void SetConsoleTextColor(WORD color) {
static const std::string BOLD = "\033[1m"; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
static const std::string DIM = "\033[2m"; }
}
#else
namespace jlog::ansi_escape_codes
{
inline static const std::string CURSOR_HOME = "\033[H";
inline static const std::string ERASE_SCREEN_AFTER_CURSOR = "\033[0J";
inline static const std::string ERASE_SCREEN_BEFORE_CURSOR = "\033[1J";
inline static const std::string ERASE_SCREEN_ALL = "\033[2J";
inline static const std::string ERASE_LINE_AFTER_CURSOR = "\033[0K";
inline static const std::string ERASE_LINE_BEFORE_CURSOR = "\033[1K";
inline static const std::string ERASE_LINE_ALL = "\033[2K";
inline static const std::string RESET = "\033[0m";
inline static const std::string BOLD = "\033[1m";
inline static const std::string DIM = "\033[2m";
/// These are some examples of private modes, which are not defined by the spec, but are implemented in most terminals. /// These are some examples of private modes, which are not defined by the spec, but are implemented in most terminals.
/// @see xterm control sequences for a more in-depth list. /// @see xterm control sequences for a more in-depth list.
/// https://invisible-island.net/xterm/ctlseqs/ctlseqs.html /// https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
/// @note While these modes may be supported by most terminals, some may not work in multiplexers like tmux. /// @note While these modes may be supported by most terminals, some may not work in multiplexers like tmux.
static const std::string CURSOR_INVISIBLE = "\033[?25l"; inline static const std::string CURSOR_INVISIBLE = "\033[?25l";
static const std::string CURSOR_VISIBLE = "\033[?25h"; inline static const std::string CURSOR_VISIBLE = "\033[?25h";
static const std::string RESTORE_SCREEN = "\033[?47l"; inline static const std::string RESTORE_SCREEN = "\033[?47l";
static const std::string SAVE_SCREEN = "\033[?47h"; inline static const std::string SAVE_SCREEN = "\033[?47h";
static const std::string FG_BLACK = "\033[30m"; inline static const std::string FG_BLACK = "\033[30m";
static const std::string FG_RED = "\033[31m"; inline static const std::string FG_RED = "\033[31m";
static const std::string FG_GREEN = "\033[32m"; inline static const std::string FG_GREEN = "\033[32m";
static const std::string FG_YELLOW = "\033[33m"; inline static const std::string FG_YELLOW = "\033[33m";
static const std::string FG_BLUE = "\033[34m"; inline static const std::string FG_BLUE = "\033[34m";
static const std::string FG_MAGENTA = "\033[35m"; inline static const std::string FG_MAGENTA = "\033[35m";
static const std::string FG_CYAN = "\033[36m"; inline static const std::string FG_CYAN = "\033[36m";
static const std::string FG_WHITE = "\033[37m"; inline static const std::string FG_WHITE = "\033[37m";
static const std::string FG_DEFAULT = "\033[39m"; inline static const std::string FG_DEFAULT = "\033[39m";
static const std::string FG_BRIGHT_BLACK = "\033[90m"; inline static const std::string FG_BRIGHT_BLACK = "\033[90m";
static const std::string FG_BRIGHT_RED = "\033[91m"; inline static const std::string FG_BRIGHT_RED = "\033[91m";
static const std::string FG_BRIGHT_GREEN = "\033[92m"; inline static const std::string FG_BRIGHT_GREEN = "\033[92m";
static const std::string FG_BRIGHT_YELLOW = "\033[93m"; inline static const std::string FG_BRIGHT_YELLOW = "\033[93m";
static const std::string FG_BRIGHT_BLUE = "\033[94m"; inline static const std::string FG_BRIGHT_BLUE = "\033[94m";
static const std::string FG_BRIGHT_MAGENTA = "\033[95m"; inline static const std::string FG_BRIGHT_MAGENTA = "\033[95m";
static const std::string FG_BRIGHT_CYAN = "\033[96m"; inline static const std::string FG_BRIGHT_CYAN = "\033[96m";
static const std::string FG_BRIGHT_WHITE = "\033[97m"; inline static const std::string FG_BRIGHT_WHITE = "\033[97m";
static const std::string BG_BLACK = "\033[40m"; inline static const std::string BG_BLACK = "\033[40m";
static const std::string BG_RED = "\033[41m"; inline static const std::string BG_RED = "\033[41m";
static const std::string BG_GREEN = "\033[42m"; inline static const std::string BG_GREEN = "\033[42m";
static const std::string BG_YELLOW = "\033[43m"; inline static const std::string BG_YELLOW = "\033[43m";
static const std::string BG_BLUE = "\033[44m"; inline static const std::string BG_BLUE = "\033[44m";
static const std::string BG_MAGENTA = "\033[45m"; inline static const std::string BG_MAGENTA = "\033[45m";
static const std::string BG_CYAN = "\033[46m"; inline static const std::string BG_CYAN = "\033[46m";
static const std::string BG_WHITE = "\033[47m"; inline static const std::string BG_WHITE = "\033[47m";
static const std::string BG_DEFAULT = "\033[49m"; inline static const std::string BG_DEFAULT = "\033[49m";
static const std::string BG_BRIGHT_BLACK = "\033[100m"; inline static const std::string BG_BRIGHT_BLACK = "\033[100m";
static const std::string BG_BRIGHT_RED = "\033[101m"; inline static const std::string BG_BRIGHT_RED = "\033[101m";
static const std::string BG_BRIGHT_GREEN = "\033[102m"; inline static const std::string BG_BRIGHT_GREEN = "\033[102m";
static const std::string BG_BRIGHT_YELLOW = "\033[103m"; inline static const std::string BG_BRIGHT_YELLOW = "\033[103m";
static const std::string BG_BRIGHT_BLUE = "\033[104m"; inline static const std::string BG_BRIGHT_BLUE = "\033[104m";
static const std::string BG_BRIGHT_MAGENTA = "\033[105m"; inline static const std::string BG_BRIGHT_MAGENTA = "\033[105m";
static const std::string BG_BRIGHT_CYAN = "\033[106m"; inline static const std::string BG_BRIGHT_CYAN = "\033[106m";
static const std::string BG_BRIGHT_WHITE = "\033[107m"; inline static const std::string BG_BRIGHT_WHITE = "\033[107m";
std::string true_color(uint8_t r, uint8_t g, uint8_t b) inline std::string true_color(uint8_t r, uint8_t g, uint8_t b)
{ {
return std::format("\033[38;2;{};{};{}m", r, g, b); return std::format("\033[38;2;{};{};{}m", r, g, b);
} }
std::string cursor_to(int line, int col) inline std::string cursor_to(int line, int col)
{ {
return "";
} }
std::string cursor_up(int lines) inline std::string cursor_up(int lines)
{ {
return "";
} }
std::string cursor_down(int lines) inline std::string cursor_down(int lines)
{ {
return "";
} }
std::string cursor_left(int cols) inline std::string cursor_left(int cols)
{ {
return "";
} }
std::string cursor_right(int cols) inline std::string cursor_right(int cols)
{ {
return "";
} }
std::string cursor_to_col(int col) inline std::string cursor_to_col(int col)
{ {
return "";
} }
} }
#endif

View File

@@ -9,22 +9,34 @@
#include <format> #include <format>
#include <string> #include <string>
#include <iostream> #include <iostream>
#include <chrono>
#include <Event.h> #include <Event.h>
#include <fstream> #include <jlog/ansi_escape_codes.hpp>
#ifdef _WIN32
#include <windows.h>
#endif
#ifdef __linux__
#define FUNCTION __PRETTY_FUNCTION__
#endif
#ifdef _WIN32
#define FUNCTION __FUNCSIG__
#endif
namespace jlog namespace jlog
{ {
enum class severity enum class severity : uint8_t
{ {
none, none,
verbose,
debug,
warning, warning,
error, error,
fatal fatal,
verbose,
debug,
}; };
inline severity loglevel = severity::debug; // Default log level always debug
struct LogEntry struct LogEntry
{ {
severity level; severity level;
@@ -32,108 +44,106 @@ namespace jlog
std::string timestamp; std::string timestamp;
}; };
static Event<LogEntry> on_log = Event<LogEntry>(); static Event<LogEntry> on_log = Event<LogEntry>();
std::vector<LogEntry> log_history; inline std::vector<LogEntry> log_history;
struct token struct token
{ {
std::string colorCode = ""; #ifdef _WIN32
WORD colorCode = ansi_escape_codes::FG_DEFAULT;
#else
std::string colorCode = ansi_escape_codes::RESET;
#endif
std::string content = ""; std::string content = "";
std::string delimiter = "[]"; std::string delimiter = "[]";
}; };
std::string get_timestamp();
void log_to_console(const std::string& message);
void log_to_file(const std::string& message);
void log(std::vector<token> tokens); void log(std::vector<token> tokens);
void info (const std::string& message); // Generic formatters for building loggers.
void sinfo (const std::string& message); std::vector<token> trace_format(
void usinfo (const std::string& message); const std::string& func,
const std::string& file,
int line);
std::vector<token> log_format(
const std::string& severity_name,
const std::string& message,
const std::string& severity_colorCode = ansi_escape_codes::FG_WHITE);
void verbose(const std::string& message); std::vector<token> log_detailed_format(
void sverbose(const std::string& message); const std::string& severity_name,
void usverbose(const std::string& message); const std::string& message,
const std::string& func,
const std::string& file,
int line,
const std::string& severity_colorCode = ansi_escape_codes::FG_WHITE);
// Predefined generic loggers for jlog.
std::vector<token> info_format(const std::string& message);
void debug (const std::string& message); std::vector<token> info_detailed_format(
void sdebug (const std::string& message); const std::string &message,
void usdebug (const std::string& message); const std::string &func,
const std::string &file,
int line);
std::vector<token> warning_format(const std::string& message);
void warning(const std::string& message); std::vector<token> warning_detailed_format(
void swarning(const std::string& message); const std::string &message,
void uswarning(const std::string& message); const std::string &func,
const std::string &file,
int line);
std::vector<token> error_format(const std::string& message);
void error (const std::string& message); std::vector<token> error_detailed_format(
void serror (const std::string& message); const std::string &message,
void userror (const std::string& message); const std::string &func,
const std::string &file,
int line);
std::vector<token> fatal_format(const std::string& message);
void fatal (const std::string& message); std::vector<token> fatal_detailed_format(
void sfatal (const std::string& message); const std::string &message,
void usfatal (const std::string& message); const std::string &func,
const std::string &file,
int line);
std::vector<token> verbose_format(const std::string& message);
void info_spec(const std::string& message, const std::string& func, const std::string& file, int line); std::vector<token> verbose_detailed_format(
void sinfo_spec(const std::string& message, const std::string& func, const std::string& file, int line); const std::string &message,
void usinfo_spec(const std::string& message, const std::string& func, const std::string& file, int line); const std::string &func,
const std::string &file,
int line);
void verbose_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void sverbose_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void usverbose_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void debug_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void sdebug_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void usdebug_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void warning_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void swarning_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void uswarning_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void error_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void serror_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void userror_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void fatal_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void sfatal_spec(const std::string& message, const std::string& func, const std::string& file, int line);
void usfatal_spec(const std::string& message, const std::string& func, const std::string& file, int line);
std::vector<token> debug_format(const std::string& message);
std::vector<token> debug_detailed_format(
const std::string &message,
const std::string &func,
const std::string &file,
int line);
} }
#define INFO(i) jlog::info_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__); #define INFO(i) if (jlog::loglevel >= jlog::severity::none) { jlog::log(jlog::info_detailed_format(i, FUNCTION, __FILE__, __LINE__)); };
#define SINFO(i) jlog::sinfo_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define USINFO(i) jlog::usinfo_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define VERBOSE(i) if (jlog::loglevel >= jlog::severity::verbose) { jlog::log(jlog::verbose_detailed_format(i, FUNCTION, __FILE__, __LINE__)); };
#define VERBOSE(i) jlog::verbose_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__); #define DEBUG(i) if (jlog::loglevel >= jlog::severity::debug) { jlog::log(jlog::debug_detailed_format(i, FUNCTION, __FILE__, __LINE__)); };
#define SVERBOSE(i) jlog::sverbose_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define USVERBOSE(i) jlog::usverbose_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define WARNING(i) if (jlog::loglevel >= jlog::severity::warning) { jlog::log(jlog::warning_detailed_format(i, FUNCTION, __FILE__, __LINE__)); };
#define DEBUG(i) jlog::debug_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__); #define ERROR(i) if (jlog::loglevel >= jlog::severity::error) { jlog::log(jlog::error_detailed_format(i, FUNCTION, __FILE__, __LINE__)); };
#define SDEBUG(i) jlog::sdebug_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define USDEBUG(i) jlog::usdebug_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define FATAL(i) if (jlog::loglevel >= jlog::severity::fatal) { jlog::log(jlog::fatal_detailed_format(i, FUNCTION, __FILE__, __LINE__)); };
#define WARNING(i) jlog::warning_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__); #define LOGLEVEL(i) jlog::loglevel = i;
#define SWARNING(i) jlog::swarning_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define USWARNING(i) jlog::uswarning_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define ERROR(i) jlog::error_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define SERROR(i) jlog::serror_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define USERROR(i) jlog::userror_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define FATAL(i) jlog::fatal_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define SFATAL(i) jlog::sfatal_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);
#define USFATAL(i) jlog::usfatal_spec(i, __PRETTY_FUNCTION__, __FILE__, __LINE__);

View File

@@ -1,7 +1,22 @@
#include <jlog/jlog.hpp> #include <jlog/jlog.hpp>
// Writing custom wrappers for jlog is super easy!
void coollog(std::vector<jlog::token> tokens) {
std::vector<jlog::token> wtokens;
auto group = jlog::token{.content = "COOLLOGGER"};
wtokens.push_back(group);
wtokens.insert(wtokens.end(), tokens.begin(), tokens.end());
jlog::log(wtokens);
}
// We can either define custom logging macros or redefine jlog's builtin macros.
#define COOLINFO(i) coollog(jlog::info_format(i));
#define COOLINFOTRACE(i) coollog(jlog::info_detailed_format(i, FUNCTION, __FILE__, __LINE__));
int main() int main()
{ {
LOGLEVEL(jlog::severity::debug); // <- see jlog::severity for full list of log levels
INFO("This is barely useful information."); INFO("This is barely useful information.");
DEBUG("Debugging Information"); DEBUG("Debugging Information");
VERBOSE("Yadda Yadda Yadda"); VERBOSE("Yadda Yadda Yadda");
@@ -9,20 +24,17 @@ int main()
ERROR("Oops, something went wrong."); ERROR("Oops, something went wrong.");
FATAL("Unrecoverable Error!!!"); FATAL("Unrecoverable Error!!!");
SINFO("This is even less useful information."); COOLINFO("This is really cool!!!");
SDEBUG("Shorter Debugging Information"); COOLINFOTRACE("THIS IS EVEN COOLER!!!");
SVERBOSE("Yadda Yadda");
SWARNING("Minute miscalculation!");
SERROR("Oops, something went wrong, but the programmer used the short error logger so you're fucked!");
SFATAL("Unrecoverable Error, but the programmer used the short fatal logger so you're even more fucked!!!");
USINFO("This is EVEN less useful information.");
USDEBUG("Ultra compact debugging information.");
USVERBOSE("Isn't this an oxymoron?");
USWARNING("Captain Quark grade miscalculation!");
USERROR("You're fucked!");
USFATAL("You're super fucked!!!");
return 0; return 0;
///
} }
//Windows :(
#ifdef _WIN32
extern "C" {
int wmain(int argc, wchar_t* argv[]) {
return main();
}
}
#endif

178
src/jlog/linux/jlog.cpp Normal file
View File

@@ -0,0 +1,178 @@
#include <source_location>
#include <jlog/ansi_escape_codes.hpp>
#include <jlog/jlog.hpp>
#include <string>
#include <fstream>
namespace jlog {
std::string get_timestamp()
{
using namespace std::chrono;
auto const timestamp = current_zone()->to_local(system_clock::now());
auto dp = floor<days>(timestamp);
year_month_day ymd{floor<days>(timestamp)};
hh_mm_ss time{floor<milliseconds>(timestamp-dp)};
auto y = ymd.year();
auto m = ymd.month();
auto d = ymd.day();
auto h = time.hours();
auto M = time.minutes();
auto s = time.seconds();
auto ms = time.subseconds();
return std::format("{}-{}-{} {}:{}:{}.{}", y, m, d, h.count(), M.count(), s.count(), ms.count());
}
void log_to_console(const std::string &message)
{
std::cout << message;
}
void log_to_file(const std::string &message)
{
std::ofstream latest_log("latest.log", std::ios_base::app);
latest_log << message;
latest_log.close();
}
void log(std::vector<token> tokens) {
for (token t : tokens) {
if (t.delimiter != "") {
log_to_console(std::format("{}{}{}{}{} ", t.colorCode, t.delimiter[0], t.content, t.delimiter[1], ansi_escape_codes::RESET));
log_to_file(std::format("{}{}{} ", t.delimiter[0], t.content, t.delimiter[1]));
} else {
log_to_console(std::format("{}{}{} ", t.colorCode, t.content, ansi_escape_codes::RESET));
log_to_file(t.content + " ");
}
}
log_to_console("\n");
log_to_file("\n");
}
// Generic formatters for building loggers.
std::vector<token> trace_format(
const std::string& func,
const std::string& file,
int line)
{
auto trace = token{.content = func};
auto filedata = token{.content = std::format("{}:{}", file, line)};
return {trace, filedata};
}
std::vector<token> log_format(
const std::string& severity_name,
const std::string& message,
const std::string& severity_colorCode)
{
auto severity = token{.colorCode = severity_colorCode, .content = severity_name};
auto content = token{.content = message, .delimiter = ""};
return {severity, content};
}
std::vector<token> log_detailed_format(
const std::string& severity_name,
const std::string& message,
const std::string& func,
const std::string& file,
int line,
const std::string& severity_colorCode)
{
std::vector<token> tokens;
auto timestamp = token{.content = jlog::get_timestamp()};
auto tf_tokens = trace_format(func, file, line);
auto lf_tokens = log_format(severity_name, message, severity_colorCode);
tokens.push_back(timestamp);
tokens.insert(tokens.end(), tf_tokens.begin(), tf_tokens.end());
tokens.insert(tokens.end(), lf_tokens.begin(), lf_tokens.end());
return tokens;
}
// Predefined generic loggers for jlog.
std::vector<token> info_format(const std::string& message)
{
return log_format("INFO", message);
}
std::vector<token> info_detailed_format(
const std::string &message,
const std::string &func,
const std::string &file,
int line)
{
return log_detailed_format("INFO", message, func, file, line);
}
std::vector<token> warning_format(const std::string& message)
{
return log_format("INFO", message, ansi_escape_codes::FG_YELLOW);
}
std::vector<token> warning_detailed_format(
const std::string &message,
const std::string &func,
const std::string &file,
int line)
{
return log_detailed_format("WARNING", message, func, file, line, ansi_escape_codes::FG_YELLOW);
}
std::vector<token> error_format(const std::string& message)
{
return log_format("ERROR", message, ansi_escape_codes::FG_RED);
}
std::vector<token> error_detailed_format(
const std::string &message,
const std::string &func,
const std::string &file,
int line)
{
return log_detailed_format("ERROR", message, func, file, line, ansi_escape_codes::FG_RED);
}
std::vector<token> fatal_format(const std::string& message)
{
return log_format("FATAL", message, ansi_escape_codes::FG_BRIGHT_RED);
}
std::vector<token> fatal_detailed_format(
const std::string &message,
const std::string &func,
const std::string &file,
int line)
{
return log_detailed_format("FATAL", message, func, file, line, ansi_escape_codes::FG_BRIGHT_RED);
}
std::vector<token> verbose_format(const std::string& message)
{
return log_format("VERBOSE", message, ansi_escape_codes::FG_CYAN);
}
std::vector<token> verbose_detailed_format(
const std::string &message,
const std::string &func,
const std::string &file,
int line)
{
return log_detailed_format("VERBOSE", message, func, file, line, ansi_escape_codes::FG_CYAN);
}
std::vector<token> debug_format(const std::string& message)
{
return log_format("DEBUG", message, ansi_escape_codes::FG_GREEN);
}
std::vector<token> debug_detailed_format(
const std::string &message,
const std::string &func,
const std::string &file,
int line)
{
return log_detailed_format("DEBUG", message, func, file, line, ansi_escape_codes::FG_GREEN);
}
}

View File

@@ -2,14 +2,13 @@
#include <jlog/ansi_escape_codes.hpp> #include <jlog/ansi_escape_codes.hpp>
#include <jlog/jlog.hpp> #include <jlog/jlog.hpp>
#include <string> #include <string>
#include <chrono>
#include <fstream>
#include <iostream>
#include <windows.h>
namespace jlog { namespace jlog {
static std::string get_timestamp(); std::string get_timestamp() {
static void log_to_console(const std::string& message);
static void log_to_file(const std::string& message);
std::string get_timestamp()
{
using namespace std::chrono; using namespace std::chrono;
auto const timestamp = current_zone()->to_local(system_clock::now()); auto const timestamp = current_zone()->to_local(system_clock::now());
auto dp = floor<days>(timestamp); auto dp = floor<days>(timestamp);
@@ -25,55 +24,55 @@ namespace jlog {
return std::format("{}-{}-{} {}:{}:{}.{}", y, m, d, h.count(), M.count(), s.count(), ms.count()); return std::format("{}-{}-{} {}:{}:{}.{}", y, m, d, h.count(), M.count(), s.count(), ms.count());
} }
void log_to_console(const std::string &message) void log_to_console(const std::string& message) {
{
std::cout << message; std::cout << message;
} }
void log_to_file(const std::string &message) void log_to_file(const std::string& message) {
{
std::ofstream latest_log("latest.log", std::ios_base::app); std::ofstream latest_log("latest.log", std::ios_base::app);
latest_log << message; latest_log << message;
latest_log.close(); latest_log.close();
} }
void log(std::vector<token> tokens) { void log(std::vector<token> tokens) {
for (token t : tokens) { for (const token& t : tokens) {
if (t.delimiter != "") { if (!t.delimiter.empty()) {
log_to_console(std::format("{}{}{}{}{} ", t.colorCode, t.delimiter[0], t.content, t.delimiter[1], ansi_escape_codes::RESET)); ansi_escape_codes::SetConsoleTextColor(t.colorCode);
log_to_file(std::format("{}{}{} ", t.delimiter[0], t.content, t.delimiter[1])); log_to_console(std::string(1, t.delimiter[0]) + t.content + std::string(1, t.delimiter[1]) + " ");
log_to_file(std::string(1, t.delimiter[0]) + t.content + std::string(1, t.delimiter[1]) + " ");
} else { } else {
log_to_console(std::format("{}{}{} ", t.colorCode, t.content, ansi_escape_codes::RESET)); ansi_escape_codes::SetConsoleTextColor(t.colorCode);
log_to_console(t.content + " ");
log_to_file(t.content + " "); log_to_file(t.content + " ");
} }
} }
ansi_escape_codes::SetConsoleTextColor(ansi_escape_codes::FG_DEFAULT);
log_to_console("\n"); log_to_console("\n");
log_to_file("\n"); log_to_file("\n");
} }
void direct(const std::string &message) { log({{.content = message, .delimiter=""}});} void direct(const std::string& message) {
log({{.content = message, .delimiter = ""}});
}
std::vector<token> info_format(const std::string& message
void info(const std::string& message) { void info(const std::string& message) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"}; auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({timestamp, severity, content}); log({timestamp, severity, content});
} }
void sinfo(const std::string& message) { void sinfo(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"}; auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
} }
void usinfo(const std::string& message) { void usinfo(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"}; auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
} }
@@ -81,51 +80,37 @@ namespace jlog {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"}; auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({timestamp, severity, content}); log({timestamp, severity, content});
//log(ansi_escape_codes::FG_CYAN, "VERBOSE", message);
} }
void sverbose(const std::string& message) { void sverbose(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"}; auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
//log(ansi_escape_codes::FG_CYAN, "VERBOSE", message);
} }
void usverbose(const std::string& message) { void usverbose(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"}; auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
//log(ansi_escape_codes::FG_CYAN, "VERBOSE", message);
} }
void debug(const std::string& message) { void debug(const std::string& message) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"}; auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({timestamp, severity, content}); log({timestamp, severity, content});
} }
void sdebug(const std::string& message) { void sdebug(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"}; auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
} }
void usdebug(const std::string& message) { void usdebug(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"}; auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
} }
@@ -133,56 +118,62 @@ namespace jlog {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"}; auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({timestamp, severity, content}); log({timestamp, severity, content});
//log(ansi_escape_codes::FG_YELLOW, "WARNING", message); }
void swarning(const std::string& message) {
auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"};
auto content = token{.content = message, .delimiter = ""};
log({severity, content});
} }
void uswarning(const std::string& message) { void uswarning(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"}; auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
//log(ansi_escape_codes::FG_YELLOW, "WARNING", message);
} }
void error(const std::string& message) { void error(const std::string& message) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"}; auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({timestamp, severity, content}); log({timestamp, severity, content});
//log(ansi_escape_codes::FG_RED, "ERROR", message); }
void serror(const std::string& message) {
auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"};
auto content = token{.content = message, .delimiter = ""};
log({severity, content});
} }
void userror(const std::string& message) { void userror(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"}; auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = };
log({severity, content}); log({severity, content});
//log(ansi_escape_codes::FG_RED, "ERROR", message);
} }
void fatal(const std::string& message) { void fatal(const std::string& message) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"}; auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
log({timestamp, severity, content}); log({timestamp, severity, content});
} }
void sfatal(const std::string& message) {
auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"};
auto content = token{.content = message, .delimiter = ""};
log({severity, content});
}
void usfatal(const std::string& message) { void usfatal(const std::string& message) {
//auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"}; auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
log({severity, content}); log({severity, content});
} }
void info_spec(const std::string &message, const std::string &func, const std::string &file, void info_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"}; auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
@@ -191,30 +182,21 @@ namespace jlog {
log({timestamp, trace, filedata, severity, content}); log({timestamp, trace, filedata, severity, content});
} }
void sinfo_spec(const std::string &message, const std::string &func, const std::string &file, void sinfo_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"}; auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
auto trace = token{.content = func}; auto trace = token{.content = func};
auto filedata = token{.content = std::format("{}:{}", file, line)}; auto filedata = token{.content = std::format("{}:{}", file, line)};
log({trace, filedata, severity, content}); log({trace, filedata, severity, content});
//log({severity, content});
} }
void usinfo_spec(const std::string &message, const std::string &func, const std::string &file, void usinfo_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"}; auto severity = token{.colorCode = ansi_escape_codes::FG_WHITE, .content = "INFO"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = func};
//auto filedata = token{.content = std::format("{}:{}", file, line)};
//log({trace, filedata, severity, content});
log({severity, content}); log({severity, content});
} }
void verbose_spec(const std::string &message, const std::string &func, const std::string &file, void verbose_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"}; auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
@@ -223,9 +205,7 @@ namespace jlog {
log({timestamp, trace, filedata, severity, content}); log({timestamp, trace, filedata, severity, content});
} }
void sverbose_spec(const std::string &message, const std::string &func, const std::string &file, void sverbose_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"}; auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
auto trace = token{.content = func}; auto trace = token{.content = func};
@@ -233,18 +213,13 @@ namespace jlog {
log({trace, filedata, severity, content}); log({trace, filedata, severity, content});
} }
void usverbose_spec(const std::string &message, const std::string &func, const std::string &file, void usverbose_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"}; auto severity = token{.colorCode = ansi_escape_codes::FG_CYAN, .content = "VERBOSE"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = func};
//auto filedata = token{.content = std::format("{}:{}", file, line)};
log({severity, content}); log({severity, content});
} }
void debug_spec(const std::string &message, const std::string &func, const std::string &file, void debug_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"}; auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
@@ -253,9 +228,7 @@ namespace jlog {
log({timestamp, trace, filedata, severity, content}); log({timestamp, trace, filedata, severity, content});
} }
void sdebug_spec(const std::string &message, const std::string &func, const std::string &file, void sdebug_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"}; auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
auto trace = token{.content = func}; auto trace = token{.content = func};
@@ -263,18 +236,13 @@ namespace jlog {
log({trace, filedata, severity, content}); log({trace, filedata, severity, content});
} }
void usdebug_spec(const std::string &message, const std::string &func, const std::string &file, void usdebug_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"}; auto severity = token{.colorCode = ansi_escape_codes::FG_GREEN, .content = "DEBUG"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = func};
//auto filedata = token{.content = std::format("{}:{}", file, line)};
log({severity, content}); log({severity, content});
} }
void warning_spec(const std::string &message, const std::string &func, const std::string &file, void warning_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"}; auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
@@ -283,9 +251,7 @@ namespace jlog {
log({timestamp, trace, filedata, severity, content}); log({timestamp, trace, filedata, severity, content});
} }
void swarning_spec(const std::string &message, const std::string &func, const std::string &file, void swarning_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"}; auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
auto trace = token{.content = func}; auto trace = token{.content = func};
@@ -293,18 +259,13 @@ namespace jlog {
log({trace, filedata, severity, content}); log({trace, filedata, severity, content});
} }
void uswarning_spec(const std::string &message, const std::string &func, const std::string &file, void uswarning_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"}; auto severity = token{.colorCode = ansi_escape_codes::FG_YELLOW, .content = "WARNING"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = func};
//auto filedata = token{.content = std::format("{}:{}", file, line)};
log({severity, content}); log({severity, content});
} }
void error_spec(const std::string &message, const std::string &func, const std::string &file, void error_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"}; auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
@@ -313,9 +274,7 @@ namespace jlog {
log({timestamp, trace, filedata, severity, content}); log({timestamp, trace, filedata, severity, content});
} }
void serror_spec(const std::string &message, const std::string &func, const std::string &file, void serror_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"}; auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
auto trace = token{.content = func}; auto trace = token{.content = func};
@@ -323,18 +282,13 @@ namespace jlog {
log({trace, filedata, severity, content}); log({trace, filedata, severity, content});
} }
void userror_spec(const std::string &message, const std::string &func, const std::string &file, void userror_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
//auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"}; auto severity = token{.colorCode = ansi_escape_codes::FG_RED, .content = "ERROR"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = func};
//auto filedata = token{.content = std::format("{}:{}", file, line)};
log({severity, content}); log({severity, content});
} }
void fatal_spec(const std::string &message, const std::string &func, const std::string &file, void fatal_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"}; auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
@@ -343,8 +297,7 @@ namespace jlog {
log({timestamp, trace, filedata, severity, content}); log({timestamp, trace, filedata, severity, content});
} }
void sfatal_spec(const std::string &message, const std::string &func, const std::string &file, void sfatal_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()}; auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"}; auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
@@ -353,13 +306,9 @@ namespace jlog {
log({trace, filedata, severity, content}); log({trace, filedata, severity, content});
} }
void usfatal_spec(const std::string &message, const std::string &func, const std::string &file, void usfatal_spec(const std::string& message, const std::string& func, const std::string& file, int line) {
int line) {
auto timestamp = token{.content = get_timestamp()};
auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"}; auto severity = token{.colorCode = ansi_escape_codes::FG_BRIGHT_RED, .content = "FATAL"};
auto content = token{.content = message, .delimiter = ""}; auto content = token{.content = message, .delimiter = ""};
//auto trace = token{.content = func};
//auto filedata = token{.content = std::format("{}:{}", file, line)};
log({severity, content}); log({severity, content});
} }
} }