3#include "spdlog/async.h"
4#include "spdlog/common.h"
5#include "spdlog/sinks/basic_file_sink.h"
6#include "spdlog/sinks/stdout_color_sinks.h"
16#include <spdlog/spdlog.h>
43 void initFileLogger(
const std::string& filepath,
unsigned int flushIntervalSeconds = 0) {
47 std::cout <<
"[AyonLogger] File logger already enabled. Ignoring new path: "
48 << filepath << std::endl;
52 if (filepath.empty())
return;
54 std::cout <<
"[AyonLogger] Initializing async file logger at: " << filepath << std::endl;
56 auto abs_path = std::filesystem::absolute(filepath).string();
58 std::ofstream probe(abs_path, std::ios::app);
59 if (!probe.is_open()) {
60 throw std::runtime_error(
"Failed opening file " + abs_path +
" for writing");
66 if (!spdlog::thread_pool()) {
67 spdlog::init_thread_pool(8192, 1);
71 std::string logger_name = std::string(
"AyonLogger_file_logger_") + abs_path;
73 m_fileLogger = spdlog::basic_logger_mt<spdlog::async_factory>(
74 logger_name, abs_path);
77 "{\"timestamp\":\"%Y-%m-%d %H:%M:%S.%e\",\"level\":\"%l\","
78 "\"thread_id\":\"%t\",\"process_id\":\"%P\",\"message\":\"%v\"}");
81 if (flushIntervalSeconds > 0) {
83 spdlog::flush_every(std::chrono::seconds(flushIntervalSeconds));
90 std::cout <<
"[AyonLogger] Async file logger initialized successfully." << std::endl;
92 catch (
const std::exception& e) {
93 std::cerr <<
"[AyonLogger] Failed to init async file logger: " << e.what() << std::endl;
102 std::set<std::string>::iterator
key(
const std::string&
key) {
108 return insertion.second;
120 bool isKeyActive(
const std::set<std::string>::iterator& loggingIterator) {
124 template<
typename... Args>
125 void error(fmt::format_string<Args...> fmt, Args&&... args) {
126 log(spdlog::level::err, fmt, std::forward<Args>(args)...);
129 template<
typename... Args>
130 void error(
const std::set<std::string>::iterator& it,
131 fmt::format_string<Args...> fmt, Args&&... args) {
133 log(spdlog::level::err, fmt, std::forward<Args>(args)...);
136 template<
typename... Args>
137 void info(fmt::format_string<Args...> fmt, Args&&... args) {
138 log(spdlog::level::info, fmt, std::forward<Args>(args)...);
141 template<
typename... Args>
142 void info(
const std::set<std::string>::iterator& it,
143 fmt::format_string<Args...> fmt, Args&&... args) {
145 log(spdlog::level::info, fmt, std::forward<Args>(args)...);
148 template<
typename... Args>
149 void warn(fmt::format_string<Args...> fmt, Args&&... args) {
150 log(spdlog::level::warn, fmt, std::forward<Args>(args)...);
153 template<
typename... Args>
154 void warn(
const std::set<std::string>::iterator& it,
155 fmt::format_string<Args...> fmt, Args&&... args) {
157 log(spdlog::level::warn, fmt, std::forward<Args>(args)...);
160 template<
typename... Args>
161 void critical(fmt::format_string<Args...> fmt, Args&&... args) {
162 log(spdlog::level::critical, fmt, std::forward<Args>(args)...);
165 template<
typename... Args>
166 void critical(
const std::set<std::string>::iterator& it,
167 fmt::format_string<Args...> fmt, Args&&... args) {
169 log(spdlog::level::critical, fmt, std::forward<Args>(args)...);
172 void setLogLevel(spdlog::level::level_enum lvl,
bool applyToFile =
false) {
176 void setLogLevel(
const std::string& levelStr,
bool applyToFile =
false) {
177 auto normalizedLevel = levelStr;
179 normalizedLevel.begin(),
180 normalizedLevel.end(),
181 normalizedLevel.begin(),
182 [](
unsigned char ch) { return static_cast<char>(std::tolower(ch)); });
183 auto lvl = spdlog::level::from_str(normalizedLevel);
187 void setLogLevelFromEnv(
const std::string& envKey =
"AYON_USD_RESOLVER_LOG_LVL",
bool applyToFile =
false) {
188 auto envVal = std::getenv(envKey.c_str());
191 std::cout <<
"[AyonLogger] Log level set from environment variable '" << envKey
192 <<
"' with value '" << envVal <<
"'" << std::endl;
197 setLevel(spdlog::level::info, applyToFile);
200 setLevel(spdlog::level::err, applyToFile);
203 setLevel(spdlog::level::warn, applyToFile);
206 setLevel(spdlog::level::critical, applyToFile);
209 setLevel(spdlog::level::off, applyToFile);
221 std::cout <<
"[AyonLogger] Singleton Constructor Started." << std::endl;
224 auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
225 console_sink->set_pattern(
"[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] %v");
226 m_consoleLogger = std::make_shared<spdlog::logger>(
"console", console_sink);
229 std::cout <<
"[AyonLogger] Singleton Constructor Finished." << std::endl;
248 template<
typename... Args>
249 void log(spdlog::level::level_enum lvl,
250 fmt::format_string<Args...> fmt,
257 m_fileLogger->log(lvl, fmt, std::forward<Args>(args)...);
264 void setLevel(spdlog::level::level_enum lvl,
bool applyToFile) {
Simple Logger Class that wraps around spdlog in order to expose easy logging functions.
Definition: AyonLogger.hpp:31
bool canUseAsyncFileLogger() const
Definition: AyonLogger.hpp:260
void warn(fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:149
void info(const std::set< std::string >::iterator &it, fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:142
void setLogLevel(const std::string &levelStr, bool applyToFile=false)
Definition: AyonLogger.hpp:176
void setLogLevelWarn(bool applyToFile=false)
Definition: AyonLogger.hpp:202
void error(fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:125
AyonLogger()
Definition: AyonLogger.hpp:220
bool isKeyActive(const std::set< std::string >::iterator &loggingIterator)
Definition: AyonLogger.hpp:120
void warn(const std::set< std::string >::iterator &it, fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:154
void info(fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:137
std::set< std::string >::iterator key(const std::string &key)
Definition: AyonLogger.hpp:102
void setLogLevelOff(bool applyToFile=false)
Definition: AyonLogger.hpp:208
void initFileLogger(const std::string &filepath, unsigned int flushIntervalSeconds=0)
Definition: AyonLogger.hpp:43
std::weak_ptr< spdlog::details::thread_pool > m_fileLoggerThreadPool
Definition: AyonLogger.hpp:273
void critical(fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:161
void error(const std::set< std::string >::iterator &it, fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:130
bool m_enableFileLogging
Definition: AyonLogger.hpp:275
void critical(const std::set< std::string >::iterator &it, fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:166
AyonLogger(const AyonLogger &)=delete
void setLogLevelError(bool applyToFile=false)
Definition: AyonLogger.hpp:199
void flush()
Definition: AyonLogger.hpp:213
void setLevel(spdlog::level::level_enum lvl, bool applyToFile)
Definition: AyonLogger.hpp:264
static AyonLogger & getInstance()
Definition: AyonLogger.hpp:33
std::shared_ptr< spdlog::logger > m_consoleLogger
Definition: AyonLogger.hpp:271
std::mutex m_initMutex
Definition: AyonLogger.hpp:276
void log(spdlog::level::level_enum lvl, fmt::format_string< Args... > fmt, Args &&... args)
Definition: AyonLogger.hpp:249
std::set< std::string > m_enabledLoggingKeys
Definition: AyonLogger.hpp:277
bool unregisterLoggingKey(const std::string &keyName)
Definition: AyonLogger.hpp:111
bool registerLoggingKey(const std::string &keyName)
Definition: AyonLogger.hpp:106
void setLogLevel(spdlog::level::level_enum lvl, bool applyToFile=false)
Definition: AyonLogger.hpp:172
void setLogLevelCritical(bool applyToFile=false)
Definition: AyonLogger.hpp:205
std::shared_ptr< spdlog::logger > m_fileLogger
Definition: AyonLogger.hpp:272
AyonLogger & operator=(const AyonLogger &)=delete
void setLogLevelInfo(bool applyToFile=false)
Definition: AyonLogger.hpp:196
void setLogLevelFromEnv(const std::string &envKey="AYON_USD_RESOLVER_LOG_LVL", bool applyToFile=false)
Definition: AyonLogger.hpp:187
~AyonLogger()
Definition: AyonLogger.hpp:232