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
156#if defined(USE_ESP32) || defined(USE_LIBRETINY)
157 this->
main_task_ = xTaskGetCurrentTaskHandle();
158#elif defined(USE_ZEPHYR)
160#elif defined(USE_HOST)
164#ifdef USE_ESPHOME_TASK_LOG_BUFFER
170#if !(defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
179#if defined(USE_ESPHOME_TASK_LOG_BUFFER) || (defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
182#if defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC)
189#ifdef USE_ESPHOME_TASK_LOG_BUFFER
193 uint16_t text_length;
195 const char *thread_name =
message->thread_name[0] !=
'\0' ?
message->thread_name :
nullptr;
198 message->text_data(), text_length, buf);
204#if !(defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
215#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
219#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
226PROGMEM_STRING_TABLE(LogLevelStrings,
"NONE",
"ERROR",
"WARN",
"INFO",
"CONFIG",
"DEBUG",
"VERBOSE",
"VERY_VERBOSE");
228static const LogString *get_log_level_str(uint8_t level) {
229 return LogLevelStrings::get_log_str(level, LogLevelStrings::LAST_INDEX);
236 " Initial Level: %s",
237 LOG_STR_ARG(get_log_level_str(ESPHOME_LOG_LEVEL)),
241 " Log Baud Rate: %" PRIu32
"\n"
242 " Hardware UART: %s",
245#ifdef USE_ESPHOME_TASK_LOG_BUFFER
248 ESP_LOGCONFIG(TAG,
" Task Log Buffer Slots: %u",
static_cast<unsigned int>(this->
log_buffer_->
size()));
250 ESP_LOGCONFIG(TAG,
" Task Log Buffer Size: %u bytes",
static_cast<unsigned int>(this->
log_buffer_->
size()));
255#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
257 ESP_LOGCONFIG(TAG,
" Level for '%s': %s", it.first, LOG_STR_ARG(get_log_level_str(it.second)));
266 if (level > ESPHOME_LOG_LEVEL) {
267 level = ESPHOME_LOG_LEVEL;
268 ESP_LOGW(TAG,
"Cannot set log level higher than pre-compiled %s",
269 LOG_STR_ARG(get_log_level_str(ESPHOME_LOG_LEVEL)));
272#ifdef USE_LOGGER_LEVEL_LISTENERS
274 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 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_
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(uint32_t baud_rate)
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")
constexpr float BUS
For communication buses like i2c/spi.