From 3a663e4dec1a43431e2792726cd2e40ce95c3a08 Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Fri, 14 Aug 2020 21:32:17 +0200 Subject: [PATCH] Cleanup Logger --- openVulkanoCpp/Base/Logger.cpp | 102 ++++++++++++++++++++++++++++++++- openVulkanoCpp/Base/Logger.hpp | 84 ++++++--------------------- 2 files changed, 117 insertions(+), 69 deletions(-) diff --git a/openVulkanoCpp/Base/Logger.cpp b/openVulkanoCpp/Base/Logger.cpp index 7cdd5b7..1b33721 100644 --- a/openVulkanoCpp/Base/Logger.cpp +++ b/openVulkanoCpp/Base/Logger.cpp @@ -1,8 +1,25 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + #include "Logger.hpp" +#include +#include +#include +#include +#ifndef NO_CONSOLE_LOG +#include +#endif +#ifdef _MSC_VER +#include +#endif namespace openVulkanoCpp { - std::vector Logger::sinks; + std::vector Logger::SINKS; + std::vector> Logger::LOGGERS; std::shared_ptr Logger::WINDOW = nullptr; std::shared_ptr Logger::MANAGER = nullptr; std::shared_ptr Logger::RENDER = nullptr; @@ -11,4 +28,87 @@ namespace openVulkanoCpp std::shared_ptr Logger::DATA = nullptr; std::shared_ptr Logger::SCENE = nullptr; std::shared_ptr Logger::INPUT = nullptr; + + void Logger::SetupLogger(const std::string& logFolder, const std::string& logFile) + { + static bool initialized = false; + if (initialized) return; + try + { + try + { //TODO allow log files in folders + SINKS.push_back(std::make_shared(logFile, 1024 * 1024 * 512, 3, true)); + } + catch (const spdlog::spdlog_ex& e) + { + std::cerr << "Failed to create file log sink: " << e.what() << std::endl; + } +#ifndef NO_CONSOLE_LOG + SINKS.push_back(std::make_shared()); +#endif +#ifdef _MSC_VER // If it was build with msvc in debug we can use the msvc sink + sinks.push_back(std::make_shared()); +#endif + // Make sure that there is always a sink for the loggers + if (SINKS.empty()) SINKS.push_back(std::make_shared()); + + MANAGER = CreateLogger("manager"); + WINDOW = CreateLogger("window"); + RENDER = CreateLogger("render"); + PHYSIC = CreateLogger("physic"); + AUDIO = CreateLogger("audio"); + DATA = CreateLogger("data"); + SCENE = CreateLogger("scene"); + INPUT = CreateLogger("input"); + + spdlog::flush_every(std::chrono::seconds(5)); + + MANAGER->info("Logger initialized"); + initialized = true; + } + catch (const spdlog::spdlog_ex& e) + { + std::cerr << "Log initialization failed: " << e.what() << std::endl; + } + } + + std::shared_ptr Logger::CreateLogger(const std::string& name, const bool reg) + { + auto logger = std::make_shared(name, SINKS.begin(), SINKS.end()); + if (reg) spdlog::register_logger(logger); +#ifdef LOG_DATE + logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [T%t] [%^%l%$] [%n]: %v"); +#else + logger->set_pattern("[%H:%M:%S.%e] [T%t] [%^%l%$] [%n]: %v"); +#endif +#ifdef DEBUG + logger->set_level(spdlog::level::debug); +#endif + + LOGGERS.push_back(logger); + + return logger; + } + + std::shared_ptr Logger::GetLogger(const std::string& name) + { + return spdlog::get(name); + } + + void Logger::RegisterSink(const spdlog::sink_ptr& newSink) + { + auto iter = LOGGERS.begin(); + while(iter != LOGGERS.end()) + { + if (const auto logger = (*iter).lock()) + { + logger->sinks().push_back(newSink); + } + else + { + iter = LOGGERS.erase(iter); + } + } + SINKS.push_back(newSink); + } } \ No newline at end of file diff --git a/openVulkanoCpp/Base/Logger.hpp b/openVulkanoCpp/Base/Logger.hpp index e1d547b..c66598c 100644 --- a/openVulkanoCpp/Base/Logger.hpp +++ b/openVulkanoCpp/Base/Logger.hpp @@ -1,25 +1,23 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + #pragma once #define SPDLOG_DEBUG_ON #define SPDLOG_TRACE_ON -#include -#include #include -#include "spdlog/sinks/rotating_file_sink.h" -#include "spdlog/sinks/null_sink.h" -#ifndef NO_CONSOLE_LOG -#include -#endif -#ifdef _MSC_VER -#include "spdlog/sinks/msvc_sink.h" -#endif namespace openVulkanoCpp { class Logger { //TODO add custom sink for in game/engine console - static std::vector sinks; + static std::vector SINKS; + static std::vector> LOGGERS; + public: static std::shared_ptr WINDOW; static std::shared_ptr MANAGER; @@ -30,68 +28,18 @@ namespace openVulkanoCpp static std::shared_ptr SCENE; static std::shared_ptr INPUT; - static void SetupLogger(std::string logFolder = "logs", std::string logFile = "openVulkano.log") - { - static bool initialized = false; - if (initialized) return; - try - { - try - { //TODO allow log files in folders - sinks.push_back(std::make_shared(logFile, 1024 * 1024 * 512, 3, true)); - } - catch (const spdlog::spdlog_ex& e) - { - std::cerr << "Log create file log sink: " << e.what() << std::endl; - } -#ifndef NO_CONSOLE_LOG - sinks.push_back(std::make_shared()); -#endif -#ifdef _MSC_VER // If it was build with msvc in debug we can use the msvc sink - sinks.push_back(std::make_shared()); -#endif - // Make sure that there is always a sink for the loggers - if (sinks.empty()) sinks.push_back(std::make_shared()); - - MANAGER = CreateLogger("manager"); - WINDOW = CreateLogger("window"); - RENDER = CreateLogger("render"); - PHYSIC = CreateLogger("physic"); - AUDIO = CreateLogger("audio"); - DATA = CreateLogger("data"); - SCENE = CreateLogger("scene"); - INPUT = CreateLogger("input"); - - spdlog::flush_every(std::chrono::seconds(5)); - - MANAGER->info("Logger initialized"); - initialized = true; - } - catch (const spdlog::spdlog_ex& e) - { - std::cerr << "Log initialization failed: " << e.what() << std::endl; - } - } + static void SetupLogger(const std::string& logFolder = "logs", const std::string& logFile = "openVulkano.log"); /** * \brief Creates a new custom logger that writes to the main log file. * \param name The name of the logger - * \param reg If set to true the logger can be accessed again with spdlog::get(name) + * \param reg If set to true the logger can be accessed again with Logger::GetLogger(name) * \return The created logger */ - static std::shared_ptr CreateLogger(const std::string& name, const bool reg = true) - { - auto logger = std::make_shared(name, sinks.begin(), sinks.end()); - if (reg) spdlog::register_logger(logger); -#ifdef LOG_DATE - logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [T%t] [%^%l%$] [%n]: %v"); -#else - logger->set_pattern("[%H:%M:%S.%e] [T%t] [%^%l%$] [%n]: %v"); -#endif -#ifdef DEBUG - logger->set_level(spdlog::level::debug); -#endif - return logger; - } + static std::shared_ptr CreateLogger(const std::string& name, bool reg = true); + + static std::shared_ptr GetLogger(const std::string& name); + + static void RegisterSink(const spdlog::sink_ptr& newSink); }; } \ No newline at end of file