diff --git a/components/log/include/esp_log.h b/components/log/include/esp_log.h index 02f7d167fe..d46e8068b1 100644 --- a/components/log/include/esp_log.h +++ b/components/log/include/esp_log.h @@ -71,6 +71,16 @@ extern esp_log_level_t esp_log_default_level; */ void esp_log_level_set(const char* tag, esp_log_level_t level); +/** + * @brief Get log level for given tag, can be used to avoid expensive log statements + * + * @param tag Tag of the log to query current level. Must be a non-NULL zero terminated + * string. + * + * @return The current log level for the given tag + */ +esp_log_level_t esp_log_level_get(const char* tag); + /** * @brief Set function used to output log entries * diff --git a/components/log/log.c b/components/log/log.c index 9af956516c..4ac47c5b14 100644 --- a/components/log/log.c +++ b/components/log/log.c @@ -141,6 +141,35 @@ void esp_log_level_set(const char *tag, esp_log_level_t level) esp_log_impl_unlock(); } + +/* Common code for getting the log level from cache, esp_log_impl_lock() + should be called before calling this function. The function unlocks, + as indicated in the name. +*/ +static esp_log_level_t s_log_level_get_and_unlock(const char *tag) +{ + esp_log_level_t level_for_tag; + // Look for the tag in cache first, then in the linked list of all tags + if (!get_cached_log_level(tag, &level_for_tag)) { + if (!get_uncached_log_level(tag, &level_for_tag)) { + level_for_tag = esp_log_default_level; + } + add_to_cache(tag, level_for_tag); +#ifdef LOG_BUILTIN_CHECKS + ++s_log_cache_misses; +#endif + } + esp_log_impl_unlock(); + + return level_for_tag; +} + +esp_log_level_t esp_log_level_get(const char *tag) +{ + esp_log_impl_lock(); + return s_log_level_get_and_unlock(tag); +} + void clear_log_level_list(void) { uncached_tag_entry_t *it; @@ -163,18 +192,7 @@ void esp_log_writev(esp_log_level_t level, if (!esp_log_impl_lock_timeout()) { return; } - esp_log_level_t level_for_tag; - // Look for the tag in cache first, then in the linked list of all tags - if (!get_cached_log_level(tag, &level_for_tag)) { - if (!get_uncached_log_level(tag, &level_for_tag)) { - level_for_tag = esp_log_default_level; - } - add_to_cache(tag, level_for_tag); -#ifdef LOG_BUILTIN_CHECKS - ++s_log_cache_misses; -#endif - } - esp_log_impl_unlock(); + esp_log_level_t level_for_tag = s_log_level_get_and_unlock(tag); if (!should_output(level, level_for_tag)) { return; }