/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Logging.hpp Date: 2021-9-21 Author: Reece ***/ #pragma once #include "IFormatter.hpp" #include "IFormatterContainer.hpp" #include "ILogger.hpp" #include "IBasicSink.hpp" #include "IFormattedSink.hpp" #include "IBasicSinkRB.hpp" #include "IIPCLogger.hpp" #include "Sinks.hpp" #include "LogClasses.hpp" #include namespace Aurora::Logging { /// Writes a log message to the console subscribers and telemetry sinks AUKN_SYM void WriteLine(AuUInt8 level, const Console::ConsoleMessage &msg); /** * @brief Overloads the ILogger backend of the AuLogXX functions * @param defaultGlobalLogger * @return */ AUKN_SYM void SetGlobalLogger(const AuSPtr &defaultGlobalLogger); #if defined(_AUHAS_FMT) template inline void WriteLinef(AuUInt8 level, const AuROString &tag, fmt::format_string msg, T&& ... args) { AU_DEBUG_MEMCRUNCH; try { WriteLine(level, ConsoleMessage(EAnsiColor::eReset, tag, fmt::format(msg, AuForward(args)...))); } catch (...) { throw; } } template inline void WriteLinef(AuUInt8 level, EAnsiColor color, const AuROString &tag, fmt::format_string msg, T&& ... args) { AU_DEBUG_MEMCRUNCH; try { WriteLine(level, ConsoleMessage(color, tag, fmt::format(msg, AuForward(args)...))); } catch (...) {; throw; } } template inline void LogVerbose(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eVerbose), EAnsiColor::eYellow, "Verbose", line, AuForward(args)...); } #if defined(STAGING) || defined(DEBUG) template inline auline void LogVerboseNoShip(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eVerbose), EAnsiColor::eYellow, "Verbose", line, AuForward(args)...); } #else template inline auline void LogVerboseNoShip(fmt::format_string line, T&& ... args) {} #endif inline void DoNothing() { } template inline void LogInfo(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eInfo), EAnsiColor::eGreen, "Info", line, AuForward(args)...); } template inline void LogDbg(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eDebug), EAnsiColor::eYellow, "Debug", line, AuForward(args)...); } template inline void LogWarn(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eWarn), EAnsiColor::eRed, "Warn", line, AuForward(args)...); } template inline void LogError(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eError), EAnsiColor::eBoldRed, "Error", line, AuForward(args)...); } template inline void LogCritical(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eCritical), EAnsiColor::eBoldRed, "Critical", line, AuForward(args)...); } template inline void LogGame(fmt::format_string line, T&& ... args) { WriteLinef(static_cast(ELogLevel::eVerbose), EAnsiColor::eBlue, "Game", line, AuForward(args)...); } #else static void LogVerbose(const Line_t &line) { WriteLine(static_cast(ELogLevel::eVerbose), ConsoleMessage(EAnsiColor::eYellow, "Verbose", line)); } #if defined(STAGING) || defined(DEBUG) static void LogVerboseNoShip(const Line_t &line) { WriteLine(static_cast(ELogLevel::eVerbose), ConsoleMessage(EAnsiColor::eYellow, "Verbose", line)); } #else #define LogVerboseNoShip(...) DoNothing() #endif static void DoNothing() { } template static void LogInfo(const Line_t &line) { WriteLine(static_cast(ELogLevel::eInfo), ConsoleMessage(EAnsiColor::eGreen, "Info", line)); } template static void LogDbg(const Line_t &line) { WriteLine(static_cast(ELogLevel::eDebug), ConsoleMessage(EAnsiColor::eYellow, "Debug", line)); } template static void LogWarn(const Line_t &line) { WriteLine(static_cast(ELogLevel::eWarn), ConsoleMessage(EAnsiColor::eRed, "Warn", line)); } template static void LogError(const Line_t &line) { WriteLine(static_cast(ELogLevel::eError), ConsoleMessage(EAnsiColor::eBoldRed, "Error", line)); } template inline void LogCritical(fmt::format_string line, T&& ... args) { WriteLine(static_cast(ELogLevel::eCritical), ConsoleMessage(EAnsiColor::eBoldRed, "Critical", line)); } template static void LogGame(const Line_t &line) { WriteLine(static_cast(ELogLevel::eGame), ConsoleMessage(EAnsiColor::eBlue, "Game", line)); } #endif } #if defined(_AUHAS_FMT) #define ADD_AU_GLOBAL_ALIAS(level)\ template \ static void AuLog ## level(fmt::format_string line, T&& ... args) \ { \ Aurora::Logging::Log ## level(line, AuForward(args)...); \ } #else #define ADD_AU_GLOBAL_ALIAS(level)\ template \ static void AuLog ## level(const AuString &line, T&& ... args) \ { \ Aurora::Logging::Log ## level(line); \ } #endif ADD_AU_GLOBAL_ALIAS(Info) ADD_AU_GLOBAL_ALIAS(Dbg) ADD_AU_GLOBAL_ALIAS(Warn) ADD_AU_GLOBAL_ALIAS(Error) ADD_AU_GLOBAL_ALIAS(Game) ADD_AU_GLOBAL_ALIAS(Verbose) ADD_AU_GLOBAL_ALIAS(Critical) #define AuLogWarnOnce(...) \ { \ static __audetail::InitOnceABI gInitOnce; \ if (Aurora::Threading::InitOnceLocker::TryLock(&gInitOnce)) \ { \ AuLogWarn(__VA_ARGS__); \ Aurora::Threading::InitOnceLocker::Finish(&gInitOnce); \ } \ } #define AuLogInfoOnce(...) \ { \ static __audetail::InitOnceABI gInitOnce; \ if (Aurora::Threading::InitOnceLocker::TryLock(&gInitOnce)) \ { \ AuLogInfo(__VA_ARGS__); \ Aurora::Threading::InitOnceLocker::Finish(&gInitOnce); \ } \ } #define AuLogDbgOnce(...) \ { \ static __audetail::InitOnceABI gInitOnce; \ if (Aurora::Threading::InitOnceLocker::TryLock(&gInitOnce)) \ { \ AuLogDbg(__VA_ARGS__); \ Aurora::Threading::InitOnceLocker::Finish(&gInitOnce); \ } \ } #define AuLogErrorOnce(...) \ { \ static __audetail::InitOnceABI gInitOnce; \ if (Aurora::Threading::InitOnceLocker::TryLock(&gInitOnce)) \ { \ AuLogError(__VA_ARGS__); \ Aurora::Threading::InitOnceLocker::Finish(&gInitOnce); \ } \ } #define AuLogVerboseOnce(...) \ { \ static __audetail::InitOnceABI gInitOnce; \ if (Aurora::Threading::InitOnceLocker::TryLock(&gInitOnce)) \ { \ AuLogVerbose(__VA_ARGS__); \ Aurora::Threading::InitOnceLocker::Finish(&gInitOnce); \ } \ } #define AuLogCriticalOnce(...) \ { \ static __audetail::InitOnceABI gInitOnce; \ if (Aurora::Threading::InitOnceLocker::TryLock(&gInitOnce)) \ { \ AuLogCritical(__VA_ARGS__); \ Aurora::Threading::InitOnceLocker::Finish(&gInitOnce); \ } \ } #if defined(STAGING) || defined(DEBUG) ADD_AU_GLOBAL_ALIAS(VerboseNoShip) #else #define AuLogVerboseNoShip(...) #endif #undef ADD_AU_GLOBAL_ALIAS