From 644aa4397b03dbef73f8bfedc13925b51cad836b Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 5 Jan 2024 20:55:15 +0800 Subject: feat: integrate logging api to core --- src/core/function/LoggerManager.cpp | 155 ++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/core/function/LoggerManager.cpp (limited to 'src/core/function/LoggerManager.cpp') diff --git a/src/core/function/LoggerManager.cpp b/src/core/function/LoggerManager.cpp new file mode 100644 index 00000000..cac373ed --- /dev/null +++ b/src/core/function/LoggerManager.cpp @@ -0,0 +1,155 @@ +/** + * Copyright (C) 2021 Saturneric + * + * This file is part of GpgFrontend. + * + * GpgFrontend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GpgFrontend is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GpgFrontend. If not, see . + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "LoggerManager.h" + +#include +#include +#include +#include + +#include "core/function/GlobalSettingStation.h" + +namespace GpgFrontend { + +std::shared_ptr LoggerManager::default_logger = nullptr; +spdlog::level::level_enum LoggerManager::default_log_level = + spdlog::level::debug; + +LoggerManager::LoggerManager(int channel) + : SingletonFunctionObject(channel) { + spdlog::init_thread_pool(1024, 2); + spdlog::flush_every(std::chrono::seconds(5)); +} + +LoggerManager::~LoggerManager() { +#ifdef WINDOWS + // Under VisualStudio, this must be called before main finishes to workaround + // a known VS issue + spdlog::drop_all(); + spdlog::shutdown(); +#endif + + if (default_logger) default_logger = nullptr; +} + +auto LoggerManager::GetLogger(const std::string& id) + -> std::shared_ptr { + auto m_it = logger_map_.find(id); + if (m_it == logger_map_.end()) return GetDefaultLogger(); + return m_it->second; +} + +auto LoggerManager::RegisterAsyncLogger(const std::string& id, + spdlog::level::level_enum level) + -> std::shared_ptr { + // get the log directory + auto log_file_path = (GlobalSettingStation::GetInstance().GetLogDir() / id); + log_file_path.replace_extension(".log"); + + // sinks + std::vector sinks; + sinks.push_back(GpgFrontend::SecureCreateSharedObject< + spdlog::sinks::stderr_color_sink_mt>()); + sinks.push_back(GpgFrontend::SecureCreateSharedObject< + spdlog::sinks::rotating_file_sink_mt>( + log_file_path.u8string(), 1048576 * 32, 8)); + + // logger + auto logger = GpgFrontend::SecureCreateSharedObject( + id, begin(sinks), end(sinks), spdlog::thread_pool()); + logger->set_pattern( + "[%H:%M:%S.%e] [T:%t] [%=6n] %^[%=8l]%$ [%s:%#] [%!] -> %v (+%ius)"); + + // set the level of logger + logger->set_level(level); + + // flush policy +#ifdef DEBUG + logger->flush_on(spdlog::level::trace); +#else + core_logger->flush_on(spdlog::level::err); +#endif + + logger_map_[id] = logger; + return logger; +} + +auto LoggerManager::RegisterSyncLogger(const std::string& id, + spdlog::level::level_enum level) + -> std::shared_ptr { + // get the log directory + auto log_file_path = (GlobalSettingStation::GetInstance().GetLogDir() / id); + log_file_path.replace_extension(".log"); + + // sinks + std::vector sinks; + sinks.push_back(GpgFrontend::SecureCreateSharedObject< + spdlog::sinks::stderr_color_sink_mt>()); + sinks.push_back(GpgFrontend::SecureCreateSharedObject< + spdlog::sinks::rotating_file_sink_mt>( + log_file_path.u8string(), 1048576 * 32, 8)); + + // logger + auto logger = GpgFrontend::SecureCreateSharedObject( + id, begin(sinks), end(sinks)); + logger->set_pattern( + "[%H:%M:%S.%e] [T:%t] [%=6n] %^[%=8l]%$ [%s:%#] [%!] -> %v (+%ius)"); + + // set the level of logger + logger->set_level(level); + + logger_map_[id] = logger; + return logger; +} + +auto LoggerManager::GetDefaultLogger() -> std::shared_ptr { + if (default_logger == nullptr) { + // sinks + std::vector sinks; + sinks.push_back(GpgFrontend::SecureCreateSharedObject< + spdlog::sinks::stderr_color_sink_mt>()); + + // logger + auto logger = GpgFrontend::SecureCreateSharedObject( + "default", begin(sinks), end(sinks)); + logger->set_pattern( + "[%H:%M:%S.%e] [T:%t] [%=6n] %^[%=8l]%$ [%s:%#] [%!] -> %v (+%ius)"); + + // set the level of logger + logger->set_level(default_log_level); + spdlog::set_default_logger(logger); + default_logger = logger; + } + return default_logger; +} + +void LoggerManager::SetDefaultLogLevel(spdlog::level::level_enum level) { + default_log_level = level; +} +} // namespace GpgFrontend \ No newline at end of file -- cgit v1.2.3 From bf538056b24a68b8fd235b1c50991ee8eb46a776 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 12 Jan 2024 14:02:37 +0800 Subject: refactor: use QString instead of std::string and improve threading system --- src/core/function/LoggerManager.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'src/core/function/LoggerManager.cpp') diff --git a/src/core/function/LoggerManager.cpp b/src/core/function/LoggerManager.cpp index cac373ed..c800224a 100644 --- a/src/core/function/LoggerManager.cpp +++ b/src/core/function/LoggerManager.cpp @@ -58,18 +58,19 @@ LoggerManager::~LoggerManager() { if (default_logger) default_logger = nullptr; } -auto LoggerManager::GetLogger(const std::string& id) +auto LoggerManager::GetLogger(const QString& id) -> std::shared_ptr { auto m_it = logger_map_.find(id); if (m_it == logger_map_.end()) return GetDefaultLogger(); return m_it->second; } -auto LoggerManager::RegisterAsyncLogger(const std::string& id, +auto LoggerManager::RegisterAsyncLogger(const QString& id, spdlog::level::level_enum level) -> std::shared_ptr { // get the log directory - auto log_file_path = (GlobalSettingStation::GetInstance().GetLogDir() / id); + auto log_file_path = + (GlobalSettingStation::GetInstance().GetLogDir() / id.toStdString()); log_file_path.replace_extension(".log"); // sinks @@ -82,7 +83,7 @@ auto LoggerManager::RegisterAsyncLogger(const std::string& id, // logger auto logger = GpgFrontend::SecureCreateSharedObject( - id, begin(sinks), end(sinks), spdlog::thread_pool()); + id.toStdString(), begin(sinks), end(sinks), spdlog::thread_pool()); logger->set_pattern( "[%H:%M:%S.%e] [T:%t] [%=6n] %^[%=8l]%$ [%s:%#] [%!] -> %v (+%ius)"); @@ -100,11 +101,12 @@ auto LoggerManager::RegisterAsyncLogger(const std::string& id, return logger; } -auto LoggerManager::RegisterSyncLogger(const std::string& id, +auto LoggerManager::RegisterSyncLogger(const QString& id, spdlog::level::level_enum level) -> std::shared_ptr { // get the log directory - auto log_file_path = (GlobalSettingStation::GetInstance().GetLogDir() / id); + auto log_file_path = + (GlobalSettingStation::GetInstance().GetLogDir() / id.toStdString()); log_file_path.replace_extension(".log"); // sinks @@ -117,7 +119,7 @@ auto LoggerManager::RegisterSyncLogger(const std::string& id, // logger auto logger = GpgFrontend::SecureCreateSharedObject( - id, begin(sinks), end(sinks)); + id.toStdString(), begin(sinks), end(sinks)); logger->set_pattern( "[%H:%M:%S.%e] [T:%t] [%=6n] %^[%=8l]%$ [%s:%#] [%!] -> %v (+%ius)"); -- cgit v1.2.3 From 6983b5c1dd82d159236ebd06cf17f071cc9c1ee9 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 12 Jan 2024 23:08:38 +0800 Subject: refactor: remove boost and use QString instead of std::filesystem::path --- src/core/function/LoggerManager.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src/core/function/LoggerManager.cpp') diff --git a/src/core/function/LoggerManager.cpp b/src/core/function/LoggerManager.cpp index c800224a..3b88e4f0 100644 --- a/src/core/function/LoggerManager.cpp +++ b/src/core/function/LoggerManager.cpp @@ -70,8 +70,7 @@ auto LoggerManager::RegisterAsyncLogger(const QString& id, -> std::shared_ptr { // get the log directory auto log_file_path = - (GlobalSettingStation::GetInstance().GetLogDir() / id.toStdString()); - log_file_path.replace_extension(".log"); + GlobalSettingStation::GetInstance().GetLogDir() + "/" + id + ".log"; // sinks std::vector sinks; @@ -79,7 +78,7 @@ auto LoggerManager::RegisterAsyncLogger(const QString& id, spdlog::sinks::stderr_color_sink_mt>()); sinks.push_back(GpgFrontend::SecureCreateSharedObject< spdlog::sinks::rotating_file_sink_mt>( - log_file_path.u8string(), 1048576 * 32, 8)); + log_file_path.toUtf8().constData(), 1048576 * 32, 8)); // logger auto logger = GpgFrontend::SecureCreateSharedObject( @@ -106,8 +105,7 @@ auto LoggerManager::RegisterSyncLogger(const QString& id, -> std::shared_ptr { // get the log directory auto log_file_path = - (GlobalSettingStation::GetInstance().GetLogDir() / id.toStdString()); - log_file_path.replace_extension(".log"); + GlobalSettingStation::GetInstance().GetLogDir() + "/" + id + ".log"; // sinks std::vector sinks; @@ -115,7 +113,7 @@ auto LoggerManager::RegisterSyncLogger(const QString& id, spdlog::sinks::stderr_color_sink_mt>()); sinks.push_back(GpgFrontend::SecureCreateSharedObject< spdlog::sinks::rotating_file_sink_mt>( - log_file_path.u8string(), 1048576 * 32, 8)); + log_file_path.toUtf8().constData(), 1048576 * 32, 8)); // logger auto logger = GpgFrontend::SecureCreateSharedObject( -- cgit v1.2.3 From a7d5ca8ff4c369fe77fedd78f66cd0fb6043a8f6 Mon Sep 17 00:00:00 2001 From: saturneric Date: Mon, 22 Jan 2024 19:17:18 +0800 Subject: fix: slove a compile error --- src/core/function/LoggerManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/function/LoggerManager.cpp') diff --git a/src/core/function/LoggerManager.cpp b/src/core/function/LoggerManager.cpp index 3b88e4f0..c7088128 100644 --- a/src/core/function/LoggerManager.cpp +++ b/src/core/function/LoggerManager.cpp @@ -93,7 +93,7 @@ auto LoggerManager::RegisterAsyncLogger(const QString& id, #ifdef DEBUG logger->flush_on(spdlog::level::trace); #else - core_logger->flush_on(spdlog::level::err); + logger->flush_on(spdlog::level::err); #endif logger_map_[id] = logger; -- cgit v1.2.3