ESPHome 2026.5.0-dev
Loading...
Searching...
No Matches
log.h
Go to the documentation of this file.
1#pragma once
2
3#include "log_const_en.h"
4
5#include <cassert>
6#include <cstdarg>
7
8// Debug assert that only fires when ESPHOME_DEBUG is defined (e.g. in CI/test builds).
9// Zero cost in production firmware.
10#ifdef ESPHOME_DEBUG
11#define ESPHOME_DEBUG_ASSERT(expr) assert(expr) // NOLINT
12#else
13#define ESPHOME_DEBUG_ASSERT(expr) ((void) 0)
14#endif
15// for PRIu32 and friends
16#include <cinttypes>
17#include <string>
18
19#ifdef USE_STORE_LOG_STR_IN_FLASH
20#include "WString.h"
21#include "esphome/core/defines.h" // for USE_ARDUINO_VERSION_CODE
22#endif
23
24// Include ESP-IDF/Arduino based logging methods here so they don't undefine ours later
25#if defined(USE_ESP32)
26#include <esp_err.h>
27#include <esp_log.h>
28#endif
29#ifdef USE_LIBRETINY
30#include <lt_logger.h>
31#endif
32
33namespace esphome {
34
35#define ESPHOME_LOG_LEVEL_NONE 0
36#define ESPHOME_LOG_LEVEL_ERROR 1
37#define ESPHOME_LOG_LEVEL_WARN 2
38#define ESPHOME_LOG_LEVEL_INFO 3
39#define ESPHOME_LOG_LEVEL_CONFIG 4
40#define ESPHOME_LOG_LEVEL_DEBUG 5
41#define ESPHOME_LOG_LEVEL_VERBOSE 6
42#define ESPHOME_LOG_LEVEL_VERY_VERBOSE 7
43
44#ifndef ESPHOME_LOG_LEVEL
45#define ESPHOME_LOG_LEVEL ESPHOME_LOG_LEVEL_NONE
46#endif
47
48#define ESPHOME_LOG_COLOR_BLACK "30"
49#define ESPHOME_LOG_COLOR_RED "31" // ERROR
50#define ESPHOME_LOG_COLOR_GREEN "32" // INFO
51#define ESPHOME_LOG_COLOR_YELLOW "33" // WARNING
52#define ESPHOME_LOG_COLOR_BLUE "34"
53#define ESPHOME_LOG_COLOR_MAGENTA "35" // CONFIG
54#define ESPHOME_LOG_COLOR_CYAN "36" // DEBUG
55#define ESPHOME_LOG_COLOR_GRAY "37" // VERBOSE
56#define ESPHOME_LOG_COLOR_WHITE "38"
57#define ESPHOME_LOG_SECRET_BEGIN "\033[8m"
58#define ESPHOME_LOG_SECRET_END "\033[28m"
59#define LOG_SECRET(x) ESPHOME_LOG_SECRET_BEGIN x ESPHOME_LOG_SECRET_END
60
61#define ESPHOME_LOG_COLOR(COLOR) "\033[0;" COLOR "m"
62#define ESPHOME_LOG_BOLD(COLOR) "\033[1;" COLOR "m"
63#define ESPHOME_LOG_RESET_COLOR "\033[0m"
64
65void esp_log_printf_(int level, const char *tag, int line, const char *format, ...) // NOLINT
66 __attribute__((format(printf, 4, 5)));
67#ifdef USE_STORE_LOG_STR_IN_FLASH
68void esp_log_printf_(int level, const char *tag, int line, const __FlashStringHelper *format, ...);
69#endif
70void esp_log_vprintf_(int level, const char *tag, int line, const char *format, va_list args); // NOLINT
71#ifdef USE_STORE_LOG_STR_IN_FLASH
72// Remove before 2026.9.0
73__attribute__((deprecated("Use esp_log_printf_() instead. Removed in 2026.9.0."))) void esp_log_vprintf_(
74 int level, const char *tag, int line, const __FlashStringHelper *format, va_list args);
75#endif
76#if defined(USE_ESP32)
77int esp_idf_log_vprintf_(const char *format, va_list args); // NOLINT
78#endif
79
80#ifdef USE_STORE_LOG_STR_IN_FLASH
81#define ESPHOME_LOG_FORMAT(format) F(format)
82#else
83#define ESPHOME_LOG_FORMAT(format) format
84#endif
85
86#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERY_VERBOSE
87#define esph_log_vv(tag, format, ...) \
88 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_VERY_VERBOSE, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
89
90#define ESPHOME_LOG_HAS_VERY_VERBOSE
91#else
92#define esph_log_vv(tag, format, ...)
93#endif
94
95#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
96#define esph_log_v(tag, format, ...) \
97 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_VERBOSE, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
98
99#define ESPHOME_LOG_HAS_VERBOSE
100#else
101#define esph_log_v(tag, format, ...)
102#endif
103
104#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
105#define esph_log_d(tag, format, ...) \
106 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_DEBUG, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
107#define esph_log_config(tag, format, ...) \
108 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_CONFIG, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
109
110#define ESPHOME_LOG_HAS_DEBUG
111#define ESPHOME_LOG_HAS_CONFIG
112#else
113#define esph_log_d(tag, format, ...)
114#define esph_log_config(tag, format, ...)
115#endif
116
117#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_INFO
118#define esph_log_i(tag, format, ...) \
119 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_INFO, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
120
121#define ESPHOME_LOG_HAS_INFO
122#else
123#define esph_log_i(tag, format, ...)
124#endif
125
126#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_WARN
127#define esph_log_w(tag, format, ...) \
128 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_WARN, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
129
130#define ESPHOME_LOG_HAS_WARN
131#else
132#define esph_log_w(tag, format, ...)
133#endif
134
135#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_ERROR
136#define esph_log_e(tag, format, ...) \
137 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_ERROR, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
138
139#define ESPHOME_LOG_HAS_ERROR
140#else
141#define esph_log_e(tag, format, ...)
142#endif
143
144#ifdef ESP_LOGE
145#undef ESP_LOGE
146#endif
147#ifdef ESP_LOGW
148#undef ESP_LOGW
149#endif
150#ifdef ESP_LOGI
151#undef ESP_LOGI
152#endif
153#ifdef ESP_LOGD
154#undef ESP_LOGD
155#endif
156#ifdef ESP_LOGV
157#undef ESP_LOGV
158#endif
159
160#define ESP_LOGE(tag, ...) esph_log_e(tag, __VA_ARGS__)
161#define ESP_LOGW(tag, ...) esph_log_w(tag, __VA_ARGS__)
162#define ESP_LOGI(tag, ...) esph_log_i(tag, __VA_ARGS__)
163#define ESP_LOGD(tag, ...) esph_log_d(tag, __VA_ARGS__)
164#define ESP_LOGCONFIG(tag, ...) esph_log_config(tag, __VA_ARGS__)
165#define ESP_LOGV(tag, ...) esph_log_v(tag, __VA_ARGS__)
166#define ESP_LOGVV(tag, ...) esph_log_vv(tag, __VA_ARGS__)
167
168#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
169#define BYTE_TO_BINARY(byte) \
170 ((byte) &0x80 ? '1' : '0'), ((byte) &0x40 ? '1' : '0'), ((byte) &0x20 ? '1' : '0'), ((byte) &0x10 ? '1' : '0'), \
171 ((byte) &0x08 ? '1' : '0'), ((byte) &0x04 ? '1' : '0'), ((byte) &0x02 ? '1' : '0'), ((byte) &0x01 ? '1' : '0')
172#define YESNO(b) ((b) ? "YES" : "NO")
173#define ONOFF(b) ((b) ? "ON" : "OFF")
174#define TRUEFALSE(b) ((b) ? "TRUE" : "FALSE")
175// for use with optional values
176#define ONOFFMAYBE(b) (((b).has_value()) ? ONOFF((b).value()) : "UNKNOWN")
177
178// Helper class that identifies strings that may be stored in flash storage (similar to Arduino's __FlashStringHelper)
179struct LogString;
180
181#ifdef USE_STORE_LOG_STR_IN_FLASH
182
183#include <pgmspace.h>
184
185#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 0)
186#define LOG_STR_ARG(s) ((PGM_P) (s))
187#else
188// Pre-Arduino 2.5, we can't pass a PSTR() to printf(). Emulate support by copying the message to a
189// local buffer first. String length is limited to 63 characters.
190// https://github.com/esp8266/Arduino/commit/6280e98b0360f85fdac2b8f10707fffb4f6e6e31
191#define LOG_STR_ARG(s) \
192 ({ \
193 char __buf[64]; \
194 __buf[63] = '\0'; \
195 strncpy_P(__buf, (PGM_P) (s), 63); \
196 __buf; \
197 })
198#endif
199
200#define LOG_STR(s) (reinterpret_cast<const LogString *>(PSTR(s)))
201#define LOG_STR_LITERAL(s) LOG_STR_ARG(LOG_STR(s))
202
203#else // !USE_STORE_LOG_STR_IN_FLASH
204
205#define LOG_STR(s) (reinterpret_cast<const LogString *>(s))
206#define LOG_STR_ARG(s) (reinterpret_cast<const char *>(s))
207#define LOG_STR_LITERAL(s) (s)
208
209#endif
210
211} // namespace esphome
struct @65::@66 __attribute__
Wake the main loop task from an ISR. ISR-safe.
Definition main_task.h:32
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
const char int line
Definition log.h:74
const char * tag
Definition log.h:74
const char int const __FlashStringHelper * format
Definition log.h:74
const char int const __FlashStringHelper va_list args
Definition log.h:74
int HOT esp_idf_log_vprintf_(const char *format, va_list args)
Definition log.cpp:74
void HOT esp_log_printf_(int level, const char *tag, int line, const char *format,...)
Definition log.cpp:21
void HOT esp_log_vprintf_(int level, const char *tag, int line, const char *format, va_list args)
Definition log.cpp:51