ESPHome 2026.10.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#endif
22
23// Include ESP-IDF/Arduino based logging methods here so they don't undefine ours later
24#if defined(USE_ESP32)
25#include <esp_err.h>
26#include <esp_log.h>
27#endif
28#ifdef USE_LIBRETINY
29#include <lt_logger.h>
30#endif
31
32namespace esphome {
33
34#define ESPHOME_LOG_LEVEL_NONE 0
35#define ESPHOME_LOG_LEVEL_ERROR 1
36#define ESPHOME_LOG_LEVEL_WARN 2
37#define ESPHOME_LOG_LEVEL_INFO 3
38#define ESPHOME_LOG_LEVEL_CONFIG 4
39#define ESPHOME_LOG_LEVEL_DEBUG 5
40#define ESPHOME_LOG_LEVEL_VERBOSE 6
41#define ESPHOME_LOG_LEVEL_VERY_VERBOSE 7
42
43#ifndef ESPHOME_LOG_LEVEL
44#define ESPHOME_LOG_LEVEL ESPHOME_LOG_LEVEL_NONE
45#endif
46
47#define ESPHOME_LOG_COLOR_BLACK "30"
48#define ESPHOME_LOG_COLOR_RED "31" // ERROR
49#define ESPHOME_LOG_COLOR_GREEN "32" // INFO
50#define ESPHOME_LOG_COLOR_YELLOW "33" // WARNING
51#define ESPHOME_LOG_COLOR_BLUE "34"
52#define ESPHOME_LOG_COLOR_MAGENTA "35" // CONFIG
53#define ESPHOME_LOG_COLOR_CYAN "36" // DEBUG
54#define ESPHOME_LOG_COLOR_GRAY "37" // VERBOSE
55#define ESPHOME_LOG_COLOR_WHITE "38"
56#define ESPHOME_LOG_SECRET_BEGIN "\033[8m"
57#define ESPHOME_LOG_SECRET_END "\033[28m"
58#define LOG_SECRET(x) ESPHOME_LOG_SECRET_BEGIN x ESPHOME_LOG_SECRET_END
59
60#define ESPHOME_LOG_COLOR(COLOR) "\033[0;" COLOR "m"
61#define ESPHOME_LOG_BOLD(COLOR) "\033[1;" COLOR "m"
62#define ESPHOME_LOG_RESET_COLOR "\033[0m"
63
64void esp_log_printf_(int level, const char *tag, int line, const char *format, ...) // NOLINT
65 __attribute__((format(printf, 4, 5)));
66#ifdef USE_STORE_LOG_STR_IN_FLASH
67void esp_log_printf_(int level, const char *tag, int line, const __FlashStringHelper *format, ...);
68#endif
69void esp_log_vprintf_(int level, const char *tag, int line, const char *format, va_list args); // NOLINT
70#if defined(USE_ESP32)
71int esp_idf_log_vprintf_(const char *format, va_list args); // NOLINT
72#endif
73
74#ifdef USE_STORE_LOG_STR_IN_FLASH
75#define ESPHOME_LOG_FORMAT(format) F(format)
76#else
77#define ESPHOME_LOG_FORMAT(format) format
78#endif
79
80#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERY_VERBOSE
81#define esph_log_vv(tag, format, ...) \
82 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_VERY_VERBOSE, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
83
84#define ESPHOME_LOG_HAS_VERY_VERBOSE
85#else
86#define esph_log_vv(tag, format, ...)
87#endif
88
89#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
90#define esph_log_v(tag, format, ...) \
91 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_VERBOSE, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
92
93#define ESPHOME_LOG_HAS_VERBOSE
94#else
95#define esph_log_v(tag, format, ...)
96#endif
97
98#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
99#define esph_log_d(tag, format, ...) \
100 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_DEBUG, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
101#define esph_log_config(tag, format, ...) \
102 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_CONFIG, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
103
104#define ESPHOME_LOG_HAS_DEBUG
105#define ESPHOME_LOG_HAS_CONFIG
106#else
107#define esph_log_d(tag, format, ...)
108#define esph_log_config(tag, format, ...)
109#endif
110
111#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_INFO
112#define esph_log_i(tag, format, ...) \
113 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_INFO, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
114
115#define ESPHOME_LOG_HAS_INFO
116#else
117#define esph_log_i(tag, format, ...)
118#endif
119
120#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_WARN
121#define esph_log_w(tag, format, ...) \
122 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_WARN, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
123
124#define ESPHOME_LOG_HAS_WARN
125#else
126#define esph_log_w(tag, format, ...)
127#endif
128
129#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_ERROR
130#define esph_log_e(tag, format, ...) \
131 ::esphome::esp_log_printf_(ESPHOME_LOG_LEVEL_ERROR, tag, __LINE__, ESPHOME_LOG_FORMAT(format), ##__VA_ARGS__)
132
133#define ESPHOME_LOG_HAS_ERROR
134#else
135#define esph_log_e(tag, format, ...)
136#endif
137
138#ifdef ESP_LOGE
139#undef ESP_LOGE
140#endif
141#ifdef ESP_LOGW
142#undef ESP_LOGW
143#endif
144#ifdef ESP_LOGI
145#undef ESP_LOGI
146#endif
147#ifdef ESP_LOGD
148#undef ESP_LOGD
149#endif
150#ifdef ESP_LOGV
151#undef ESP_LOGV
152#endif
153
154#define ESP_LOGE(tag, ...) esph_log_e(tag, __VA_ARGS__)
155#define ESP_LOGW(tag, ...) esph_log_w(tag, __VA_ARGS__)
156#define ESP_LOGI(tag, ...) esph_log_i(tag, __VA_ARGS__)
157#define ESP_LOGD(tag, ...) esph_log_d(tag, __VA_ARGS__)
158#define ESP_LOGCONFIG(tag, ...) esph_log_config(tag, __VA_ARGS__)
159#define ESP_LOGV(tag, ...) esph_log_v(tag, __VA_ARGS__)
160#define ESP_LOGVV(tag, ...) esph_log_vv(tag, __VA_ARGS__)
161
162#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
163#define BYTE_TO_BINARY(byte) \
164 ((byte) &0x80 ? '1' : '0'), ((byte) &0x40 ? '1' : '0'), ((byte) &0x20 ? '1' : '0'), ((byte) &0x10 ? '1' : '0'), \
165 ((byte) &0x08 ? '1' : '0'), ((byte) &0x04 ? '1' : '0'), ((byte) &0x02 ? '1' : '0'), ((byte) &0x01 ? '1' : '0')
166#define YESNO(b) ((b) ? "YES" : "NO")
167#define ONOFF(b) ((b) ? "ON" : "OFF")
168#define TRUEFALSE(b) ((b) ? "TRUE" : "FALSE")
169// for use with optional values
170#define ONOFFMAYBE(b) (((b).has_value()) ? ONOFF((b).value()) : "UNKNOWN")
171
172// Helper class that identifies strings that may be stored in flash storage (similar to Arduino's __FlashStringHelper)
173struct LogString;
174
175#ifdef USE_STORE_LOG_STR_IN_FLASH
176
177#include <pgmspace.h>
178
179#define LOG_STR_ARG(s) ((PGM_P) (s))
180
181#define LOG_STR(s) (reinterpret_cast<const LogString *>(PSTR(s)))
182#define LOG_STR_LITERAL(s) LOG_STR_ARG(LOG_STR(s))
183
184#else // !USE_STORE_LOG_STR_IN_FLASH
185
186#define LOG_STR(s) (reinterpret_cast<const LogString *>(s))
187#define LOG_STR_ARG(s) (reinterpret_cast<const char *>(s))
188#define LOG_STR_LITERAL(s) (s)
189
190#endif
191
192} // namespace esphome
const char * format
int HOT esp_idf_log_vprintf_(const char *format, va_list args)
Definition log.cpp:64
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