15#include "spdlog/spdlog.h"
21#define MACH3LOG_TRACE SPDLOG_TRACE
22#define MACH3LOG_DEBUG SPDLOG_DEBUG
23#define MACH3LOG_INFO SPDLOG_INFO
24#define MACH3LOG_WARN SPDLOG_WARN
25#define MACH3LOG_ERROR SPDLOG_ERROR
26#define MACH3LOG_CRITICAL SPDLOG_CRITICAL
27#define MACH3LOG_OFF SPDLOG_OFF
36 spdlog::set_pattern(
"[%s:%#][%^%l%$] %v");
39 spdlog::set_pattern(
"[%s][%^%l%$] %v");
66template <
typename Func,
typename LogFunc,
typename... Args>
67void LoggerPrint(
const std::string& LibName, LogFunc logFunction, Func&& func, Args&&... args)
70 std::stringstream sss_cout;
71 std::stringstream sss_cerr;
74 std::streambuf* coutBuf =
nullptr;
75 std::streambuf* cerrBuf =
nullptr;
78 if (std::cout.rdbuf() && std::cerr.rdbuf()) {
79 coutBuf = std::cout.rdbuf();
80 cerrBuf = std::cerr.rdbuf();
83 std::cout.rdbuf(sss_cout.rdbuf());
84 std::cerr.rdbuf(sss_cerr.rdbuf());
89 func(std::forward<Args>(args)...);
92 if (coutBuf) std::cout.rdbuf(coutBuf);
93 if (cerrBuf) std::cerr.rdbuf(cerrBuf);
96 while (std::getline(sss_cout, line))
98 auto formatted_message = fmt::format(
"[{}] {}", LibName, line);
99 logFunction(formatted_message);
101 while (std::getline(sss_cerr, line))
103 auto formatted_message = fmt::format(
"[{}] {}", LibName, line);
104 logFunction(formatted_message);
106 }
catch (std::runtime_error &err) {
108 std::cout.rdbuf(coutBuf);
109 std::cerr.rdbuf(cerrBuf);
111 std::cout <<
"\nConsole cout output:" << std::endl;
112 std::cout << sss_cout.rdbuf()->str() << std::endl;
114 std::cout <<
"\nConsole cerr output:" << std::endl;
115 std::cout << sss_cerr.rdbuf()->str() << std::endl;
#define _MaCh3_Safe_Include_Start_
KS: Avoiding warning checking for headers.
#define _MaCh3_Safe_Include_End_
KS: Restore warning checking after including external headers.
void SetMaCh3LoggerFormat()
Set messaging format of the logger.
void LoggerPrint(const std::string &LibName, LogFunc logFunction, Func &&func, Args &&... args)
KS: This is bit convoluted but this is to allow redirecting cout and errors from external library int...