11static const char *
const TAG =
"logger";
13#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
30#if defined(USE_ESP32) || defined(USE_LIBRETINY)
32 TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
33 const bool is_main_task = (current_task == this->
main_task_);
35 k_tid_t current_task = k_current_get();
36 const bool is_main_task = (current_task == this->
main_task_);
38 const bool is_main_task = pthread_equal(pthread_self(), this->
main_thread_);
58#if defined(USE_ESP32) || defined(USE_LIBRETINY)
60#elif defined(USE_ZEPHYR)
61 char thread_name_buf[MAX_POINTER_REPRESENTATION];
64 char thread_name_buf[THREAD_NAME_BUF_SIZE];
73 const char *thread_name) {
82 bool message_sent =
false;
83#ifdef USE_ESPHOME_TASK_LOG_BUFFER
105 static const size_t MAX_CONSOLE_LOG_MSG_SIZE = 512;
108 static const size_t MAX_CONSOLE_LOG_MSG_SIZE = 144;
110 char console_buffer[MAX_CONSOLE_LOG_MSG_SIZE];
111 LogBuffer buf{console_buffer, MAX_CONSOLE_LOG_MSG_SIZE};
130#ifdef USE_STORE_LOG_STR_IN_FLASH
147#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
156#if defined(USE_ESP32) || defined(USE_LIBRETINY)
157 this->
main_task_ = xTaskGetCurrentTaskHandle();
158#elif defined(USE_ZEPHYR)
160#elif defined(USE_HOST)
165#if defined(USE_ESPHOME_TASK_LOG_BUFFER) || (defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
168#if defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC)
175#ifdef USE_ESPHOME_TASK_LOG_BUFFER
179 uint16_t text_length;
181 const char *thread_name =
message->thread_name[0] !=
'\0' ?
message->thread_name :
nullptr;
184 message->text_data(), text_length, buf);
190#if !(defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
201#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
205#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
212PROGMEM_STRING_TABLE(LogLevelStrings,
"NONE",
"ERROR",
"WARN",
"INFO",
"CONFIG",
"DEBUG",
"VERBOSE",
"VERY_VERBOSE");
214static const LogString *get_log_level_str(uint8_t level) {
215 return LogLevelStrings::get_log_str(level, LogLevelStrings::LAST_INDEX);
222 " Initial Level: %s",
223 LOG_STR_ARG(get_log_level_str(ESPHOME_LOG_LEVEL)),
227 " Log Baud Rate: %" PRIu32
"\n"
228 " Hardware UART: %s",
231#ifdef USE_ESPHOME_TASK_LOG_BUFFER
233 ESP_LOGCONFIG(TAG,
" Task Log Buffer Slots: %u",
static_cast<unsigned int>(this->
log_buffer_.
size()));
235 ESP_LOGCONFIG(TAG,
" Task Log Buffer Size: %u bytes",
static_cast<unsigned int>(this->
log_buffer_.
size()));
239#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
241 ESP_LOGCONFIG(TAG,
" Level for '%s': %s", it.first, LOG_STR_ARG(get_log_level_str(it.second)));
250#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERY_VERBOSE
251 ESP_LOGW(TAG,
"VERY_VERBOSE logging is active — significant performance impact, short-term debugging only\n"
252 " May cause connection instability. Set log level to DEBUG or lower for long-term use.");
253#elif ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
254 ESP_LOGI(TAG,
"VERBOSE logging is active — performance impact, short-term debugging only\n"
255 " Set log level to DEBUG or lower for long-term use.");
260 if (level > ESPHOME_LOG_LEVEL) {
261 level = ESPHOME_LOG_LEVEL;
262 ESP_LOGW(TAG,
"Cannot set log level higher than pre-compiled %s",
263 LOG_STR_ARG(get_log_level_str(ESPHOME_LOG_LEVEL)));
266#ifdef USE_LOGGER_LEVEL_LISTENERS
268 listener->on_log_level_change(level);
void enable_loop_soon_any_context()
Thread and ISR-safe version of enable_loop() that can be called from any context.
Logger component for all ESPHome logging.
const char *HOT get_thread_name_()
void dump_config() override
bool HOT is_non_main_task_recursive_() const
NonMainTaskRecursionGuard make_non_main_task_guard_()
const LogString * get_uart_selection_()
uint8_t level_for(const char *tag)
void log_vprintf_(uint8_t level, const char *tag, int line, const char *format, va_list args)
void HOT log_message_to_buffer_and_send_(bool &recursion_guard, uint8_t level, const char *tag, int line, FormatType format, va_list args, const char *thread_name)
char tx_buffer_[ESPHOME_LOGGER_TX_BUFFER_SIZE+1]
void HOT format_buffered_message_and_notify_(uint8_t level, const char *tag, uint16_t line, const char *thread_name, const char *text, uint16_t text_length, LogBuffer &buf)
float get_setup_priority() const override
std::map< const char *, uint8_t, CStrCompare > log_levels_
UARTSelection get_uart() const
Get the UART used by the logger.
std::vector< LoggerLevelListener * > level_listeners_
void disable_loop_when_buffer_empty_()
void HOT format_log_to_buffer_with_terminator_(uint8_t level, const char *tag, int line, const char *format, va_list args, LogBuffer &buf, const char *thread_name)
void HOT write_log_buffer_to_console_(LogBuffer &buf)
void set_log_level(uint8_t level)
Set the default log level for this logger.
void set_baud_rate(uint32_t baud_rate)
Manually set the baud rate for serial, set to 0 to disable.
bool global_recursion_guard_
void HOT write_to_console_(LogBuffer &buf)
void log_vprintf_non_main_thread_(uint8_t level, const char *tag, int line, const char *format, va_list args, const char *thread_name)
logger::TaskLogBuffer log_buffer_
bool main_task_recursion_guard_
Logger(uint32_t baud_rate)
void release_message_main_loop()
bool borrow_message_main_loop(LogMessage *&message, uint16_t &text_length)
bool send_message_thread_safe(uint8_t level, const char *tag, uint16_t line, const char *thread_name, const char *format, va_list args)
static constexpr size_t size()
bool HOT has_messages() const
UARTSelection
Enum for logging UART selection.
PROGMEM_STRING_TABLE(LogLevelStrings, "NONE", "ERROR", "WARN", "INFO", "CONFIG", "DEBUG", "VERBOSE", "VERY_VERBOSE")
constexpr float BUS
For communication buses like i2c/spi.
const char int const __FlashStringHelper * format
const char int const __FlashStringHelper va_list args