12#include <nlohmann/json.hpp>
25 std::string lower = str;
26 std::transform(lower.begin(), lower.end(), lower.begin(),
27 [](
unsigned char c) { return std::tolower(c); });
65 std::lock_guard<std::mutex> lock(
mutex_);
71 std::lock_guard<std::mutex> lock(
mutex_);
73 return (it !=
categories_.end()) ? it->second :
nullptr;
78 std::lock_guard<std::mutex> lock(
mutex_);
81 it->second->setVerbosity(verbosity);
89 std::lock_guard<std::mutex> lock(
mutex_);
92 category->setVerbosity(verbosity);
98 std::lock_guard<std::mutex> lock(
mutex_);
99 std::vector<LogCategory*> result;
102 result.push_back(category);
110 std::ifstream file(configPath);
111 if (!file.is_open()) {
112 PLOGW <<
"[LogCategoryManager] Could not open config file: " << configPath;
116 nlohmann::json config;
119 if (!config.contains(
"LogCategories")) {
120 PLOGW <<
"[LogCategoryManager] Config file missing 'LogCategories' section";
124 const auto& categories = config[
"LogCategories"];
127 if (categories.contains(
"Default")) {
128 std::string defaultStr = categories[
"Default"].get<std::string>();
130 PLOGI <<
"[LogCategoryManager] Default verbosity set to: " << defaultStr;
134 std::lock_guard<std::mutex> lock(
mutex_);
136 if (categories.contains(name)) {
137 std::string verbStr = categories[name].get<std::string>();
139 category->setVerbosity(verbosity);
140 PLOGD <<
"[LogCategoryManager] " << name <<
" verbosity set to: " << verbStr;
147 PLOGI <<
"[LogCategoryManager] Loaded config from: " << configPath;
150 catch (
const std::exception& e) {
151 PLOGE <<
"[LogCategoryManager] Failed to load config: " << e.what();
159 nlohmann::json config;
160 nlohmann::json& categories = config[
"LogCategories"];
165 std::lock_guard<std::mutex> lock(
mutex_);
171 std::ofstream file(configPath);
172 if (!file.is_open()) {
173 PLOGE <<
"[LogCategoryManager] Could not open config file for writing: " << configPath;
177 file << config.dump(2);
178 PLOGI <<
"[LogCategoryManager] Saved config to: " << configPath;
181 catch (
const std::exception& e) {
182 PLOGE <<
"[LogCategoryManager] Failed to save config: " << e.what();
void setAllVerbosity(LogVerbosity verbosity)
Set verbosity for all categories.
LogVerbosity defaultVerbosity_
std::unordered_map< std::string, LogCategory * > categories_
LogCategory * findCategory(const std::string &name)
Find a category by name.
std::vector< LogCategory * > getAllCategories() const
Get all registered categories (for debug UI, listing, etc.)
LogCategoryManager()=default
bool loadConfig(const std::string &configPath)
Load verbosity settings from a JSON config file.
bool setVerbosity(const std::string &categoryName, LogVerbosity verbosity)
bool saveConfig(const std::string &configPath) const
Save current verbosity settings to a JSON config file.
static LogCategoryManager & get()
Get the singleton instance.
void registerCategory(LogCategory *category)
Register a category (called automatically by DEFINE_LOG_CATEGORY)
Represents a single log category with verbosity control.
std::atomic< LogVerbosity > runtimeVerbosity_
const char * getName() const
Get the category name.
LogCategory(const char *name, LogVerbosity defaultVerbosity, LogVerbosity compileTimeVerbosity)
Construct a log category.
const LogVerbosity compileTimeVerbosity_
Log category system implementation.
LogVerbosity verbosityFromString(const std::string &str)
Parse verbosity from string (case-insensitive)
LogVerbosity
Log verbosity levels, ordered from most to least severe.
@ Warning
Potential issue.
@ Info
Important state changes.
@ Fatal
Unrecoverable error, may crash.
@ Error
Recoverable error.
@ Debug
Development debugging.
@ Verbose
Detailed tracing.
constexpr const char * verbosityToString(LogVerbosity v)
Convert verbosity enum to string for display/config.