Ansi terminal color support + big optimizations on all log systems + 'Warning()' hook

* Ansi colors can now be enabled with the '-ansiclr- flag.
* All loggers have been optimized and are all initialized only once at process startup.
* New hook for 'Warning()' print function with warning level.
This commit is contained in:
Amos
2022-01-14 20:45:36 +01:00
parent 012a317c84
commit 1c5df4e178
20 changed files with 476 additions and 362 deletions

13
r5dev/core/assert.h Normal file
View File

@@ -0,0 +1,13 @@
#pragma once
#ifndef NDEBUG
# define Assert(condition, message) \
do { \
if (! (condition)) { \
std::cerr << "Assertion `" #condition "` failed in " << __FILE__ \
<< " line " << __LINE__ << ": " << message << std::endl; \
std::terminate(); \
} \
} while (false)
#else
# define Assert(condition, message) do { } while (false)
#endif

View File

@@ -1,6 +1,7 @@
#include "core/stdafx.h"
#include "core/r5dev.h"
#include "core/init.h"
#include "core/logdef.h"
/*****************************************************************************/
#ifndef DEDICATED
#include "windows/id3dx.h"
@@ -15,7 +16,13 @@
void R5Dev_Init()
{
#ifndef DEDICATED
if (strstr(GetCommandLineA(), "-wconsole")) { Console_Init(); }
#else
Console_Init();
#endif // !DEDICATED
SpdLog_Init();
Systems_Init();
WinSys_Attach();
@@ -24,13 +31,17 @@ void R5Dev_Init()
DirectX_Init();
#endif // !DEDICATED
spdlog::get("console")->set_pattern("%v");
spdlog::info("\n");
spdlog::info("+-----------------------------------------------------------------------------+\n");
spdlog::info("| R5 DEVELOPER CONSOLE -- INITIALIZED ----------------------------------- |\n");
spdlog::info("+-----------------------------------------------------------------------------+\n");
spdlog::get("console")->set_pattern("[%S.%e] %v");
spdlog::info("\n");
}
//#############################################################################
// SHUTDOWN
//#############################################################################
void R5Dev_Shutdown()
{
Systems_Shutdown();

60
r5dev/core/logdef.cpp Normal file
View File

@@ -0,0 +1,60 @@
#include "core/stdafx.h"
#include "core/logdef.h"
//#############################################################################
// SPDLOG SETUP
//#############################################################################
void SpdLog_Init(void)
{
static bool bInitialized = false;
if (bInitialized)
{
Assert(bInitialized, "'SpdLog_Init()' has already been called.");
return;
}
/************************
* IMGUI LOGGER SETUP *
************************/
{
auto iconsole = std::make_shared<spdlog::logger>("game_console", g_spd_sys_p_ostream_sink);
spdlog::register_logger(iconsole); // in-game console logger.
iconsole->set_pattern("[%S.%e] %v");
iconsole->set_level(spdlog::level::trace);
}
/************************
* WINDOWS LOGGER SETUP *
************************/
{
auto wconsole = spdlog::stdout_logger_mt("win_console");
// Determine if user wants ansi-color logging in the terminal.
if (strstr(GetCommandLineA(), "-ansiclr"))
{
wconsole->set_pattern("[%S.%e] %v\u001b[0m");
g_bSpdLog_UseAnsiClr = true;
}
else { wconsole->set_pattern("[%S.%e] %v"); }
wconsole->set_level(spdlog::level::trace);
spdlog::set_default_logger(wconsole); // Set as default.
}
/************************
* ROTATE LOGGER SETUP *
************************/
{
spdlog::rotating_logger_mt<spdlog::synchronous_factory>("sqvm_warn_logger", "platform\\logs\\sqvm_warn.log", SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v");
spdlog::rotating_logger_mt<spdlog::synchronous_factory>("sqvm_print_logger", "platform\\logs\\sqvm_print.log", SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v");
spdlog::rotating_logger_mt<spdlog::synchronous_factory>("dev_message_logger", "platform\\logs\\dev_message.log", SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v");
spdlog::rotating_logger_mt<spdlog::synchronous_factory>("netchan_pack_logger", "platform\\logs\\net_trace.log", SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v");
spdlog::rotating_logger_mt<spdlog::synchronous_factory>("qhull_debug_logger", "platform\\logs\\qhull_print.log", SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v");
spdlog::rotating_logger_mt<spdlog::synchronous_factory>("filesystem_warn_logger", "platform\\logs\\fs_warn.log", SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v");
}
spdlog::set_level(spdlog::level::trace);
spdlog::flush_every(std::chrono::seconds(5)); // Flush buffers every 5 seconds for every logger.
bInitialized = true;
}

View File

@@ -1,27 +1,13 @@
#pragma once
constexpr int SPDLOG_MAX_SIZE = 10 * 1024; // Sets number of bytes before rotating logger.
constexpr int SPDLOG_NUM_FILE = 0; // Sets number of files to rotate to.
inline bool g_bSpdLog_UseAnsiClr = false;
//-------------------------------------------------------------------------
// NETCHAN |
inline auto g_spd_netchan_logger = spdlog::basic_logger_mt("netchan_logger", "platform\\logs\\net_trace.log");
inline std::ostringstream g_spd_net_p_oss;
inline auto g_spd_net_p_ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(g_spd_net_p_oss);
//-------------------------------------------------------------------------
// FILESYSTEM |
inline std::ostringstream fs_oss;
inline auto fs_ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(fs_oss);
//-------------------------------------------------------------------------
// SQUIRREL PRINTF |
inline std::ostringstream g_spd_sqvm_p_oss;
inline auto g_spd_sqvm_p_ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(g_spd_sqvm_p_oss);
//-------------------------------------------------------------------------
// SQUIRREL WARNF |
inline std::ostringstream g_spd_sqvm_w_oss;
inline auto g_spd_sqvm_w_ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(g_spd_sqvm_w_oss);
//-------------------------------------------------------------------------
// SYSTEM PRINTF |
// IMGUI CONSOLE SINK |
inline std::ostringstream g_spd_sys_w_oss;
inline auto g_spd_sys_p_ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(g_spd_sys_w_oss);
//-------------------------------------------------------------------------
// QHULL PRINTF |
inline std::ostringstream g_spd_qhull_p_w_oss;
inline auto g_spd_qhull_p_ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(g_spd_qhull_p_w_oss);
void SpdLog_Init(void);