14#ifdef USE_ESPHOME_TASK_LOG_BUFFER
19#if defined(USE_ESP8266) || defined(USE_ESP32)
20#include <HardwareSerial.h>
23#include <HardwareSerial.h>
29#include <driver/uart.h>
37static const char *
const LOG_LEVEL_COLORS[] = {
39 ESPHOME_LOG_BOLD(ESPHOME_LOG_COLOR_RED),
40 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_YELLOW),
41 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_GREEN),
42 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_MAGENTA),
43 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_CYAN),
44 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_GRAY),
45 ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_WHITE),
48static const char *
const LOG_LEVEL_LETTERS[] = {
59#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY)
72#if defined(USE_LIBRETINY) || defined(USE_ESP32_VARIANT_ESP32)
75#ifdef USE_LOGGER_USB_CDC
78#ifdef USE_LOGGER_USB_SERIAL_JTAG
106 explicit Logger(uint32_t baud_rate,
size_t tx_buffer_size);
107#ifdef USE_ESPHOME_TASK_LOG_BUFFER
110#if defined(USE_LOGGER_USB_CDC) || defined(USE_ESP32)
111 void loop()
override;
125#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY)
153 void log_vprintf_(
int level,
const char *tag,
int line,
const char *format, va_list args);
154#ifdef USE_STORE_LOG_STR_IN_FLASH
155 void log_vprintf_(
int level,
const char *tag,
int line,
const __FlashStringHelper *format, va_list args);
165 va_list args,
char *buffer,
int *buffer_at,
int buffer_size) {
166#if defined(USE_ESP32) || defined(USE_LIBRETINY)
176 if (*buffer_at >= buffer_size) {
177 buffer[buffer_size - 1] =
'\0';
179 buffer[*buffer_at] =
'\0';
200 const int available = buffer_size - *buffer_at;
209 memcpy(buffer + *buffer_at, value, copy_len);
210 *buffer_at += copy_len;
215 inline void printf_to_buffer_(
const char *format,
char *buffer,
int *buffer_at,
int buffer_size, ...) {
217 va_start(arg, buffer_size);
230#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040)
245#ifdef USE_ESPHOME_TASK_LOG_BUFFER
259#if defined(USE_ESP32) || defined(USE_LIBRETINY)
262 TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
266#if defined(USE_ESP32)
267 return pcTaskGetName(current_task);
268#elif defined(USE_LIBRETINY)
269 return pcTaskGetTaskName(current_task);
280 return was_recursive;
302 int *buffer_at,
int buffer_size) {
309 const char *color = esphome::logger::LOG_LEVEL_COLORS[level];
310 const char *letter = esphome::logger::LOG_LEVEL_LETTERS[level];
312#if defined(USE_ESP32) || defined(USE_LIBRETINY)
313 if (thread_name !=
nullptr) {
315 this->
printf_to_buffer_(
"%s[%s][%s:%03u]%s[%s]%s: ", buffer, buffer_at, buffer_size, color, letter, tag, line,
316 ESPHOME_LOG_BOLD(ESPHOME_LOG_COLOR_RED), thread_name, color);
321 this->
printf_to_buffer_(
"%s[%s][%s:%03u]: ", buffer, buffer_at, buffer_size, color, letter, tag, line);
327 const int remaining = buffer_size - *buffer_at;
331 const int ret = vsnprintf(buffer + *buffer_at, remaining, format, args);
338 int formatted_len = (ret >= remaining) ? remaining : ret;
339 *buffer_at += formatted_len;
342 while (*buffer_at > 0 && buffer[*buffer_at - 1] ==
'\n') {
348 static const int RESET_COLOR_LEN = strlen(ESPHOME_LOG_RESET_COLOR);
349 this->
write_body_to_buffer_(ESPHOME_LOG_RESET_COLOR, RESET_COLOR_LEN, buffer, buffer_at, buffer_size);
359 if (level <= this->
level_) {
360 this->
trigger(level, tag, message);
Logger component for all ESPHome logging.
void call_log_callbacks_(int level, const char *tag, const char *msg)
int level_for(const char *tag)
void HOT write_footer_to_buffer_(char *buffer, int *buffer_at, int buffer_size)
const char *HOT get_thread_name_()
void dump_config() override
uint32_t get_baud_rate() const
const char * get_uart_selection_()
void log_vprintf_(int level, const char *tag, int line, const char *format, va_list args)
bool HOT check_and_set_task_log_recursion_(bool is_main_task)
Stream * get_hw_serial() const
void create_pthread_key()
void pre_setup()
Set up this component.
CallbackManager< void(int, const char *, const char *)> log_callback_
void HOT log_message_to_buffer_and_send_(int level, const char *tag, int line, const char *format, va_list args)
void printf_to_buffer_(const char *format, char *buffer, int *buffer_at, int buffer_size,...)
float get_setup_priority() const override
UARTSelection get_uart() const
Get the UART used by the logger.
std::unique_ptr< logger::TaskLogBuffer > log_buffer_
pthread_key_t log_recursion_key_
uart_port_t get_uart_num() const
void init_log_buffer(size_t total_buffer_size)
void HOT write_header_to_buffer_(int level, const char *tag, int line, const char *thread_name, char *buffer, int *buffer_at, int buffer_size)
void set_baud_rate(uint32_t baud_rate)
Manually set the baud rate for serial, set to 0 to disable.
void set_uart_selection(UARTSelection uart_selection)
void HOT format_log_to_buffer_with_terminator_(int level, const char *tag, int line, const char *format, va_list args, char *buffer, int *buffer_at, int buffer_size)
bool global_recursion_guard_
Logger(uint32_t baud_rate, size_t tx_buffer_size)
std::map< std::string, int > log_levels_
void HOT format_body_to_buffer_(char *buffer, int *buffer_at, int buffer_size, const char *format, va_list args)
void write_body_to_buffer_(const char *value, size_t length, char *buffer, int *buffer_at, int buffer_size)
void HOT reset_task_log_recursion_(bool is_main_task)
void write_msg_(const char *msg)
CallbackManager< void(int)> level_callback_
bool main_task_recursion_guard_
void add_on_log_callback(std::function< void(int, const char *, const char *)> &&callback)
Register a callback that will be called for every log message sent.
void set_log_level(int level)
Set the default log level for this logger.
void add_listener(std::function< void(int)> &&callback)
LoggerMessageTrigger(Logger *parent, int level)
UARTSelection
Enum for logging UART selection.
@ UART_SELECTION_UART0_SWAP
@ UART_SELECTION_USB_SERIAL_JTAG
Providing packet encoding functions for exchanging data with a remote host.