From f5d0164f78318640defb56055b2638564cee6c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Edelbo?= Date: Wed, 6 Mar 2024 10:48:04 +0100 Subject: [PATCH 1/2] Add ability to get logging level via C API --- CHANGELOG.md | 2 +- src/realm.h | 9 ++++++++- src/realm/object-store/c_api/logging.cpp | 15 ++++++++++++--- test/object-store/c_api/c_api.cpp | 8 +++++--- 4 files changed, 26 insertions(+), 8 deletions(-) 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..e92693e77c4 100644 --- a/src/realm.h +++ b/src/realm.h @@ -602,7 +602,14 @@ 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 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..d8c35b1e302 100644 --- a/src/realm/object-store/c_api/logging.cpp +++ b/src/realm/object-store/c_api/logging.cpp @@ -73,9 +73,18 @@ 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)); +} + } // namespace realm::c_api diff --git a/test/object-store/c_api/c_api.cpp b/test/object-store/c_api/c_api.cpp index a0aa395b85b..c4c846057a7 100644 --- a/test/object-store/c_api/c_api.cpp +++ b/test/object-store/c_api/c_api.cpp @@ -1608,9 +1608,11 @@ TEST_CASE("C API logging", "[c_api]") { TestFile test_file; LogUserData userdata; - auto log_level_old = util::LogCategory::realm.get_default_level_threshold(); + 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); + 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 +1639,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]") { From 519bcb8971946466e27f555efdffad6e949eada1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Edelbo?= Date: Wed, 6 Mar 2024 15:12:58 +0100 Subject: [PATCH 2/2] Add ability to get log category names --- src/realm.h | 8 ++++++++ src/realm/object-store/c_api/logging.cpp | 14 ++++++++++++++ src/realm/util/logger.cpp | 9 +++++++++ src/realm/util/logger.hpp | 1 + test/object-store/c_api/c_api.cpp | 7 +++++++ 5 files changed, 39 insertions(+) diff --git a/src/realm.h b/src/realm.h index e92693e77c4..4539e4a3383 100644 --- a/src/realm.h +++ b/src/realm.h @@ -610,6 +610,14 @@ RLM_API realm_log_level_e realm_set_log_level_category(const char*, realm_log_le * 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 d8c35b1e302..35fb023d74d 100644 --- a/src/realm/object-store/c_api/logging.cpp +++ b/src/realm/object-store/c_api/logging.cpp @@ -87,4 +87,18 @@ RLM_API realm_log_level_e realm_get_log_level_category(const char* 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 c4c846057a7..e04d5f3ff0e 100644 --- a/test/object-store/c_api/c_api.cpp +++ b/test/object-store/c_api/c_api.cpp @@ -1608,8 +1608,15 @@ TEST_CASE("C API logging", "[c_api]") { TestFile test_file; LogUserData userdata; + 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); + 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);