1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-03 02:22:25 +01:00

Merge branch 'logging_speed_up' into integration

This commit is contained in:
J. Nick Koston
2025-10-01 13:09:26 +02:00

View File

@@ -36,16 +36,16 @@ struct device;
namespace esphome::logger { namespace esphome::logger {
// Color and letter constants for log levels // ANSI color code last digit (30-38 range, store only last digit to save RAM)
static const char *const LOG_LEVEL_COLORS[] = { static constexpr char LOG_LEVEL_COLOR_DIGIT[] = {
"", // NONE '\0', // NONE
ESPHOME_LOG_BOLD(ESPHOME_LOG_COLOR_RED), // ERROR '1', // ERROR (31 = red)
ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_YELLOW), // WARNING '3', // WARNING (33 = yellow)
ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_GREEN), // INFO '2', // INFO (32 = green)
ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_MAGENTA), // CONFIG '5', // CONFIG (35 = magenta)
ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_CYAN), // DEBUG '6', // DEBUG (36 = cyan)
ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_GRAY), // VERBOSE '7', // VERBOSE (37 = gray)
ESPHOME_LOG_COLOR(ESPHOME_LOG_COLOR_WHITE), // VERY_VERBOSE '8', // VERY_VERBOSE (38 = white)
}; };
static constexpr char LOG_LEVEL_LETTER_CHARS[] = { static constexpr char LOG_LEVEL_LETTER_CHARS[] = {
@@ -57,7 +57,7 @@ static constexpr char LOG_LEVEL_LETTER_CHARS[] = {
'D', // DEBUG 'D', // DEBUG
'V', // VERBOSE (VERY_VERBOSE uses two 'V's) 'V', // VERBOSE (VERY_VERBOSE uses two 'V's)
}; };
static constexpr uint8_t ANSI_COLOR_LEN = 7;
// Maximum header size: 35 bytes fixed + 32 bytes tag + 16 bytes thread name = 83 bytes (45 byte safety margin) // Maximum header size: 35 bytes fixed + 32 bytes tag + 16 bytes thread name = 83 bytes (45 byte safety margin)
static constexpr uint16_t MAX_HEADER_SIZE = 128; static constexpr uint16_t MAX_HEADER_SIZE = 128;
@@ -312,13 +312,25 @@ class Logger : public Component {
} }
#endif #endif
static inline void copy_and_advance(char *buffer, uint16_t &pos, const char *data, uint8_t len) { static inline void copy_string(char *buffer, uint16_t &pos, const char *str) {
memcpy(buffer + pos, data, len); const size_t len = strlen(str);
// Intentionally no null terminator, building larger string
memcpy(buffer + pos, str, len); // NOLINT(bugprone-not-null-terminated-result)
pos += len; pos += len;
} }
static inline void copy_string(char *buffer, uint16_t &pos, const char *str) { static inline void write_ansi_color_for_level(char *buffer, uint16_t &pos, uint8_t level) {
copy_and_advance(buffer, pos, str, strlen(str)); if (level == 0)
return;
// Construct ANSI escape sequence: "\033[{bold};3{color}m"
// Example: "\033[1;31m" for ERROR (bold red)
buffer[pos++] = '\033';
buffer[pos++] = '[';
buffer[pos++] = (level == 1) ? '1' : '0'; // Only ERROR is bold
buffer[pos++] = ';';
buffer[pos++] = '3';
buffer[pos++] = LOG_LEVEL_COLOR_DIGIT[level];
buffer[pos++] = 'm';
} }
inline void HOT write_header_to_buffer_(uint8_t level, const char *tag, int line, const char *thread_name, inline void HOT write_header_to_buffer_(uint8_t level, const char *tag, int line, const char *thread_name,
@@ -328,11 +340,8 @@ class Logger : public Component {
if (pos + MAX_HEADER_SIZE > buffer_size) if (pos + MAX_HEADER_SIZE > buffer_size)
return; return;
const char *color = LOG_LEVEL_COLORS[level];
const uint8_t color_len = (level == 0) ? 0 : ANSI_COLOR_LEN;
// Construct: <color>[LEVEL][tag:line]: // Construct: <color>[LEVEL][tag:line]:
copy_and_advance(buffer, pos, color, color_len); write_ansi_color_for_level(buffer, pos, level);
buffer[pos++] = '['; buffer[pos++] = '[';
if (level != 0) { if (level != 0) {
if (level >= 7) { if (level >= 7) {
@@ -353,11 +362,11 @@ class Logger : public Component {
#if defined(USE_ESP32) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR) #if defined(USE_ESP32) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
if (thread_name != nullptr) { if (thread_name != nullptr) {
copy_and_advance(buffer, pos, LOG_LEVEL_COLORS[1], ANSI_COLOR_LEN); // Bold red (error color) write_ansi_color_for_level(buffer, pos, 1); // Always use bold red for thread name
buffer[pos++] = '['; buffer[pos++] = '[';
copy_string(buffer, pos, thread_name); copy_string(buffer, pos, thread_name);
buffer[pos++] = ']'; buffer[pos++] = ']';
copy_and_advance(buffer, pos, color, color_len); write_ansi_color_for_level(buffer, pos, level); // Restore original color
} }
#endif #endif