7#if defined(USE_ESP32) || defined(USE_HOST)
24#if defined(USE_ESP8266)
25#include <HardwareSerial.h>
28#include <HardwareSerial.h>
34#include <driver/uart.h>
38#include <zephyr/kernel.h>
59 void (*
fn)(
void *, uint8_t,
const char *,
const char *, size_t);
60 void invoke(uint8_t level,
const char *tag,
const char *
message,
size_t message_len)
const {
61 this->
fn(this->instance, level, tag,
message, message_len);
65#ifdef USE_LOGGER_LEVEL_LISTENERS
95 bool operator()(
const char *a,
const char *b)
const {
return strcmp(a, b) < 0; }
102static constexpr size_t THREAD_NAME_BUF_SIZE = 64;
104#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
117#if defined(USE_LIBRETINY) || defined(USE_ESP32_VARIANT_ESP32)
120#ifdef USE_LOGGER_USB_CDC
123#ifdef USE_LOGGER_USB_SERIAL_JTAG
152#if defined(USE_ESPHOME_TASK_LOG_BUFFER) || (defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
153 void loop()
override;
158#if defined(USE_ARDUINO) && !defined(USE_ESP32)
168#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
176#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
190 inline uint8_t
level_for(
const char *tag);
192#ifdef USE_LOG_LISTENERS
194 void add_log_callback(
void *instance,
void (*fn)(
void *, uint8_t,
const char *,
const char *,
size_t)) {
199 void add_log_callback(
void *instance,
void (*fn)(
void *, uint8_t,
const char *,
const char *,
size_t)) {}
202#ifdef USE_LOGGER_LEVEL_LISTENERS
209 void log_vprintf_(uint8_t level,
const char *tag,
int line,
const char *
format, va_list args);
212 void log_vprintf_(uint8_t level,
const char *tag,
int line,
const __FlashStringHelper *
format, va_list args);
230#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
234 const char *thread_name);
236#if defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC)
240#if defined(USE_HOST) || defined(USE_ZEPHYR)
249 va_list args,
LogBuffer &buf,
const char *thread_name) {
258 const __FlashStringHelper *
format, va_list args,
267#ifdef USE_LOG_LISTENERS
269 cb.invoke(level, tag, buf.
data, buf.
pos);
288 template<
typename FormatType>
290 FormatType
format, va_list args,
const char *thread_name) {
294 if constexpr (std::is_same_v<FormatType, const __FlashStringHelper *>) {
305#ifdef USE_ESPHOME_TASK_LOG_BUFFER
309 const char *thread_name,
const char *text, uint16_t text_length,
323#if defined(USE_ARDUINO) && !defined(USE_ESP32)
326#if defined(USE_ZEPHYR)
330#if defined(USE_ESP32) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
349#ifdef USE_LOGGER_RUNTIME_TAG_LEVELS
352#ifdef USE_LOG_LISTENERS
356#ifdef USE_LOGGER_LEVEL_LISTENERS
361#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2) || defined(USE_ZEPHYR)
367#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
378#ifdef USE_ESPHOME_TASK_LOG_BUFFER
384#if defined(USE_ESP32) || defined(USE_LIBRETINY)
391#if defined(USE_ESP32)
392 return pcTaskGetName(task);
393#elif defined(USE_LIBRETINY)
394 return pcTaskGetTaskName(task);
401#elif defined(USE_HOST)
404 pthread_t current_thread = pthread_self();
409 if (pthread_getname_np(current_thread, buff.data(), buff.size()) == 0) {
415#elif defined(USE_ZEPHYR)
417 if (current_task ==
nullptr) {
418 current_task = k_current_get();
423 const char *name = k_thread_name_get(current_task);
428 std::snprintf(buff.data(), buff.size(),
"%p", current_task);
435#if defined(USE_ESP32) || defined(USE_HOST)
440 pthread_setspecific(key_,
reinterpret_cast<void *
>(1));
458#elif defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
476#if defined(USE_ESPHOME_TASK_LOG_BUFFER) && !(defined(USE_ZEPHYR) && defined(USE_LOGGER_UART_SELECTION_USB_CDC))
495 [](
void *self, uint8_t level,
const char *tag,
const char *
message,
size_t message_len) {
497 if (level <= trigger->
level_) {
501 ESPHOME_strncpy_P(
trigger->ram_tag_, tag, MAX_TAG_LENGTH);
516#ifdef USE_CRASH_HANDLER
528#if defined(USE_ESP32)
530#elif defined(USE_ESP8266)
532#elif defined(USE_RP2)
534#elif defined(USE_LIBRETINY)
void disable_loop()
Disable this component's loop.
Minimal static vector - saves memory by avoiding std::vector overhead.
void trigger(const Ts &...x) ESPHOME_ALWAYS_INLINE
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)
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)
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_()
uint8_t level_for(const char *tag)
StaticVector< LogCallback, ESPHOME_LOG_MAX_LISTENERS > log_callbacks_
Stream * get_hw_serial() const
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)
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)
void write_msg_(const char *msg, uint16_t len)
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)
logger::TaskLogBuffer log_buffer_
bool main_task_recursion_guard_
Logger(uint32_t baud_rate)
Interface for receiving log level changes without std::function overhead.
virtual void on_log_level_change(uint8_t level)=0
char ram_tag_[MAX_TAG_LENGTH+1]
LoggerMessageTrigger(Logger *parent, uint8_t level)
Task log buffer for ESP32 platform using FreeRTOS ring buffer.
const LogString * message
bool crash_log_pending()
Whether a crash record from before this boot is waiting to be reported.
UARTSelection
Enum for logging UART selection.
@ UART_SELECTION_UART0_SWAP
@ UART_SELECTION_USB_SERIAL_JTAG
void log_crash_to_client()
Log the previous crash for a client that just subscribed to the logs.
constexpr float BUS
For communication buses like i2c/spi.
bool operator()(const char *a, const char *b) const
bool operator()(FlashTag t, const char *key) const
bool operator()(const char *key, FlashTag t) 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)