9#include <spdlog/spdlog.h>
16spdlog::level::level_enum ConvertToSpdlogLevel(
LogLevel level) {
20 return spdlog::level::trace;
22 return spdlog::level::info;
24 return spdlog::level::warn;
26 return spdlog::level::err;
28 return spdlog::level::critical;
30 return spdlog::level::info;
42 auto time_t = std::chrono::system_clock::to_time_t(
timestamp);
43 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
timestamp.time_since_epoch()) % 1000;
46 ss << std::put_time(std::localtime(&time_t),
"%Y-%m-%d %H:%M:%S");
47 ss <<
'.' << std::setfill(
'0') << std::setw(3) << ms.count();
94 SpdlogManager::GetInstance().Initialize();
95 }
catch (
const std::exception &e) {
123 auto entry = std::make_shared<LogEntry>(level, category, message);
135 auto spdlog_level = ConvertToSpdlogLevel(level);
137 if (spdlog_level >= spdlog::default_logger()->level()) {
138 spdlog::log(spdlog_level,
"[{}] {}", category, message);
140 }
catch (
const std::exception &e) {
142 std::cout << entry->FormatMessage() << std::endl;
145 std::cout << entry->FormatMessage() << std::endl;
153 auto spdlog_level = ConvertToSpdlogLevel(level);
155 if (spdlog_level >= spdlog::default_logger()->level()) {
156 spdlog::log(spdlog_level,
"[{}] {}", category, message);
158 }
catch (
const std::exception &e) {
160 std::cout << entry->FormatMessage() << std::endl;
173 std::vector<std::shared_ptr<LogEntry>> filtered;
175 for (
const auto &entry :
entries_) {
177 if (level_filter !=
LogLevel::All && entry->level != level_filter) {
182 if (!category_filter.empty()) {
183 std::string entry_cat_lower = entry->category;
184 std::string filter_lower = category_filter;
185 std::transform(entry_cat_lower.begin(), entry_cat_lower.end(), entry_cat_lower.begin(), ::tolower);
186 std::transform(filter_lower.begin(), filter_lower.end(), filter_lower.begin(), ::tolower);
188 if (entry_cat_lower.find(filter_lower) == std::string::npos) {
194 if (!search_text.empty()) {
195 std::string entry_msg_lower = entry->message;
196 std::string entry_cat_lower = entry->category;
197 std::string search_lower = search_text;
198 std::transform(entry_msg_lower.begin(), entry_msg_lower.end(), entry_msg_lower.begin(), ::tolower);
199 std::transform(entry_cat_lower.begin(), entry_cat_lower.end(), entry_cat_lower.begin(), ::tolower);
200 std::transform(search_lower.begin(), search_lower.end(), search_lower.begin(), ::tolower);
202 if (entry_msg_lower.find(search_lower) == std::string::npos &&
203 entry_cat_lower.find(search_lower) == std::string::npos) {
208 filtered.push_back(entry);
228 }
catch (
const std::exception &e) {
243 SpdlogManager::GetInstance().SetConsoleColorsEnabled(enabled);
244 }
catch (
const std::exception &e) {
void Warning(const EmberCore::String &category, const EmberCore::String &message)
std::map< ObserverId, std::function< void()> > observers_
void Error(const EmberCore::String &category, const EmberCore::String &message)
static Logger & GetInstance()
ObserverId AddObserver(std::function< void()> observer)
void RemoveObserver(ObserverId id)
void Trace(const EmberCore::String &category, const EmberCore::String &message)
std::vector< std::shared_ptr< LogEntry > > entries_
void Log(LogLevel level, const EmberCore::String &category, const EmberCore::String &message)
void SetConsoleColorsEnabled(bool enabled)
bool file_logging_enabled_
void Critical(const EmberCore::String &category, const EmberCore::String &message)
void Info(const EmberCore::String &category, const EmberCore::String &message)
std::vector< std::shared_ptr< LogEntry > > GetFilteredEntries(LogLevel level_filter=LogLevel::All, const EmberCore::String &category_filter="", const EmberCore::String &search_text="") const
bool console_logging_enabled_
ObserverId next_observer_id_
Main types header for EmberCore.
LogLevel
Log levels for categorizing messages.
std::string String
Framework-agnostic string type.
RGBA color with 8-bit components.
static const Color Yellow
static const Color Magenta
EmberCore::Color GetLevelColor() const
EmberCore::String FormatMessage() const
std::chrono::system_clock::time_point timestamp
EmberCore::String GetLevelString() const
LogEntry(LogLevel lvl, const EmberCore::String &cat, const EmberCore::String &msg)
EmberCore::String category
EmberCore::String message
EmberCore::String formatted_message