mirror of
https://github.com/esphome/esphome.git
synced 2026-09-21 03:58:41 +00:00
[logger] Extract shared helpers to reduce code duplication
This commit is contained in:
@@ -136,27 +136,7 @@ void Logger::log_vprintf_(uint8_t level, const char *tag, int line, const __Flas
|
||||
return;
|
||||
|
||||
RecursionGuard guard(global_recursion_guard_);
|
||||
this->tx_buffer_at_ = 0;
|
||||
|
||||
// Write header, format body directly from flash, and write footer
|
||||
this->write_header_to_buffer_(level, tag, line, nullptr, this->tx_buffer_, &this->tx_buffer_at_,
|
||||
this->tx_buffer_size_);
|
||||
this->format_body_to_buffer_P_(this->tx_buffer_, &this->tx_buffer_at_, this->tx_buffer_size_,
|
||||
reinterpret_cast<PGM_P>(format), args);
|
||||
this->write_footer_to_buffer_(this->tx_buffer_, &this->tx_buffer_at_, this->tx_buffer_size_);
|
||||
|
||||
// Ensure null termination
|
||||
uint16_t null_pos = this->tx_buffer_at_ >= this->tx_buffer_size_ ? this->tx_buffer_size_ - 1 : this->tx_buffer_at_;
|
||||
this->tx_buffer_[null_pos] = '\0';
|
||||
|
||||
// Listeners get message first (before console write)
|
||||
#ifdef USE_LOG_LISTENERS
|
||||
for (auto *listener : this->log_listeners_)
|
||||
listener->on_log(level, tag, this->tx_buffer_, this->tx_buffer_at_);
|
||||
#endif
|
||||
|
||||
// Write to console
|
||||
this->write_tx_buffer_to_console_();
|
||||
this->log_message_to_buffer_and_send_P_(level, tag, line, reinterpret_cast<PGM_P>(format), args);
|
||||
}
|
||||
#endif // USE_STORE_LOG_STR_IN_FLASH
|
||||
|
||||
|
||||
@@ -277,14 +277,7 @@ class Logger : public Component {
|
||||
#endif
|
||||
this->format_body_to_buffer_(buffer, buffer_at, buffer_size, format, args);
|
||||
this->write_footer_to_buffer_(buffer, buffer_at, buffer_size);
|
||||
|
||||
// Always ensure the buffer has a null terminator, even if we need to
|
||||
// overwrite the last character of the actual content
|
||||
if (*buffer_at >= buffer_size) {
|
||||
buffer[buffer_size - 1] = '\0'; // Truncate and ensure null termination
|
||||
} else {
|
||||
buffer[*buffer_at] = '\0'; // Normal case, append null terminator
|
||||
}
|
||||
ensure_null_terminated_(buffer, *buffer_at, buffer_size);
|
||||
}
|
||||
|
||||
// Helper to add newline to buffer before writing to console
|
||||
@@ -314,14 +307,13 @@ class Logger : public Component {
|
||||
}
|
||||
}
|
||||
|
||||
// Helper to format and send a log message to both console and listeners
|
||||
inline void HOT log_message_to_buffer_and_send_(uint8_t level, const char *tag, int line, const char *format,
|
||||
va_list args) {
|
||||
// Format to tx_buffer and prepare for output
|
||||
this->tx_buffer_at_ = 0; // Initialize buffer position
|
||||
this->format_log_to_buffer_with_terminator_(level, tag, line, format, args, this->tx_buffer_, &this->tx_buffer_at_,
|
||||
this->tx_buffer_size_);
|
||||
// Ensure tx_buffer_ has null termination (truncate if buffer was full)
|
||||
inline void HOT ensure_tx_buffer_null_terminated_() {
|
||||
ensure_null_terminated_(this->tx_buffer_, this->tx_buffer_at_, this->tx_buffer_size_);
|
||||
}
|
||||
|
||||
// Helper to notify listeners and write to console - shared by all log_vprintf_ variants
|
||||
inline void HOT notify_listeners_and_send_(uint8_t level, const char *tag) {
|
||||
// Listeners get message WITHOUT newline (for API/MQTT/syslog)
|
||||
#ifdef USE_LOG_LISTENERS
|
||||
for (auto *listener : this->log_listeners_)
|
||||
@@ -332,6 +324,30 @@ class Logger : public Component {
|
||||
this->write_tx_buffer_to_console_();
|
||||
}
|
||||
|
||||
// Helper to format and send a log message to both console and listeners
|
||||
inline void HOT log_message_to_buffer_and_send_(uint8_t level, const char *tag, int line, const char *format,
|
||||
va_list args) {
|
||||
// Format to tx_buffer and prepare for output
|
||||
this->tx_buffer_at_ = 0; // Initialize buffer position
|
||||
this->format_log_to_buffer_with_terminator_(level, tag, line, format, args, this->tx_buffer_, &this->tx_buffer_at_,
|
||||
this->tx_buffer_size_);
|
||||
this->notify_listeners_and_send_(level, tag);
|
||||
}
|
||||
|
||||
#ifdef USE_STORE_LOG_STR_IN_FLASH
|
||||
// ESP8266 variant: format flash string and send to both console and listeners
|
||||
inline void HOT log_message_to_buffer_and_send_P_(uint8_t level, const char *tag, int line, PGM_P format,
|
||||
va_list args) {
|
||||
this->tx_buffer_at_ = 0;
|
||||
this->write_header_to_buffer_(level, tag, line, nullptr, this->tx_buffer_, &this->tx_buffer_at_,
|
||||
this->tx_buffer_size_);
|
||||
this->format_body_to_buffer_P_(this->tx_buffer_, &this->tx_buffer_at_, this->tx_buffer_size_, format, args);
|
||||
this->write_footer_to_buffer_(this->tx_buffer_, &this->tx_buffer_at_, this->tx_buffer_size_);
|
||||
this->ensure_tx_buffer_null_terminated_();
|
||||
this->notify_listeners_and_send_(level, tag);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_ESPHOME_TASK_LOG_BUFFER
|
||||
// Helper to format a pre-formatted message from the task log buffer and notify listeners
|
||||
// Used by process_messages_ to avoid code duplication between ESP32 and host platforms
|
||||
@@ -342,7 +358,7 @@ class Logger : public Component {
|
||||
this->tx_buffer_size_);
|
||||
this->write_body_to_buffer_(text, text_length, this->tx_buffer_, &this->tx_buffer_at_, this->tx_buffer_size_);
|
||||
this->write_footer_to_buffer_(this->tx_buffer_, &this->tx_buffer_at_, this->tx_buffer_size_);
|
||||
this->tx_buffer_[this->tx_buffer_at_] = '\0';
|
||||
this->ensure_tx_buffer_null_terminated_();
|
||||
#ifdef USE_LOG_LISTENERS
|
||||
for (auto *listener : this->log_listeners_)
|
||||
listener->on_log(level, tag, this->tx_buffer_, this->tx_buffer_at_);
|
||||
@@ -525,6 +541,12 @@ class Logger : public Component {
|
||||
}
|
||||
#endif
|
||||
|
||||
// Ensure buffer has null termination (truncate if buffer was full)
|
||||
static inline void ensure_null_terminated_(char *buffer, uint16_t buffer_at, uint16_t buffer_size) {
|
||||
uint16_t null_pos = buffer_at >= buffer_size ? buffer_size - 1 : buffer_at;
|
||||
buffer[null_pos] = '\0';
|
||||
}
|
||||
|
||||
static inline void copy_string(char *buffer, uint16_t &pos, const char *str) {
|
||||
const size_t len = strlen(str);
|
||||
// Intentionally no null terminator, building larger string
|
||||
|
||||
Reference in New Issue
Block a user