Files
OpenVulkano/openVulkanoCpp/Base/Logger.cpp
2021-03-25 02:27:11 +01:00

124 lines
3.4 KiB
C++

/*
* 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 "Math/ByteSize.hpp"
#include "Logger.hpp"
#include <iostream>
#include <filesystem>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/null_sink.h>
#ifndef NO_CONSOLE_LOG
#include <spdlog/sinks/stdout_color_sinks.h>
#endif
#ifdef _MSC_VER
#include <spdlog/sinks/msvc_sink.h>
#endif
namespace openVulkanoCpp
{
constexpr size_t MAX_LOG_FILE_SIZE = 512_MiB;
constexpr size_t MAX_LOG_FILE_COUNT = 3;
std::vector<spdlog::sink_ptr> Logger::SINKS;
std::vector<std::weak_ptr<spdlog::logger>> Logger::LOGGERS;
Logger::Ptr Logger::WINDOW = nullptr;
Logger::Ptr Logger::MANAGER = nullptr;
Logger::Ptr Logger::RENDER = nullptr;
Logger::Ptr Logger::PHYSIC = nullptr;
Logger::Ptr Logger::AUDIO = nullptr;
Logger::Ptr Logger::DATA = nullptr;
Logger::Ptr Logger::SCENE = nullptr;
Logger::Ptr Logger::INPUT = nullptr;
Logger::Ptr Logger::FILESYS = nullptr;
Logger::Ptr Logger::AR = nullptr;
Logger::Ptr Logger::PERF = nullptr;
void Logger::SetupLogger(const std::string& logFolder, const std::string& logFile)
{
if (!SINKS.empty()) return;
try
{
try
{
SINKS.push_back(std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logFolder + "/" + logFile, MAX_LOG_FILE_SIZE, MAX_LOG_FILE_COUNT, 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<spdlog::sinks::stdout_color_sink_mt>());
#endif
#ifdef _MSC_VER // If it was build with msvc in debug we can use the msvc sink
SINKS.push_back(std::make_shared<spdlog::sinks::msvc_sink_mt>());
#endif
// Make sure that there is always a sink for the loggers
if (SINKS.empty()) SINKS.push_back(std::make_shared<spdlog::sinks::null_sink_mt>());
MANAGER = CreateLogger("manager");
WINDOW = CreateLogger("window");
RENDER = CreateLogger("render");
PHYSIC = CreateLogger("physic");
AUDIO = CreateLogger("audio");
DATA = CreateLogger("data");
SCENE = CreateLogger("scene");
INPUT = CreateLogger("input");
FILESYS = CreateLogger("filesys");
AR = CreateLogger("ar");
PERF = CreateLogger("perf");
spdlog::flush_every(std::chrono::seconds(5));
MANAGER->info("Logger initialized");
}
catch (const spdlog::spdlog_ex& e)
{
std::cerr << "Log initialization failed: " << e.what() << std::endl;
}
}
Logger::Ptr Logger::CreateLogger(const std::string& name, const bool reg)
{
auto logger = std::make_shared<spdlog::logger>(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;
}
Logger::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);
}
}