Compare commits
21 Commits
Prerelease
...
mcolortest
Author | SHA1 | Date | |
---|---|---|---|
aace84af52 | |||
|
47e06dd8ed | ||
cad79a474a | |||
67a83bbac4 | |||
e553c74ade | |||
9d36f07717 | |||
47caaba587 | |||
f2651b58df | |||
83df783e7c | |||
99c1fe9f4c | |||
e0355d2a32 | |||
8e0d99ce75 | |||
2394f51240 | |||
e83dd27d31 | |||
623b9efc26 | |||
f74b97ac11 | |||
abb9eed60f | |||
5675480499 | |||
3e414abc8d | |||
69ef213d85 | |||
22e75476f3 |
@@ -16,13 +16,8 @@ include(cmake/CPM.cmake)
|
||||
|
||||
file(GLOB_RECURSE jlog_HEADERS "include/jlog/*.h" "include/jlog/*.hpp")
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
file(GLOB_RECURSE jlog_SRC "src/jlog/linux/*.c" "src/jlog/linux/*.cpp" "src/jlog/shared/*.c" "src/jlog/shared/*.cpp")
|
||||
endif()
|
||||
file(GLOB_RECURSE jlog_SRC "src/jlog/*.cpp")
|
||||
|
||||
if(WIN32)
|
||||
file(GLOB_RECURSE jlog_SRC "src/jlog/windows/*.c" "src/jlog/windows/*.cpp" "src/jlog/shared/*.c" "src/jlog/shared/*.cpp")
|
||||
endif()
|
||||
|
||||
include_directories("include")
|
||||
|
||||
@@ -31,7 +26,10 @@ CPMAddPackage(
|
||||
URL https://git.redacted.cc/josh/Event/archive/Release-6.zip
|
||||
)
|
||||
|
||||
include_directories(${Event_SOURCE_DIR}/include)
|
||||
CPMAddPackage(
|
||||
NAME mcolor
|
||||
URL https://git.redacted.cc/maxine/mcolor/archive/Prerelease-1.zip
|
||||
)
|
||||
|
||||
if (UNIX)
|
||||
add_library(jlog SHARED ${jlog_SRC})
|
||||
@@ -39,8 +37,11 @@ endif()
|
||||
|
||||
if (WIN32)
|
||||
add_library(jlog STATIC ${jlog_SRC})
|
||||
target_compile_options(jlog PRIVATE /wd4005)
|
||||
endif()
|
||||
|
||||
target_include_directories(jlog PUBLIC ${Event_SOURCE_DIR}/include ${mcolor_SOURCE_DIR}/include)
|
||||
|
||||
set_target_properties(jlog PROPERTIES LINKER_LANGUAGE CXX)
|
||||
|
||||
install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME})
|
||||
@@ -48,7 +49,7 @@ install(FILES ${jlog_HEADERS} DESTINATION include/${PROJECT_NAME})
|
||||
|
||||
#add_subdirectory(tests)
|
||||
|
||||
target_link_libraries(jlog PRIVATE Event)
|
||||
target_link_libraries(jlog PRIVATE Event mcolor)
|
||||
|
||||
add_executable(LoggerDemo main.cpp)
|
||||
target_link_libraries(LoggerDemo PUBLIC jlog)
|
||||
|
@@ -1,108 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
#include <format>
|
||||
|
||||
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.
|
||||
/// @see xterm control sequences for a more in-depth list.
|
||||
/// 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.
|
||||
|
||||
inline static const std::string CURSOR_INVISIBLE = "\033[?25l";
|
||||
inline static const std::string CURSOR_VISIBLE = "\033[?25h";
|
||||
inline static const std::string RESTORE_SCREEN = "\033[?47l";
|
||||
inline static const std::string SAVE_SCREEN = "\033[?47h";
|
||||
|
||||
|
||||
inline static const std::string FG_BLACK = "\033[30m";
|
||||
inline static const std::string FG_RED = "\033[31m";
|
||||
inline static const std::string FG_GREEN = "\033[32m";
|
||||
inline static const std::string FG_YELLOW = "\033[33m";
|
||||
inline static const std::string FG_BLUE = "\033[34m";
|
||||
inline static const std::string FG_MAGENTA = "\033[35m";
|
||||
inline static const std::string FG_CYAN = "\033[36m";
|
||||
inline static const std::string FG_WHITE = "\033[37m";
|
||||
inline static const std::string FG_DEFAULT = "\033[39m";
|
||||
|
||||
|
||||
inline static const std::string FG_BRIGHT_BLACK = "\033[90m";
|
||||
inline static const std::string FG_BRIGHT_RED = "\033[91m";
|
||||
inline static const std::string FG_BRIGHT_GREEN = "\033[92m";
|
||||
inline static const std::string FG_BRIGHT_YELLOW = "\033[93m";
|
||||
inline static const std::string FG_BRIGHT_BLUE = "\033[94m";
|
||||
inline static const std::string FG_BRIGHT_MAGENTA = "\033[95m";
|
||||
inline static const std::string FG_BRIGHT_CYAN = "\033[96m";
|
||||
inline static const std::string FG_BRIGHT_WHITE = "\033[97m";
|
||||
|
||||
|
||||
inline static const std::string BG_BLACK = "\033[40m";
|
||||
inline static const std::string BG_RED = "\033[41m";
|
||||
inline static const std::string BG_GREEN = "\033[42m";
|
||||
inline static const std::string BG_YELLOW = "\033[43m";
|
||||
inline static const std::string BG_BLUE = "\033[44m";
|
||||
inline static const std::string BG_MAGENTA = "\033[45m";
|
||||
inline static const std::string BG_CYAN = "\033[46m";
|
||||
inline static const std::string BG_WHITE = "\033[47m";
|
||||
inline static const std::string BG_DEFAULT = "\033[49m";
|
||||
|
||||
inline static const std::string BG_BRIGHT_BLACK = "\033[100m";
|
||||
inline static const std::string BG_BRIGHT_RED = "\033[101m";
|
||||
inline static const std::string BG_BRIGHT_GREEN = "\033[102m";
|
||||
inline static const std::string BG_BRIGHT_YELLOW = "\033[103m";
|
||||
inline static const std::string BG_BRIGHT_BLUE = "\033[104m";
|
||||
inline static const std::string BG_BRIGHT_MAGENTA = "\033[105m";
|
||||
inline static const std::string BG_BRIGHT_CYAN = "\033[106m";
|
||||
inline static const std::string BG_BRIGHT_WHITE = "\033[107m";
|
||||
|
||||
inline std::string true_color(uint8_t r, uint8_t g, uint8_t b)
|
||||
{
|
||||
return std::format("\033[38;2;{};{};{}m", r, g, b);
|
||||
}
|
||||
|
||||
inline std::string cursor_to(int line, int col)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
inline std::string cursor_up(int lines)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
inline std::string cursor_down(int lines)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
inline std::string cursor_left(int cols)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
inline std::string cursor_right(int cols)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
inline std::string cursor_to_col(int col)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
@@ -1,52 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <jlog/ansi_escape_codes.hpp>
|
||||
#include <jlog/nt_color_codes.hpp>
|
||||
|
||||
// Platform independent color code mapping
|
||||
struct colorcode
|
||||
{
|
||||
std::string ansi_code;
|
||||
WORD nt_code;
|
||||
};
|
||||
|
||||
namespace jlog::color_codes
|
||||
{
|
||||
static const colorcode FG_BLACK {ansi_escape_codes::FG_BLACK, nt_color_codes::FG_BLACK };
|
||||
static const colorcode FG_RED {ansi_escape_codes::FG_RED, nt_color_codes::FG_RED };
|
||||
static const colorcode FG_GREEN {ansi_escape_codes::FG_GREEN, nt_color_codes::FG_GREEN };
|
||||
static const colorcode FG_YELLOW {ansi_escape_codes::FG_YELLOW, nt_color_codes::FG_YELLOW };
|
||||
static const colorcode FG_BLUE {ansi_escape_codes::FG_BLUE, nt_color_codes::FG_BLUE };
|
||||
static const colorcode FG_MAGENTA {ansi_escape_codes::FG_MAGENTA, nt_color_codes::FG_MAGENTA };
|
||||
static const colorcode FG_CYAN {ansi_escape_codes::FG_CYAN, nt_color_codes::FG_CYAN };
|
||||
static const colorcode FG_WHITE {ansi_escape_codes::FG_WHITE, nt_color_codes::FG_WHITE };
|
||||
static const colorcode FG_DEFAULT {ansi_escape_codes::FG_DEFAULT, nt_color_codes::FG_DEFAULT };
|
||||
|
||||
static const colorcode FG_BRIGHT_BLACK {ansi_escape_codes::FG_BRIGHT_BLACK, nt_color_codes::FG_BRIGHT_BLACK};
|
||||
static const colorcode FG_BRIGHT_RED {ansi_escape_codes::FG_BRIGHT_RED, nt_color_codes::FG_BRIGHT_RED};
|
||||
static const colorcode FG_BRIGHT_GREEN {ansi_escape_codes::FG_BRIGHT_GREEN, nt_color_codes::FG_BRIGHT_GREEN};
|
||||
static const colorcode FG_BRIGHT_YELLOW {ansi_escape_codes::FG_BRIGHT_YELLOW, nt_color_codes::FG_BRIGHT_YELLOW};
|
||||
static const colorcode FG_BRIGHT_BLUE {ansi_escape_codes::FG_BRIGHT_MAGENTA, nt_color_codes::FG_BRIGHT_MAGENTA};
|
||||
static const colorcode FG_BRIGHT_MAGENTA {ansi_escape_codes::FG_BRIGHT_MAGENTA, nt_color_codes::FG_BRIGHT_MAGENTA};
|
||||
static const colorcode FG_BRIGHT_CYAN {ansi_escape_codes::FG_BRIGHT_CYAN, nt_color_codes::FG_BRIGHT_CYAN};
|
||||
static const colorcode FG_BRIGHT_WHITE {ansi_escape_codes::FG_BRIGHT_WHITE, nt_color_codes::FG_BRIGHT_WHITE};
|
||||
|
||||
static const colorcode BG_BLACK {ansi_escape_codes::BG_BLACK, nt_color_codes::BG_BLACK};
|
||||
static const colorcode BG_RED {ansi_escape_codes::BG_RED, nt_color_codes::BG_RED};
|
||||
static const colorcode BG_GREEN {ansi_escape_codes::BG_GREEN, nt_color_codes::BG_GREEN};
|
||||
static const colorcode BG_YELLOW {ansi_escape_codes::BG_YELLOW, nt_color_codes::BG_YELLOW};
|
||||
static const colorcode BG_BLUE {ansi_escape_codes::BG_BLUE, nt_color_codes::BG_BLUE};
|
||||
static const colorcode BG_MAGENTA {ansi_escape_codes::BG_MAGENTA, nt_color_codes::BG_MAGENTA};
|
||||
static const colorcode BG_CYAN {ansi_escape_codes::BG_CYAN, nt_color_codes::BG_CYAN};
|
||||
static const colorcode BG_WHITE {ansi_escape_codes::BG_WHITE, nt_color_codes::BG_WHITE};
|
||||
static const colorcode BG_DEFAULT {ansi_escape_codes::BG_DEFAULT, nt_color_codes::BG_DEFAULT};
|
||||
|
||||
static const colorcode BG_BRIGHT_BLACK {ansi_escape_codes::BG_BRIGHT_BLACK, nt_color_codes::BG_BRIGHT_BLACK};
|
||||
static const colorcode BG_BRIGHT_RED {ansi_escape_codes::BG_BRIGHT_RED, nt_color_codes::BG_BRIGHT_RED};
|
||||
static const colorcode BG_BRIGHT_GREEN {ansi_escape_codes::BG_BRIGHT_GREEN, nt_color_codes::BG_BRIGHT_GREEN};
|
||||
static const colorcode BG_BRIGHT_YELLOW {ansi_escape_codes::BG_BRIGHT_YELLOW, nt_color_codes::BG_BRIGHT_YELLOW};
|
||||
static const colorcode BG_BRIGHT_BLUE {ansi_escape_codes::BG_BRIGHT_BLUE, nt_color_codes::BG_BRIGHT_BLUE};
|
||||
static const colorcode BG_BRIGHT_MAGENTA {ansi_escape_codes::BG_BRIGHT_MAGENTA, nt_color_codes::BG_BRIGHT_MAGENTA};
|
||||
static const colorcode BG_BRIGHT_CYAN {ansi_escape_codes::BG_BRIGHT_CYAN, nt_color_codes::BG_BRIGHT_CYAN};
|
||||
static const colorcode BG_BRIGHT_WHITE {ansi_escape_codes::BG_BRIGHT_WHITE, nt_color_codes::BG_BRIGHT_WHITE};
|
||||
}
|
@@ -3,11 +3,13 @@
|
||||
/// Developed & Maintained by Josh O'Leary
|
||||
/// This work is dedicated to the public domain.
|
||||
|
||||
/// Special thanks: Maxine Hayes, William J Tomasine II
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <Event.h>
|
||||
#include <jlog/color_codes.hpp>
|
||||
#include <mcolor.h>
|
||||
|
||||
#ifdef __linux__
|
||||
#define FUNCTION __PRETTY_FUNCTION__
|
||||
@@ -19,6 +21,7 @@
|
||||
|
||||
namespace jlog
|
||||
{
|
||||
|
||||
/// Severity levels for logging. Higher numbers filter less messages out.
|
||||
/// @see LOG_LEVEL macro
|
||||
enum class severity : uint8_t
|
||||
@@ -32,6 +35,7 @@ namespace jlog
|
||||
};
|
||||
|
||||
inline severity loglevel = severity::debug; // Default log level always debug
|
||||
inline bool console_logging = true;
|
||||
|
||||
struct LogEntry
|
||||
{
|
||||
@@ -49,13 +53,14 @@ namespace jlog
|
||||
/// These are strung together to build full logger messages in a flexible manner.
|
||||
struct token
|
||||
{
|
||||
colorcode colorCode = color_codes::FG_DEFAULT;
|
||||
mcolor::ansiColors::Colors colorCode = mcolor::ansiColors::Colors::FG_DEFAULT;
|
||||
std::string content = "";
|
||||
std::string delimiter = "[]";
|
||||
};
|
||||
|
||||
void set_default_logfile(const std::string& filename);
|
||||
|
||||
/// Returns a string timestamp in the format of 'YYYY-MM-DD hh:mm:ss.ms'
|
||||
std::string get_timestamp();
|
||||
|
||||
/// Writes an input string directly to standard output
|
||||
@@ -72,82 +77,150 @@ namespace jlog
|
||||
/// @note Does not append a newline to the message.
|
||||
void log_to_stream(std::ostream stream, const std::string& message);
|
||||
|
||||
/// These are helper functions designed to be wrapped around for easier custom logger building.
|
||||
/// @note This file is implemented differently per-platform to handle differences in console color handling.
|
||||
/// @see windows/jlog.cpp linux/jlog.cpp
|
||||
std::string toks2msg(std::vector<token> tokens, std::function<std::string(token)> formatter);
|
||||
std::string consoleMsgFormatter(token t);
|
||||
std::string logfileMsgFormatter(token t);
|
||||
std::string toks2consoleMsg(std::vector<token> tokens);
|
||||
std::string toks2logfileMsg(std::vector<token> tokens);
|
||||
|
||||
/// Parses a sequence of tokens into a printable message, and logs to the following destinations:
|
||||
/// standard output (console)
|
||||
/// output file (default)
|
||||
/// logging callback (Event)
|
||||
/// @note This file is implemented differently per-platform to handle differences in console color handling.
|
||||
/// @see windows/jlog.cpp linux/jlog.cpp
|
||||
void log(std::vector<token> tokens);
|
||||
void log(const std::vector<token>& tokens, const std::string& filename);
|
||||
void log(const std::vector<token>& tokens);
|
||||
void ltlog(const std::vector<token>& tokens); // Just for debug purposes
|
||||
|
||||
// Generic formatters for building loggers.
|
||||
#pragma region Generic Formatters
|
||||
|
||||
/// Returns a pseudo-"stacktrace" formatted sequence of tokens.
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
std::vector<token> trace_format(
|
||||
const std::string& func,
|
||||
const std::string& file,
|
||||
int line);
|
||||
|
||||
/// Returns a formatted sequence of tokens given a severity and message.
|
||||
/// @param severity_name The severity tag to prefix to the message. Could theoretically also be a context.
|
||||
/// @param message The actual message to include
|
||||
/// @param severity_cc The colorcode to assign to the severity.
|
||||
std::vector<token> log_format(
|
||||
const std::string& severity_name,
|
||||
const std::string& message,
|
||||
const colorcode& severity_cc = color_codes::FG_WHITE);
|
||||
const mcolor::ansiColors::Colors& severity_cc = mcolor::ansiColors::Colors::FG_WHITE);
|
||||
|
||||
/// Returns a more detailed formatted sequence of tokens.
|
||||
/// @param severity_name The severity tag to prefix to the message. Could theoretically also be a context.
|
||||
/// @param message The actual message to include
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
/// @param severity_cc The colorcode to assign to the severity.
|
||||
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 colorcode& severity_cc = color_codes::FG_WHITE);
|
||||
const mcolor::ansiColors::Colors& severity_cc = mcolor::ansiColors::Colors::FG_WHITE);
|
||||
|
||||
// Predefined generic loggers for jlog.
|
||||
/// Returns a token sequence pre-formatted for the INFO log level.
|
||||
/// @param message The message to send out.
|
||||
std::vector<token> info_format(const std::string& message);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the INFO log level.
|
||||
/// @param message The message to send out.
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
std::vector<token> info_detailed_format(
|
||||
const std::string &message,
|
||||
const std::string &func,
|
||||
const std::string &file,
|
||||
int line);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the WARNING log level.
|
||||
/// @param message The message to send out.
|
||||
std::vector<token> warning_format(const std::string& message);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the WARNING log level.
|
||||
/// @param message The message to send out.
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
std::vector<token> warning_detailed_format(
|
||||
const std::string &message,
|
||||
const std::string &func,
|
||||
const std::string &file,
|
||||
int line);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the ERROR log level.
|
||||
/// @param message The message to send out.
|
||||
std::vector<token> error_format(const std::string& message);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the ERROR log level.
|
||||
/// @param message The message to send out.
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
std::vector<token> error_detailed_format(
|
||||
const std::string &message,
|
||||
const std::string &func,
|
||||
const std::string &file,
|
||||
int line);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the FATAL log level.
|
||||
/// @param message The message to send out.
|
||||
std::vector<token> fatal_format(const std::string& message);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the FATAL log level.
|
||||
/// @param message The message to send out.
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
std::vector<token> fatal_detailed_format(
|
||||
const std::string &message,
|
||||
const std::string &func,
|
||||
const std::string &file,
|
||||
int line);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the VERBOSE log level.
|
||||
/// @param message The message to send out.
|
||||
std::vector<token> verbose_format(const std::string& message);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the VERBOSE log level.
|
||||
/// @param message The message to send out.
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
std::vector<token> verbose_detailed_format(
|
||||
const std::string &message,
|
||||
const std::string &func,
|
||||
const std::string &file,
|
||||
int line);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the DEBUG log level.
|
||||
/// @param message The message to send out.
|
||||
std::vector<token> debug_format(const std::string& message);
|
||||
|
||||
/// Returns a token sequence pre-formatted for the DEBUG log level.
|
||||
/// @param message The message to send out.
|
||||
/// @param func The function name/signature to trace back to. Should be provided by a __FUNCTION__ macro variant.
|
||||
/// @param file The file name to trace back to. Should be provided by a __FILE__ macro variant.
|
||||
/// @param line The source-code line to trace back to. Should be provided by a __LINE__ macro variant.
|
||||
std::vector<token> debug_detailed_format(
|
||||
const std::string &message,
|
||||
const std::string &func,
|
||||
const std::string &file,
|
||||
int line);
|
||||
#pragma endregion
|
||||
}
|
||||
|
||||
#define INFO(i) if (jlog::loglevel >= jlog::severity::none) { jlog::log(jlog::info_detailed_format(i, FUNCTION, __FILE__, __LINE__)); }
|
||||
@@ -164,3 +237,7 @@ namespace jlog
|
||||
|
||||
#define LOGLEVEL(i) jlog::loglevel = i;
|
||||
|
||||
#define CONSOLELOGGING(i) jlog::console_logging = i
|
||||
|
||||
#define LOGTEST(i) if (jlog::loglevel >= jlog::severity::none) { jlog::ltlog(jlog::info_detailed_format(i, FUNCTION, __FILE__, __LINE__)); }
|
||||
|
||||
|
@@ -1,55 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
// NT color codes taken from windows.h / consoleapi2.h
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#ifndef WORD
|
||||
#define WORD short
|
||||
#endif
|
||||
|
||||
namespace jlog::nt_color_codes
|
||||
{
|
||||
const WORD FG_BLACK = 0x0000;
|
||||
const WORD FG_BLUE = 0x0001;
|
||||
const WORD FG_GREEN = 0x0002;
|
||||
const WORD FG_RED = 0x0004;
|
||||
|
||||
const WORD FG_YELLOW = FG_RED | FG_GREEN;
|
||||
|
||||
const WORD FG_MAGENTA = FG_RED | FG_BLUE;
|
||||
const WORD FG_CYAN = FG_GREEN | FG_BLUE;
|
||||
const WORD FG_WHITE = FG_RED | FG_GREEN | FG_BLUE;
|
||||
const WORD FG_DEFAULT = FG_WHITE;
|
||||
|
||||
const WORD FG_BRIGHT_BLACK = 0 | 0x0008;
|
||||
const WORD FG_BRIGHT_RED = FG_RED | 0x0008;
|
||||
const WORD FG_BRIGHT_GREEN = FG_GREEN | 0x0008;
|
||||
const WORD FG_BRIGHT_YELLOW = FG_RED | FG_GREEN | 0x0008;
|
||||
const WORD FG_BRIGHT_BLUE = FG_BLUE | 0x0008;
|
||||
const WORD FG_BRIGHT_MAGENTA = FG_RED | FG_BLUE | 0x0008;
|
||||
const WORD FG_BRIGHT_CYAN = FG_GREEN | FG_BLUE | 0x0008;
|
||||
const WORD FG_BRIGHT_WHITE = FG_RED | FG_GREEN | FG_BLUE | 0x0008;
|
||||
|
||||
|
||||
const WORD BG_BLACK = 0x0000;
|
||||
const WORD BG_BLUE = 0x0010;
|
||||
const WORD BG_GREEN = 0x0020;
|
||||
const WORD BG_RED = 0x0040;
|
||||
const WORD BG_YELLOW = BG_RED | BG_GREEN;
|
||||
const WORD BG_MAGENTA = BG_RED | BG_BLUE;
|
||||
const WORD BG_CYAN = BG_GREEN | BG_BLUE;
|
||||
const WORD BG_WHITE = BG_RED | BG_GREEN | BG_BLUE;
|
||||
const WORD BG_BRIGHT_BLACK = 0 | 0x0080;
|
||||
const WORD BG_BRIGHT_RED = BG_RED | 0x0080;
|
||||
const WORD BG_BRIGHT_GREEN = BG_GREEN | 0x0080;
|
||||
const WORD BG_BRIGHT_YELLOW = BG_YELLOW | 0x0080;
|
||||
const WORD BG_BRIGHT_BLUE = BG_BLUE | 0x0080;
|
||||
const WORD BG_BRIGHT_MAGENTA = BG_RED | BG_BLUE | 0x0080;
|
||||
const WORD BG_BRIGHT_CYAN = BG_GREEN | BG_BLUE | 0x0080;
|
||||
const WORD BG_BRIGHT_WHITE = BG_RED | BG_GREEN | BG_BLUE | 0x0080;
|
||||
|
||||
const WORD BG_DEFAULT = BG_WHITE;
|
||||
}
|
4
main.cpp
4
main.cpp
@@ -23,6 +23,7 @@
|
||||
int main()
|
||||
{
|
||||
LOGLEVEL(jlog::severity::debug); // <- see jlog::severity for full list of log levels
|
||||
CONSOLELOGGING(true); // <- Set to true or false to enable/disable logging to console. Useful for release builds of a program.
|
||||
|
||||
INFO("This is barely useful information.");
|
||||
DEBUG("Debugging Information");
|
||||
@@ -34,6 +35,9 @@ int main()
|
||||
//COOLINFO("This is really cool!!!");
|
||||
//COOLINFOTRACE("THIS IS EVEN COOLER!!!");
|
||||
|
||||
LOGTEST("This is a really cool test man :3");
|
||||
LOGTEST("Go check cmake-build-debug/logtest.log and cmake-build-debug/latest.log");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
253
src/jlog/jlog.cpp
Normal file
253
src/jlog/jlog.cpp
Normal file
@@ -0,0 +1,253 @@
|
||||
#include <jlog/jlog.hpp>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
|
||||
#ifdef WIN32
|
||||
#define NOMINMAX
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
namespace jlog
|
||||
{
|
||||
static std::string default_logfile = "latest.log";
|
||||
|
||||
void set_default_logfile(const std::string& filename)
|
||||
{
|
||||
default_logfile = filename;
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
#ifdef WIN32
|
||||
mcolor::windowsSaneify();
|
||||
#endif
|
||||
std::cout << message;
|
||||
}
|
||||
|
||||
void log_to_file(const std::string& message)
|
||||
{
|
||||
std::ofstream latest_log(default_logfile, std::ios_base::app);
|
||||
latest_log << message;
|
||||
latest_log.close();
|
||||
}
|
||||
|
||||
void log_to_file(const std::string& filename, const std::string& message)
|
||||
{
|
||||
std::ofstream latest_log(filename, std::ios_base::app);
|
||||
latest_log << message;
|
||||
latest_log.close();
|
||||
}
|
||||
|
||||
void log_to_stream(std::ostream stream, const std::string& message)
|
||||
{
|
||||
stream << message;
|
||||
}
|
||||
|
||||
std::string toks2msg(std::vector<token> tokens, std::function<std::string(token)> formatter)
|
||||
{
|
||||
std::string msg;
|
||||
for (const token& t: tokens)
|
||||
{
|
||||
msg += formatter(t);
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
std::string toks2consoleMsg(std::vector<token> tokens)
|
||||
{
|
||||
return toks2msg(tokens, consoleMsgFormatter);
|
||||
}
|
||||
|
||||
std::string toks2logfileMsg(std::vector<token> tokens)
|
||||
{
|
||||
return toks2msg(tokens, logfileMsgFormatter);
|
||||
}
|
||||
|
||||
std::string consoleMsgFormatter(token t)
|
||||
{
|
||||
if (!t.delimiter.empty())
|
||||
{
|
||||
return std::format("{}{}{}{}{} ", mcolor::toEscapeCode(t.colorCode), t.delimiter[0], t.content, t.delimiter[1], mcolor::toEscapeCode(mcolor::ansiColors::Colors::RESET));
|
||||
}
|
||||
|
||||
return std::format("{}{}{} ", mcolor::toEscapeCode(t.colorCode), t.content, mcolor::toEscapeCode(mcolor::ansiColors::Colors::RESET));
|
||||
}
|
||||
|
||||
std::string logfileMsgFormatter(token t)
|
||||
{
|
||||
if (!t.delimiter.empty())
|
||||
{
|
||||
return std::format("{}{}{} ", t.delimiter[0], t.content, t.delimiter[1]);
|
||||
}
|
||||
|
||||
return t.content + " ";
|
||||
}
|
||||
|
||||
void log(const std::vector<token>& tokens, const std::string& filename)
|
||||
{
|
||||
if (console_logging) {
|
||||
log_to_console(toks2consoleMsg(tokens));
|
||||
log_to_console("\n");
|
||||
}
|
||||
log_to_file(filename, toks2logfileMsg(tokens));
|
||||
log_to_file(filename, "\n");
|
||||
}
|
||||
|
||||
void log(const std::vector<token>& tokens)
|
||||
{
|
||||
log(tokens, default_logfile);
|
||||
}
|
||||
|
||||
// Mainly for debug purposes
|
||||
void ltlog(const std::vector<token>& tokens)
|
||||
{
|
||||
std::vector<token> wtokens;
|
||||
//auto head = token{.colorCode = ansi_escape_codes::true_color(color_codes::BG_RED.rgb.r, color_codes::BG_RED.rgb.g, color_codes::BG_RED.rgb.b), .content = "GAS"};
|
||||
//wtokens.push_back(head);
|
||||
wtokens.insert(wtokens.end(), tokens.begin(), tokens.end());
|
||||
|
||||
log(wtokens);
|
||||
log_to_file("logtest.log", toks2logfileMsg(wtokens) + "\n");
|
||||
}
|
||||
|
||||
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> info_format(const std::string& message)
|
||||
{
|
||||
return log_format("INFO", message);
|
||||
}
|
||||
|
||||
std::vector<token> warning_format(const std::string& message)
|
||||
{
|
||||
return log_format("INFO", message, mcolor::ansiColors::Colors::FG_YELLOW);
|
||||
}
|
||||
|
||||
std::vector<token> error_format(const std::string& message)
|
||||
{
|
||||
return log_format("ERROR", message, mcolor::ansiColors::Colors::FG_RED);
|
||||
}
|
||||
|
||||
std::vector<token> fatal_format(const std::string& message)
|
||||
{
|
||||
return log_format("FATAL", message, mcolor::ansiColors::Colors::FG_BRIGHT_RED);
|
||||
}
|
||||
|
||||
std::vector<token> verbose_format(const std::string& message)
|
||||
{
|
||||
return log_format("VERBOSE", message, mcolor::ansiColors::Colors::FG_CYAN);
|
||||
}
|
||||
|
||||
std::vector<token> debug_format(const std::string& message)
|
||||
{
|
||||
return log_format("DEBUG", message, mcolor::ansiColors::Colors::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, mcolor::ansiColors::Colors::FG_GREEN);
|
||||
}
|
||||
|
||||
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_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, mcolor::ansiColors::Colors::FG_YELLOW);
|
||||
}
|
||||
|
||||
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, mcolor::ansiColors::Colors::FG_RED);
|
||||
}
|
||||
|
||||
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, mcolor::ansiColors::Colors::FG_CYAN);
|
||||
}
|
||||
|
||||
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, mcolor::ansiColors::Colors::FG_BRIGHT_RED);
|
||||
}
|
||||
|
||||
std::vector<token> log_format(
|
||||
const std::string& severity_name,
|
||||
const std::string& message,
|
||||
const mcolor::ansiColors::Colors& severity_cc)
|
||||
{
|
||||
auto severity = token{.colorCode = severity_cc, .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 mcolor::ansiColors::Colors& severity_cc)
|
||||
{
|
||||
std::vector<token> tokens;
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto tf_tokens = jlog::trace_format(func, file, line);
|
||||
auto lf_tokens = jlog::log_format(severity_name, message, severity_cc);
|
||||
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;
|
||||
}
|
||||
}
|
@@ -1,17 +0,0 @@
|
||||
#include <jlog/jlog.hpp>
|
||||
|
||||
namespace jlog {
|
||||
void log(std::vector<token> tokens) {
|
||||
for (token t: tokens) {
|
||||
if (!t.delimiter.empty())
|
||||
log_to_console(std::format("{}{}{}{}{} ", t.colorCode.ansi_code, 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.ansi_code, t.content, ansi_escape_codes::RESET)),
|
||||
log_to_file(t.content + " ");
|
||||
}
|
||||
log_to_console("\n");
|
||||
log_to_file("\n");
|
||||
}
|
||||
}
|
@@ -1,475 +0,0 @@
|
||||
#include <jlog/jlog.hpp>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
|
||||
namespace jlog
|
||||
{
|
||||
|
||||
static std::string default_logfile = "latest.log";
|
||||
|
||||
void set_default_logfile(const std::string& filename)
|
||||
{
|
||||
default_logfile = filename;
|
||||
}
|
||||
|
||||
|
||||
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(default_logfile, std::ios_base::app);
|
||||
latest_log << message;
|
||||
latest_log.close();
|
||||
}
|
||||
|
||||
void log_to_file(const std::string& filename, const std::string& message)
|
||||
{
|
||||
std::ofstream latest_log(filename, std::ios_base::app);
|
||||
latest_log << message;
|
||||
latest_log.close();
|
||||
}
|
||||
|
||||
void log_to_stream(std::ostream stream, const std::string& message)
|
||||
{
|
||||
stream << message;
|
||||
}
|
||||
|
||||
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> info_format(const std::string& message)
|
||||
{
|
||||
return log_format("INFO", message);
|
||||
}
|
||||
|
||||
std::vector<token> warning_format(const std::string& message)
|
||||
{
|
||||
return log_format("INFO", message, color_codes::FG_YELLOW);
|
||||
}
|
||||
|
||||
std::vector<token> error_format(const std::string& message)
|
||||
{
|
||||
return log_format("ERROR", message, color_codes::FG_RED);
|
||||
}
|
||||
|
||||
std::vector<token> verbose_format(const std::string& message)
|
||||
{
|
||||
return log_format("VERBOSE", message, color_codes::FG_CYAN);
|
||||
}
|
||||
|
||||
std::vector<token> debug_format(const std::string& message)
|
||||
{
|
||||
return log_format("DEBUG", message, color_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, color_codes::FG_GREEN);
|
||||
}
|
||||
|
||||
void direct(const std::string& message)
|
||||
{
|
||||
log({{.content = message, .delimiter = ""}});
|
||||
}
|
||||
|
||||
void info(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_WHITE, .content = "INFO"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({timestamp, severity, content});
|
||||
}
|
||||
|
||||
void sinfo(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_WHITE, .content = "INFO"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void usinfo(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_WHITE, .content = "INFO"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void verbose(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_CYAN, .content = "VERBOSE"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({timestamp, severity, content});
|
||||
}
|
||||
|
||||
void sverbose(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_CYAN, .content = "VERBOSE"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void usverbose(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_CYAN, .content = "VERBOSE"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void debug(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "DEBUG"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({timestamp, severity, content});
|
||||
}
|
||||
|
||||
void sdebug(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "DEBUG"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void usdebug(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "DEBUG"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void warning(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_YELLOW, .content = "WARNING"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({timestamp, severity, content});
|
||||
}
|
||||
|
||||
void swarning(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_YELLOW, .content = "WARNING"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void uswarning(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_YELLOW, .content = "WARNING"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void error(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_RED, .content = "ERROR"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({timestamp, severity, content});
|
||||
}
|
||||
|
||||
void serror(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_RED, .content = "ERROR"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void userror(const std::string& message)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_RED, .content = "ERROR"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void fatal(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_BRIGHT_RED, .content = "FATAL"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({timestamp, severity, content});
|
||||
}
|
||||
|
||||
void sfatal(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_BRIGHT_RED, .content = "FATAL"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void usfatal(const std::string& message)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_BRIGHT_RED, .content = "FATAL"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
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_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, color_codes::FG_YELLOW);
|
||||
}
|
||||
|
||||
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, color_codes::FG_RED);
|
||||
}
|
||||
|
||||
std::vector<token> fatal_format(const std::string& message)
|
||||
{
|
||||
return log_format("FATAL", message, color_codes::FG_BRIGHT_RED);
|
||||
}
|
||||
|
||||
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, color_codes::FG_CYAN);
|
||||
}
|
||||
|
||||
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, color_codes::FG_BRIGHT_RED);
|
||||
}
|
||||
|
||||
std::vector<token> log_format(
|
||||
const std::string& severity_name,
|
||||
const std::string& message,
|
||||
const colorcode& severity_cc)
|
||||
{
|
||||
auto severity = token{.colorCode = severity_cc, .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 colorcode& severity_cc)
|
||||
{
|
||||
std::vector<token> tokens;
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto tf_tokens = jlog::trace_format(func, file, line);
|
||||
auto lf_tokens = jlog::log_format(severity_name, message, severity_cc);
|
||||
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;
|
||||
}
|
||||
|
||||
void info_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_WHITE, .content = "INFO"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({timestamp, trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void sinfo_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_WHITE, .content = "INFO"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void usinfo_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_WHITE, .content = "INFO"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void verbose_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_CYAN, .content = "VERBOSE"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({timestamp, trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void sverbose_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_CYAN, .content = "VERBOSE"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void usverbose_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_CYAN, .content = "VERBOSE"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void debug_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "DEBUG"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({timestamp, trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void sdebug_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "DEBUG"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void usdebug_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "DEBUG"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void warning_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "WARNING"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({timestamp, trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void swarning_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "WARNING"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void uswarning_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "WARNING"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void error_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_GREEN, .content = "ERROR"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({timestamp, trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void serror_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_RED, .content = "ERROR"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void userror_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_RED, .content = "ERROR"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
|
||||
void fatal_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_RED, .content = "FATAL"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({timestamp, trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void sfatal_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto timestamp = token{.content = jlog::get_timestamp()};
|
||||
auto severity = token{.colorCode = color_codes::FG_BRIGHT_RED, .content = "FATAL"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
auto trace = token{.content = func};
|
||||
auto filedata = token{.content = std::format("{}:{}", file, line)};
|
||||
log({trace, filedata, severity, content});
|
||||
}
|
||||
|
||||
void usfatal_spec(const std::string& message, const std::string& func, const std::string& file, int line)
|
||||
{
|
||||
auto severity = token{.colorCode = color_codes::FG_BRIGHT_RED, .content = "FATAL"};
|
||||
auto content = token{.content = message, .delimiter = ""};
|
||||
log({severity, content});
|
||||
}
|
||||
}
|
@@ -1,28 +0,0 @@
|
||||
|
||||
|
||||
#include <jlog/jlog.hpp>
|
||||
#include <string>
|
||||
|
||||
inline void SetConsoleTextColor(WORD color) {
|
||||
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
|
||||
}
|
||||
|
||||
namespace jlog
|
||||
{
|
||||
void log(const std::vector<token> tokens) {
|
||||
for (const token& t : tokens) {
|
||||
if (!t.delimiter.empty()) {
|
||||
SetConsoleTextColor(t.colorCode.nt_code);
|
||||
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 {
|
||||
SetConsoleTextColor(t.colorCode.nt_code);
|
||||
log_to_console(t.content + " ");
|
||||
log_to_file(t.content + " ");
|
||||
}
|
||||
}
|
||||
SetConsoleTextColor(color_codes::FG_DEFAULT.nt_code);
|
||||
log_to_console("\n");
|
||||
log_to_file("\n");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user