diff --git a/CHANGELOG.md b/CHANGELOG.md index 5467bca75ed..e0bb11f5752 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ### Enhancements * (PR [#????](https://github.com/realm/realm-core/pull/????)) -* None. +* Added ability to get current log level via C API (PR [#7419](https://github.com/realm/realm-core/pull/7419)) ### Fixed * ([#????](https://github.com/realm/realm-core/issues/????), since v?.?.?) diff --git a/src/realm.h b/src/realm.h index 6e56dbe806c..4539e4a3383 100644 --- a/src/realm.h +++ b/src/realm.h @@ -602,7 +602,22 @@ typedef void (*realm_log_func_t)(realm_userdata_t userdata, realm_log_level_e le RLM_API void realm_set_log_callback(realm_log_func_t, realm_log_level_e, realm_userdata_t userdata, realm_free_userdata_func_t userdata_free) RLM_API_NOEXCEPT; RLM_API void realm_set_log_level(realm_log_level_e) RLM_API_NOEXCEPT; -RLM_API void realm_set_log_level_category(const char*, realm_log_level_e) RLM_API_NOEXCEPT; +/** + * Set the logging level for given category. Return the previous level. + */ +RLM_API realm_log_level_e realm_set_log_level_category(const char*, realm_log_level_e) RLM_API_NOEXCEPT; +/** + * Get the logging level for given category. + */ +RLM_API realm_log_level_e realm_get_log_level_category(const char*) RLM_API_NOEXCEPT; +/** + * Get the actual log category names (currently 15) + @param num_values number of values in the out_values array + @param out_values pointer to an array of size num_values + @return returns the number of categories returned. If num_values is zero, it will + return the total number of categories. + */ +RLM_API size_t realm_get_category_names(size_t num_values, const char** out_values); /** * Get a thread-safe reference representing the same underlying object as some diff --git a/src/realm/object-store/c_api/logging.cpp b/src/realm/object-store/c_api/logging.cpp index 990af4672b0..35fb023d74d 100644 --- a/src/realm/object-store/c_api/logging.cpp +++ b/src/realm/object-store/c_api/logging.cpp @@ -73,9 +73,32 @@ RLM_API void realm_set_log_level(realm_log_level_e level) noexcept util::LogCategory::realm.set_default_level_threshold(realm::util::LogCategory::Level(level)); } -RLM_API void realm_set_log_level_category(const char* category_name, realm_log_level_e level) noexcept +RLM_API realm_log_level_e realm_set_log_level_category(const char* category_name, realm_log_level_e level) noexcept { - util::LogCategory::get_category(category_name) - .set_default_level_threshold(realm::util::LogCategory::Level(level)); + auto& cat = util::LogCategory::get_category(category_name); + realm_log_level_e prev_level = realm_log_level_e(util::Logger::get_default_logger()->get_level_threshold(cat)); + cat.set_default_level_threshold(realm::util::LogCategory::Level(level)); + return prev_level; } + +RLM_API realm_log_level_e realm_get_log_level_category(const char* category_name) noexcept +{ + auto& cat = util::LogCategory::get_category(category_name); + return realm_log_level_e(util::Logger::get_default_logger()->get_level_threshold(cat)); +} + +RLM_API size_t realm_get_category_names(size_t num_values, const char** out_values) +{ + auto vec = util::LogCategory::get_category_names(); + auto number_to_copy = vec.size(); + if (num_values > 0) { + if (number_to_copy > num_values) + number_to_copy = num_values; + for (size_t n = 0; n < number_to_copy; n++) { + out_values[n] = vec[n]; + } + } + return number_to_copy; +} + } // namespace realm::c_api diff --git a/src/realm/util/logger.cpp b/src/realm/util/logger.cpp index 18dfb6f29af..2c5d9791ba5 100644 --- a/src/realm/util/logger.cpp +++ b/src/realm/util/logger.cpp @@ -66,6 +66,15 @@ LogCategory& LogCategory::get_category(std::string_view name) return *log_catagory_map.at(name); // Throws } +std::vector LogCategory::get_category_names() +{ + std::vector ret; + for (auto& it : log_catagory_map) { + ret.push_back(it.second->get_name().c_str()); + } + return ret; +} + void LogCategory::set_default_level_threshold(Level level) { m_default_level.store(level); diff --git a/src/realm/util/logger.hpp b/src/realm/util/logger.hpp index 9a788b8dbe0..a438cf60179 100644 --- a/src/realm/util/logger.hpp +++ b/src/realm/util/logger.hpp @@ -99,6 +99,7 @@ class LogCategory { // Find category from fully qualified name. Will throw if // name does not match a category static LogCategory& get_category(std::string_view name); + static std::vector get_category_names(); private: friend class Logger; diff --git a/test/object-store/c_api/c_api.cpp b/test/object-store/c_api/c_api.cpp index a0aa395b85b..e04d5f3ff0e 100644 --- a/test/object-store/c_api/c_api.cpp +++ b/test/object-store/c_api/c_api.cpp @@ -1608,9 +1608,18 @@ TEST_CASE("C API logging", "[c_api]") { TestFile test_file; LogUserData userdata; - auto log_level_old = util::LogCategory::realm.get_default_level_threshold(); + const char* category_names[20]; + auto num_categories = realm_get_category_names(20, category_names); + auto log_level_old = realm_get_log_level_category("Realm"); + realm_set_log_callback(realm_log_func, RLM_LOG_LEVEL_DEBUG, &userdata, nullptr); - realm_set_log_level_category("Realm.Storage.Object", RLM_LOG_LEVEL_OFF); + for (size_t n = 0; n < num_categories; n++) { + CHECK(realm_get_log_level_category(category_names[n]) == RLM_LOG_LEVEL_DEBUG); + } + + auto prev_level = realm_set_log_level_category("Realm.Storage.Object", RLM_LOG_LEVEL_OFF); + CHECK(prev_level == RLM_LOG_LEVEL_DEBUG); + CHECK(realm_get_log_level_category("Realm.Storage.Object") == RLM_LOG_LEVEL_OFF); auto config = make_config(test_file.path.c_str(), true); realm_t* realm = realm_open(config.get()); realm_begin_write(realm); @@ -1637,7 +1646,7 @@ TEST_CASE("C API logging", "[c_api]") { // Remove this logger again realm_set_log_callback(nullptr, RLM_LOG_LEVEL_DEBUG, nullptr, nullptr); // Restore old log level - util::LogCategory::realm.set_default_level_threshold(log_level_old); + realm_set_log_level(log_level_old); } TEST_CASE("C API - scheduler", "[c_api]") {