7#if defined(USE_ESP32) || defined(USE_HOST)
23#if defined(USE_ESP8266)
24#include <HardwareSerial.h>
27#include <HardwareSerial.h>
33#include <driver/uart.h>
37#include <zephyr/kernel.h>
58 void (*
fn)(
void *, uint8_t,
const char *,
const char *, size_t);
59 void invoke(uint8_t level,
const char *
tag,
const char *
message,
size_t message_len)
const {
60 this->
fn(this->instance, level,
tag,
message, message_len);
64#ifdef USE_LOGGER_LEVEL_LISTENERS
88#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
91 bool operator()(
const char *a,
const char *b)
const {
return strcmp(a, b) < 0; }
97static constexpr size_t THREAD_NAME_BUF_SIZE = 64;
99#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
112#if defined(USE_LIBRETINY) || defined(USE_ESP32_VARIANT_ESP32)
115#ifdef USE_LOGGER_USB_CDC
118#ifdef USE_LOGGER_USB_SERIAL_JTAG
146#ifdef USE_ESPHOME_TASK_LOG_BUFFER
151#if defined(USE_ESPHOME_TASK_LOG_BUFFER) || (defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
157#if defined(USE_ARDUINO) && !defined(USE_ESP32)
167#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
175#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
189#ifdef USE_LOG_LISTENERS
191 void add_log_callback(
void *instance,
void (*fn)(
void *, uint8_t,
const char *,
const char *,
size_t)) {
196 void add_log_callback(
void *instance,
void (*fn)(
void *, uint8_t,
const char *,
const char *,
size_t)) {}
199#ifdef USE_LOGGER_LEVEL_LISTENERS
207#ifdef USE_STORE_LOG_STR_IN_FLASH
227#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
231 const char *thread_name);
233#if defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC)
247#ifdef USE_STORE_LOG_STR_IN_FLASH
251 const __FlashStringHelper *
format, va_list
args,
260#ifdef USE_LOG_LISTENERS
281 template<
typename FormatType>
283 FormatType
format, va_list
args,
const char *thread_name) {
286#ifdef USE_STORE_LOG_STR_IN_FLASH
287 if constexpr (std::is_same_v<FormatType, const __FlashStringHelper *>) {
298#ifdef USE_ESPHOME_TASK_LOG_BUFFER
302 const char *thread_name,
const char *text, uint16_t text_length,
316#if defined(USE_ARDUINO) && !defined(USE_ESP32)
319#if defined(USE_ZEPHYR)
323#if defined(USE_ESP32) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
342#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
345#ifdef USE_LOG_LISTENERS
349#ifdef USE_LOGGER_LEVEL_LISTENERS
352#ifdef USE_ESPHOME_TASK_LOG_BUFFER
358#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_ZEPHYR)
364#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
378#if defined(USE_ESP32) || defined(USE_LIBRETINY)
385#if defined(USE_ESP32)
386 return pcTaskGetName(task);
387#elif defined(USE_LIBRETINY)
388 return pcTaskGetTaskName(task);
395#elif defined(USE_HOST)
398 pthread_t current_thread = pthread_self();
403 if (pthread_getname_np(current_thread, buff.data(), buff.size()) == 0) {
409#elif defined(USE_ZEPHYR)
411 if (current_task ==
nullptr) {
412 current_task = k_current_get();
417 const char *name = k_thread_name_get(current_task);
422 std::snprintf(buff.data(), buff.size(),
"%p", current_task);
429#if defined(USE_ESP32) || defined(USE_HOST)
434 pthread_setspecific(key_,
reinterpret_cast<void *
>(1));
452#elif defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
470#if defined(USE_ESPHOME_TASK_LOG_BUFFER) && !(defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
489 [](
void *self, uint8_t level,
const char *
tag,
const char *
message,
size_t message_len) {
491 if (level <= trigger->
level_) {
void disable_loop()
Disable this component's loop.
Minimal static vector - saves memory by avoiding std::vector overhead.
void trigger(const Ts &...x)
NonMainTaskRecursionGuard & operator=(const NonMainTaskRecursionGuard &)=delete
~NonMainTaskRecursionGuard()
NonMainTaskRecursionGuard & operator=(NonMainTaskRecursionGuard &&)=delete
NonMainTaskRecursionGuard(const NonMainTaskRecursionGuard &)=delete
NonMainTaskRecursionGuard(pthread_key_t key)
NonMainTaskRecursionGuard(NonMainTaskRecursionGuard &&)=delete
RecursionGuard & operator=(const RecursionGuard &)=delete
RecursionGuard(const RecursionGuard &)=delete
RecursionGuard & operator=(RecursionGuard &&)=delete
RecursionGuard(RecursionGuard &&)=delete
RecursionGuard(bool &flag)
Logger component for all ESPHome logging.
void add_level_listener(LoggerLevelListener *listener)
Register a listener for log level changes.
void HOT notify_listeners_(uint8_t level, const char *tag, const LogBuffer &buf)
Logger(uint32_t baud_rate, size_t task_log_buffer_size)
void log_vprintf_(uint8_t level, const char *tag, int line, const char *format, va_list args)
void write_msg_(const char *msg, uint16_t len)
const char *HOT get_thread_name_()
void dump_config() override
const char * get_thread_name_(TaskHandle_t task)
bool HOT is_non_main_task_recursive_() const
uint32_t get_baud_rate() const
const char *HOT get_thread_name_(std::span< char > buff, k_tid_t current_task=nullptr)
NonMainTaskRecursionGuard make_non_main_task_guard_()
const LogString * get_uart_selection_()
void set_log_level(const char *tag, uint8_t log_level)
Set the log level of the specified tag.
uint8_t level_for(const char *tag)
StaticVector< LogCallback, ESPHOME_LOG_MAX_LISTENERS > log_callbacks_
void HOT format_log_to_buffer_with_terminator_P_(uint8_t level, const char *tag, int line, const __FlashStringHelper *format, va_list args, LogBuffer &buf)
Stream * get_hw_serial() const
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 create_pthread_key()
void pre_setup()
Set up this component.
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_
const char *HOT get_thread_name_(std::span< char > buff)
UARTSelection get_uart() const
Get the UART used by the logger.
std::vector< LoggerLevelListener * > level_listeners_
bool non_main_task_recursion_guard_
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)
pthread_key_t log_recursion_key_
RecursionGuard make_non_main_task_guard_()
void HOT write_log_buffer_to_console_(LogBuffer &buf)
uart_port_t get_uart_num() const
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.
void set_uart_selection(UARTSelection uart_selection)
bool global_recursion_guard_
void add_log_callback(void *instance, void(*fn)(void *, uint8_t, const char *, const char *, size_t))
Register a log callback to receive log messages.
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_
void log_vprintf_(uint8_t level, const char *tag, int line, const __FlashStringHelper *format, va_list args)
Logger(uint32_t baud_rate)
logger::TaskLogBuffer * log_buffer_
Interface for receiving log level changes without std::function overhead.
virtual void on_log_level_change(uint8_t level)=0
LoggerMessageTrigger(Logger *parent, uint8_t level)
Task log buffer for ESP32 platform using FreeRTOS ring buffer.
UARTSelection
Enum for logging UART selection.
@ UART_SELECTION_UART0_SWAP
@ UART_SELECTION_USB_SERIAL_JTAG
const char int const __FlashStringHelper * format
const char int const __FlashStringHelper va_list args
bool operator()(const char *a, const char *b) const
void HOT format_body_P(PGM_P format, va_list args)
void write_body(const char *text, uint16_t text_length)
void HOT write_header(uint8_t level, const char *tag, int line, const char *thread_name)
void HOT format_body(const char *format, va_list args)
void terminate_with_newline()
Lightweight callback for receiving log messages without virtual dispatch overhead.
void invoke(uint8_t level, const char *tag, const char *message, size_t message_len) const
void(* fn)(void *, uint8_t, const char *, const char *, size_t)