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);
157Logger::Logger(uint32_t baud_rate,
size_t tx_buffer_size) : baud_rate_(baud_rate), tx_buffer_size_(tx_buffer_size) {
160#if defined(USE_ESP32) || defined(USE_LIBRETINY)
161 this->
main_task_ = xTaskGetCurrentTaskHandle();
162#elif defined(USE_ZEPHYR)
166#ifdef USE_ESPHOME_TASK_LOG_BUFFER
168 this->
log_buffer_ = esphome::make_unique<logger::TaskLogBuffer>(total_buffer_size);
176#ifdef USE_ESPHOME_TASK_LOG_BUFFER
181#ifdef USE_ESPHOME_TASK_LOG_BUFFER
186 void *received_token;
189 while (this->
log_buffer_->borrow_message_main_loop(&message, &text, &received_token)) {
195 &this->tx_buffer_at_, this->tx_buffer_size_);
197 this->tx_buffer_size_);
204 this->
log_buffer_->release_message_main_loop(received_token);
225#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
234#ifdef USE_STORE_LOG_STR_IN_FLASH
237static const char LOG_LEVEL_NONE[] PROGMEM =
"NONE";
238static const char LOG_LEVEL_ERROR[] PROGMEM =
"ERROR";
239static const char LOG_LEVEL_WARN[] PROGMEM =
"WARN";
240static const char LOG_LEVEL_INFO[] PROGMEM =
"INFO";
241static const char LOG_LEVEL_CONFIG[] PROGMEM =
"CONFIG";
242static const char LOG_LEVEL_DEBUG[] PROGMEM =
"DEBUG";
243static const char LOG_LEVEL_VERBOSE[] PROGMEM =
"VERBOSE";
244static const char LOG_LEVEL_VERY_VERBOSE[] PROGMEM =
"VERY_VERBOSE";
246static const LogString *
const LOG_LEVELS[] = {
247 reinterpret_cast<const LogString *
>(LOG_LEVEL_NONE),
reinterpret_cast<const LogString *
>(LOG_LEVEL_ERROR),
248 reinterpret_cast<const LogString *
>(LOG_LEVEL_WARN),
reinterpret_cast<const LogString *
>(LOG_LEVEL_INFO),
249 reinterpret_cast<const LogString *
>(LOG_LEVEL_CONFIG),
reinterpret_cast<const LogString *
>(LOG_LEVEL_DEBUG),
250 reinterpret_cast<const LogString *
>(LOG_LEVEL_VERBOSE),
reinterpret_cast<const LogString *
>(LOG_LEVEL_VERY_VERBOSE),
253static const char *
const LOG_LEVELS[] = {
"NONE",
"ERROR",
"WARN",
"INFO",
"CONFIG",
"DEBUG",
"VERBOSE",
"VERY_VERBOSE"};
260 " Initial Level: %s",
261 LOG_STR_ARG(LOG_LEVELS[ESPHOME_LOG_LEVEL]), LOG_STR_ARG(LOG_LEVELS[this->
current_level_]));
264 " Log Baud Rate: %" PRIu32
"\n"
265 " Hardware UART: %s",
268#ifdef USE_ESPHOME_TASK_LOG_BUFFER
270 ESP_LOGCONFIG(TAG,
" Task Log Buffer Size: %u", this->
log_buffer_->size());
275 ESP_LOGCONFIG(TAG,
" Level for '%s': %s", it.first.c_str(), LOG_STR_ARG(LOG_LEVELS[it.second]));
280 if (level > ESPHOME_LOG_LEVEL) {
281 level = ESPHOME_LOG_LEVEL;
282 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
UARTSelection get_uart() const
Get the UART used by the logger.
std::map< std::string, uint8_t > log_levels_
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)