diff --git a/esphome/components/logger/logger.h b/esphome/components/logger/logger.h index 977019adb5..5ce6a5cd80 100644 --- a/esphome/components/logger/logger.h +++ b/esphome/components/logger/logger.h @@ -40,52 +40,6 @@ struct device; namespace esphome::logger { -/** Interface for receiving log messages without std::function overhead. - * - * Components can implement this interface instead of using lambdas with std::function - * to reduce flash usage from std::function type erasure machinery. - * - * Usage: - * class MyComponent : public Component, public LogListener { - * public: - * void setup() override { - * if (logger::global_logger != nullptr) - * logger::global_logger->add_log_listener(this); - * } - * void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) override { - * // Handle log message - * } - * }; - */ -class LogListener { - public: - virtual void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) = 0; -}; - -#ifdef USE_LOGGER_LEVEL_LISTENERS -/** Interface for receiving log level changes without std::function overhead. - * - * Components can implement this interface instead of using lambdas with std::function - * to reduce flash usage from std::function type erasure machinery. - * - * Usage: - * class MyComponent : public Component, public LoggerLevelListener { - * public: - * void setup() override { - * if (logger::global_logger != nullptr) - * logger::global_logger->add_logger_level_listener(this); - * } - * void on_log_level_change(uint8_t level) override { - * // Handle log level change - * } - * }; - */ -class LoggerLevelListener { - public: - virtual void on_log_level_change(uint8_t level) = 0; -}; -#endif - #ifdef USE_LOGGER_RUNTIME_TAG_LEVELS // Comparison function for const char* keys in log_levels_ map struct CStrCompare { @@ -93,6 +47,8 @@ struct CStrCompare { }; #endif +class LogListener; + // Stack buffer size for retrieving thread/task names from the OS // macOS allows up to 64 bytes, Linux up to 16 static constexpr size_t THREAD_NAME_BUF_SIZE = 64; @@ -475,19 +431,4 @@ class Logger : public Component { }; extern Logger *global_logger; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -class LoggerMessageTrigger : public Trigger, public LogListener { - public: - explicit LoggerMessageTrigger(Logger *parent, uint8_t level) : level_(level) { parent->add_log_listener(this); } - - void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) override { - (void) message_len; - if (level <= this->level_) { - this->trigger(level, tag, message); - } - } - - protected: - uint8_t level_; -}; - } // namespace esphome::logger diff --git a/esphome/components/logger/logger_listeners.h b/esphome/components/logger/logger_listeners.h new file mode 100644 index 0000000000..11bf840b13 --- /dev/null +++ b/esphome/components/logger/logger_listeners.h @@ -0,0 +1,68 @@ +#pragma once + +#include "logger.h" + +namespace esphome::logger { + +/** Interface for receiving log messages without std::function overhead. + * + * Components can implement this interface instead of using lambdas with std::function + * to reduce flash usage from std::function type erasure machinery. + * + * Usage: + * class MyComponent : public Component, public LogListener { + * public: + * void setup() override { + * if (logger::global_logger != nullptr) + * logger::global_logger->add_log_listener(this); + * } + * void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) override { + * // Handle log message + * } + * }; + */ +class LogListener { + public: + virtual void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) = 0; +}; + +#ifdef USE_LOGGER_LEVEL_LISTENERS +/** Interface for receiving log level changes without std::function overhead. + * + * Components can implement this interface instead of using lambdas with std::function + * to reduce flash usage from std::function type erasure machinery. + * + * Usage: + * class MyComponent : public Component, public LoggerLevelListener { + * public: + * void setup() override { + * if (logger::global_logger != nullptr) + * logger::global_logger->add_logger_level_listener(this); + * } + * void on_log_level_change(uint8_t level) override { + * // Handle log level change + * } + * }; + */ +class LoggerLevelListener { + public: + virtual void on_log_level_change(uint8_t level) = 0; +}; +#endif + +class LoggerMessageTrigger : public Trigger, public LogListener { + public: + explicit LoggerMessageTrigger(Logger *parent, uint8_t level) : level_(level) { parent->add_log_listener(this); } + + void on_log(uint8_t level, const char *tag, const char *message, size_t message_len) override { + (void) message_len; + if (level <= this->level_) { + this->trigger(level, tag, message); + } + } + + protected: + uint8_t level_; +}; + +} // namespace esphome::logger