1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
#pragma once
#include "spdlog/spdlog.h" #include "spdlog/async.h" #include "spdlog/sinks/daily_file_sink.h"
#ifdef _WIN32 #define __FILENAME__ (strrchr(__FILE__, '\\') ? (strrchr(__FILE__, '\\') + 1):__FILE__) #else #define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__) #endif
#define SPDLOG_LOGGER_CALL_(LV, ...) if (auto logger = SpdLog::Instance().logger[LV]) logger->log(spdlog::source_loc{__FILENAME__, __LINE__, SPDLOG_FUNCTION}, LV, __VA_ARGS__) #define LogTrace(...) SPDLOG_LOGGER_CALL_(spdlog::level::trace,__VA_ARGS__) #define LogDebug(...) SPDLOG_LOGGER_CALL_(spdlog::level::debug,__VA_ARGS__) #define LogInfo(...) SPDLOG_LOGGER_CALL_(spdlog::level::info,__VA_ARGS__) #define LogWarn(...) SPDLOG_LOGGER_CALL_(spdlog::level::warn,__VA_ARGS__) #define LogError(...) SPDLOG_LOGGER_CALL_(spdlog::level::err,__VA_ARGS__) #define LogCritical(...) SPDLOG_LOGGER_CALL_(spdlog::level::critical,__VA_ARGS__)
class SpdLog {
public: std::shared_ptr<spdlog::logger> logger[spdlog::level::n_levels]{ nullptr }; static SpdLog& Instance() { static SpdLog log; return log; } static void Clear() { spdlog::drop_all(); spdlog::shutdown(); } private:
SpdLog() { InitSpdLog(spdlog::level::debug); } ~SpdLog() { Clear(); } SpdLog(const SpdLog& other) = delete; SpdLog& operator=(const SpdLog& other) = delete;
void InitSpdLog(spdlog::level::level_enum level = spdlog::level::trace, const char* logDir = "./log/") { const char* levelStr; char fileName[255]; spdlog::flush_on(spdlog::level::warn); spdlog::flush_every(std::chrono::seconds(2)); spdlog::set_level(static_cast<spdlog::level::level_enum>(level)); spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e][%P:%t] %v [%@:%!]");
#define CraeteLogger(LV)\ levelStr = spdlog::level::to_string_view((spdlog::level::level_enum)LV).data();\ fmt::format_to(fileName, "{}{}.log{}", logDir, levelStr,'\0');\ logger[LV] = spdlog::daily_logger_mt<spdlog::async_factory>(levelStr, fileName, 23, 58);\
switch (level) { case spdlog::level::trace: CraeteLogger(spdlog::level::trace); [[fallthrough]]; case spdlog::level::debug: CraeteLogger(spdlog::level::debug); [[fallthrough]]; case spdlog::level::info: CraeteLogger(spdlog::level::info); [[fallthrough]]; case spdlog::level::warn: CraeteLogger(spdlog::level::warn); [[fallthrough]]; case spdlog::level::err: CraeteLogger(spdlog::level::err); [[fallthrough]]; case spdlog::level::critical: CraeteLogger(spdlog::level::critical); [[fallthrough]]; case spdlog::level::off: break; case spdlog::level::n_levels: break; default: break; } }; };
|