3#ifdef USE_ESPHOME_TASK_LOG_BUFFER
13static const char *
const TAG =
"logger";
30 TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
31 bool is_main_task = (current_task ==
main_task_);
45 bool message_sent =
false;
46#ifdef USE_ESPHOME_TASK_LOG_BUFFER
49 this->
log_buffer_->send_message_thread_safe(level, tag,
static_cast<uint16_t
>(line), current_task, format, args);
63 static const size_t MAX_CONSOLE_LOG_MSG_SIZE = 144;
64 char console_buffer[MAX_CONSOLE_LOG_MSG_SIZE];
65 uint16_t buffer_at = 0;
67 MAX_CONSOLE_LOG_MSG_SIZE);
76void HOT
Logger::log_vprintf_(uint8_t level,
const char *tag,
int line,
const char *format, va_list args) {
89#ifdef USE_STORE_LOG_STR_IN_FLASH
120 auto *format_pgm_p =
reinterpret_cast<const uint8_t *
>(format);
151#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
159Logger::Logger(uint32_t baud_rate,
size_t tx_buffer_size) : baud_rate_(baud_rate), tx_buffer_size_(tx_buffer_size) {
162#if defined(USE_ESP32) || defined(USE_LIBRETINY)
163 this->
main_task_ = xTaskGetCurrentTaskHandle();
164#elif defined(USE_ZEPHYR)
168#ifdef USE_ESPHOME_TASK_LOG_BUFFER
170 this->
log_buffer_ = esphome::make_unique<logger::TaskLogBuffer>(total_buffer_size);
178#ifdef USE_ESPHOME_TASK_LOG_BUFFER
183#ifdef USE_ESPHOME_TASK_LOG_BUFFER
188 void *received_token;
191 while (this->
log_buffer_->borrow_message_main_loop(&message, &text, &received_token)) {
195 const char *thread_name =
message->thread_name[0] !=
'\0' ?
message->thread_name :
nullptr;
197 &this->tx_buffer_at_, this->tx_buffer_size_);
199 this->tx_buffer_size_);
206 this->
log_buffer_->release_message_main_loop(received_token);
225#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
229#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
238#ifdef USE_STORE_LOG_STR_IN_FLASH
241static const char LOG_LEVEL_NONE[] PROGMEM =
"NONE";
242static const char LOG_LEVEL_ERROR[] PROGMEM =
"ERROR";
243static const char LOG_LEVEL_WARN[] PROGMEM =
"WARN";
244static const char LOG_LEVEL_INFO[] PROGMEM =
"INFO";
245static const char LOG_LEVEL_CONFIG[] PROGMEM =
"CONFIG";
246static const char LOG_LEVEL_DEBUG[] PROGMEM =
"DEBUG";
247static const char LOG_LEVEL_VERBOSE[] PROGMEM =
"VERBOSE";
248static const char LOG_LEVEL_VERY_VERBOSE[] PROGMEM =
"VERY_VERBOSE";
250static const LogString *
const LOG_LEVELS[] = {
251 reinterpret_cast<const LogString *
>(LOG_LEVEL_NONE),
reinterpret_cast<const LogString *
>(LOG_LEVEL_ERROR),
252 reinterpret_cast<const LogString *
>(LOG_LEVEL_WARN),
reinterpret_cast<const LogString *
>(LOG_LEVEL_INFO),
253 reinterpret_cast<const LogString *
>(LOG_LEVEL_CONFIG),
reinterpret_cast<const LogString *
>(LOG_LEVEL_DEBUG),
254 reinterpret_cast<const LogString *
>(LOG_LEVEL_VERBOSE),
reinterpret_cast<const LogString *
>(LOG_LEVEL_VERY_VERBOSE),
257static const char *
const LOG_LEVELS[] = {
"NONE",
"ERROR",
"WARN",
"INFO",
"CONFIG",
"DEBUG",
"VERBOSE",
"VERY_VERBOSE"};
264 " Initial Level: %s",
265 LOG_STR_ARG(LOG_LEVELS[ESPHOME_LOG_LEVEL]), LOG_STR_ARG(LOG_LEVELS[this->
current_level_]));
268 " Log Baud Rate: %" PRIu32
"\n"
269 " Hardware UART: %s",
272#ifdef USE_ESPHOME_TASK_LOG_BUFFER
274 ESP_LOGCONFIG(TAG,
" Task Log Buffer Size: %u", this->
log_buffer_->size());
278#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
280 ESP_LOGCONFIG(TAG,
" Level for '%s': %s", it.first, LOG_STR_ARG(LOG_LEVELS[it.second]));
286 if (level > ESPHOME_LOG_LEVEL) {
287 level = ESPHOME_LOG_LEVEL;
288 ESP_LOGW(TAG,
"Cannot set log level higher than pre-compiled %s", LOG_STR_ARG(LOG_LEVELS[ESPHOME_LOG_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.
CallbackManager< void(uint8_t, const char *, const char *, size_t)> log_callback_
void HOT format_log_to_buffer_with_terminator_(uint8_t level, const char *tag, int line, const char *format, va_list args, char *buffer, uint16_t *buffer_at, uint16_t buffer_size)
void HOT log_message_to_buffer_and_send_(uint8_t level, const char *tag, int line, const char *format, va_list args)
void dump_config() override
const LogString * get_uart_selection_()
uint8_t level_for(const char *tag)
bool HOT check_and_set_task_log_recursion_(bool is_main_task)
void log_vprintf_(uint8_t level, const char *tag, int line, const char *format, va_list args)
CallbackManager< void(uint8_t)> level_callback_
void add_on_log_callback(std::function< void(uint8_t, const char *, const char *, size_t)> &&callback)
Register a callback that will be called for every log message sent.
void HOT write_footer_to_buffer_(char *buffer, uint16_t *buffer_at, uint16_t buffer_size)
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.
void disable_loop_when_buffer_empty_()
std::unique_ptr< logger::TaskLogBuffer > log_buffer_
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 reset_task_log_recursion_(bool is_main_task)
void write_msg_(const char *msg)
void write_body_to_buffer_(const char *value, size_t length, char *buffer, uint16_t *buffer_at, uint16_t buffer_size)
void HOT write_header_to_buffer_(uint8_t level, const char *tag, int line, const char *thread_name, char *buffer, uint16_t *buffer_at, uint16_t buffer_size)
UARTSelection
Enum for logging UART selection.
const float BUS
For communication buses like i2c/spi.
uint8_t progmem_read_byte(const uint8_t *addr)