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};
122void HOT
Logger::log_vprintf_(uint8_t level,
const char *tag,
int line,
const char *format, va_list args) {
130#ifdef USE_STORE_LOG_STR_IN_FLASH
147#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
155Logger::Logger(uint32_t baud_rate,
size_t tx_buffer_size) : baud_rate_(baud_rate), tx_buffer_size_(tx_buffer_size) {
159#if defined(USE_ESP32) || defined(USE_LIBRETINY)
160 this->
main_task_ = xTaskGetCurrentTaskHandle();
161#elif defined(USE_ZEPHYR)
163#elif defined(USE_HOST)
167#ifdef USE_ESPHOME_TASK_LOG_BUFFER
174#if !(defined(USE_ZEPHYR) || defined(USE_LOGGER_USB_CDC))
182#if defined(USE_ESPHOME_TASK_LOG_BUFFER) || (defined(USE_ZEPHYR) && defined(USE_LOGGER_USB_CDC))
185#if defined(USE_ZEPHYR) && defined(USE_LOGGER_USB_CDC)
192#ifdef USE_ESPHOME_TASK_LOG_BUFFER
196 uint16_t text_length;
198 const char *thread_name =
message->thread_name[0] !=
'\0' ?
message->thread_name :
nullptr;
201 message->text_data(), text_length, buf);
208#if !(defined(USE_ZEPHYR) || defined(USE_LOGGER_USB_CDC))
219#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
223#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
230PROGMEM_STRING_TABLE(LogLevelStrings,
"NONE",
"ERROR",
"WARN",
"INFO",
"CONFIG",
"DEBUG",
"VERBOSE",
"VERY_VERBOSE");
232static const LogString *get_log_level_str(uint8_t level) {
233 return LogLevelStrings::get_log_str(level, LogLevelStrings::LAST_INDEX);
240 " Initial Level: %s",
241 LOG_STR_ARG(get_log_level_str(ESPHOME_LOG_LEVEL)),
245 " Log Baud Rate: %" PRIu32
"\n"
246 " Hardware UART: %s",
249#ifdef USE_ESPHOME_TASK_LOG_BUFFER
252 ESP_LOGCONFIG(TAG,
" Task Log Buffer Slots: %u",
static_cast<unsigned int>(this->
log_buffer_->
size()));
254 ESP_LOGCONFIG(TAG,
" Task Log Buffer Size: %u bytes",
static_cast<unsigned int>(this->
log_buffer_->
size()));
259#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
261 ESP_LOGCONFIG(TAG,
" Level for '%s': %s", it.first, LOG_STR_ARG(get_log_level_str(it.second)));
267 if (level > ESPHOME_LOG_LEVEL) {
268 level = ESPHOME_LOG_LEVEL;
269 ESP_LOGW(TAG,
"Cannot set log level higher than pre-compiled %s",
270 LOG_STR_ARG(get_log_level_str(ESPHOME_LOG_LEVEL)));
273#ifdef USE_LOGGER_LEVEL_LISTENERS
275 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)
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 init_log_buffer(size_t total_buffer_size)
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_
Logger(uint32_t baud_rate, size_t tx_buffer_size)
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)
bool main_task_recursion_guard_
logger::TaskLogBuffer * log_buffer_
Task log buffer for ESP32 platform using FreeRTOS ring buffer.
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)
bool HOT has_messages() const
UARTSelection
Enum for logging UART selection.
PROGMEM_STRING_TABLE(LogLevelStrings, "NONE", "ERROR", "WARN", "INFO", "CONFIG", "DEBUG", "VERBOSE", "VERY_VERBOSE")
const float BUS
For communication buses like i2c/spi.