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