跳转到内容

日志组件

日志组件自动通过串口和 MQTT 主题(如果配置中有 MQTT 客户端)记录所有日志消息。默认情况下,所有严重级别为 DEBUG 或更高的日志都会显示。 提高日志级别严重性(例如到 INFOWARN)可以帮助提高应用程序性能和内存大小。

NOTE

日志消息的”严重性”表示消息的重要性,即它的关键程度。严重级别在 日志级别 部分定义。

# 示例配置项
logger:
level: DEBUG
  • baud_rate (Optional, int): 串行 UART 端口使用的波特率。 默认为 115200。设置为 0 可禁用通过 UART 的日志记录。

  • level (Optional, string): 全局日志级别。任何较低严重性的日志消息 都不会显示。默认为 DEBUG

  • initial_level (Optional, string): 初始日志级别,可在运行时更改。默认为与 level 相同的值。

  • logs (Optional, mapping): 手动设置特定 组件或标签的日志级别。请参阅 手动日志级别

  • runtime_tag_levels (Optional, boolean): 启用运行时按标签日志级别更改。当配置了 logs 或使用带有 tag 参数的 logger.set_level 时,这会自动启用。仅当从 lambda 或外部组件调用 set_log_level() 时才需要手动启用。默认为 false(根据需要自动启用)。

  • id (Optional, ID): 手动指定用于代码生成的 ID。

高级设置:

  • tx_buffer_size (Optional, int): 用于日志消息的缓冲区大小。 如果遇到内存问题,请减小此值。 默认为 512

  • task_log_buffer_size (Optional, int): 仅适用于 ESP32、LibreTiny 和 nRF52:用于任务日志消息的内部线程安全环形缓冲区大小。 这可以防止多个线程同时尝试记录日志时 API 断开连接。 设置为 0 可禁用日志缓冲区。默认为 768B

  • hardware_uart (Optional, string): 用于日志记录的硬件 UART。默认值取决于 您使用的特定处理器/芯片和框架。请参阅 下表

  • esp8266_store_log_strings_in_flash (Optional, boolean): 如果设置为 false,则禁用将 日志字符串存储在设备的闪存部分(使用更多内存)。默认为 true。

  • on_message (Optional, Automation): 当要记录 消息时要执行的动作。变量 int levelconst char* tagconst char* message 可用于 lambda 处理。

  • deassert_rts_dtr (Optional, boolean): 使 ESPHome 在打开 串行日志连接后按顺序将 DTR 和 RTS 置为无效。默认为 false。 许多 ESP 板使用这些信号来重置芯片或进入 引导加载程序模式,设置此选项的效果是在打开串口后 在应用程序模式下重置芯片,从而确保捕获所有来自引导过程的日志消息。 注意:Deassert 通常意味着 TTL 高电平,因为 RTS/DTR 通常是低电平有效信号。

日志组件使用平台特定的硬件 UART 进行串行日志记录。例如,ESP32 有三个硬件 UART,都可以用于发送和接收。ESP8266 只有两个 硬件 UART,其中一个是仅发送的。ESP8266 的 UART0 也可以”交换”到 CTS/RTS 引脚上的 TX/RX,以便您需要将 GPIO1 和 GPIO3 用于其他用途。

请注意,许多常见的板子将其 USB 转串口适配器固定到 UART0 使用的默认 GPIO, 因此如果您使用任何其他配置,您将无法通过板载 USB 获取日志消息。

变体UART0UART0_SWAPUART1UART2USB_CDCUSB_SERIAL_JTAG
ESP8266TX: 1, RX: 3TX: 15, RX: 13TX: 2, RX: N/AN/AN/AN/A
ESP32TX: 1, RX: 3N/ATX: 10, RX: 9TX: 17, RX: 16N/AN/A
ESP32-C3TX: 21, RX: 20N/A未定义N/AN/A18/19
ESP32-C5TX: 10, RX: 11N/A未定义N/AN/A13/14
ESP32-C6TX: 16, RX: 17N/A未定义N/AN/A12/13
ESP32-C61TX: 5, RX: 4N/A未定义N/AN/A12/13
ESP32-P4TX: 37, RX: 38N/ATX: 10, RX: 11N/AN/A24/25
ESP32-S2TX: 43, RX: 44N/ATX: 17, RX: 18N/A19/20N/A
ESP32-S3TX: 43, RX: 44N/ATX: 17, RX: 18未定义19/2019/20
NRF52引脚因板而异N/A引脚因板而异未定义D+/D-N/A

未定义 表示日志组件目前无法使用此硬件 UART。

由于可用的板子和处理器/芯片种类繁多,我们为日志记录选择了不同的默认 硬件接口。许多基于 ESP32 变体(如 C3、S2 和 S3)的新板子使用 ESP 的板载 USB 硬件外设,而基于较旧处理器(如原始 ESP32 或 ESP8266)的板子继续使用 USB 转串口桥接 IC 进行通信。

变体接口
ESP8266UART0
ESP32UART0
ESP32-C3USB_SERIAL_JTAG
ESP32-C5USB_SERIAL_JTAG
ESP32-C6USB_SERIAL_JTAG
ESP32-C61USB_SERIAL_JTAG
ESP32-P4USB_SERIAL_JTAG
ESP32-S2USB_CDC
ESP32-S3USB_SERIAL_JTAG
RP2040USB_CDC
NRF52USB_CDC

可能的日志级别(按严重性排序):

级别颜色描述
NONE不记录任何消息。
ERROR红色仅记录错误。错误会阻止 ESP 正常工作。
WARN黄色警告和错误。警告是可恢复的问题,如无效的传感器读数。
INFO绿色记录错误、警告和信息消息。
DEBUG(默认)青色包括调试在内的所有内容。包括传感器读数和状态消息。
VERBOSE灰色类似调试,但包括通常被视为垃圾的额外消息。
VERY_VERBOSE白色所有内部消息,包括流经 I²C、SPI 和 UART 总线的数据。

WARNING

使用 VERY_VERBOSE 可能会显著影响设备性能并可能导致连接不稳定。

如果某个组件在日志中刷屏,您想调整其日志 级别,可以通过识别其标签在配置中设置其级别。

示例:全局详细日志,但减少 MQTT 噪音:

logger:
level: VERBOSE
logs:
mqtt.component: DEBUG
mqtt.client: ERROR

NOTE

当使用 logs 时,会自动启用运行时按标签日志级别支持。当此功能禁用时 (未配置 logs 时的默认值),日志组件会优化以获得更好的性能和减少内存使用。

level 选项控制固件中包含哪些日志语句。您不能将标签设置为比 全局级别更详细的级别,因为低于该严重性的日志语句不会被编译进去。 但是,您可以使用 initial_level 抑制它们,并为特定标签启用:

logger:
level: VERBOSE
initial_level: ERROR
logs:
wifi: VERBOSE

这里,VERBOSE 日志被编译,但不显示(因为 initial_level: ERROR) 但是,wifi 标签启用了 VERBOSE 级别,并会显示。

将格式化消息打印到日志。

format 选项中,您可以使用 printf 风格的格式化(请参阅 格式化文本)。

on_...:
then:
- logger.log: "Hello World"
# 格式化:
- logger.log:
format: "温度传感器报告值 %.1f,湿度 %.1f"
args: [ 'id(temperature_sensor).state', 'id(humidity_sensor).state' ]

配置选项:

  • format (Required, string): printf 风格的消息格式。

  • args (Optional, lambda 列表): 格式消息的可选参数。

  • level (Optional, string): 打印消息的日志级别。 默认为 DEBUG

  • tag (Optional, string): 打印消息的标签(在日志中消息前面显示)。 默认为 main

在运行时设置日志级别。级别只能设置为不低于全局日志级别的严重程度。

  • level (Required, string): 要设置的新日志级别。
  • tag (Optional, string): 要为其设置日志级别的标签。如果未设置,将设置全局日志级别。
on_...:
then:
- logger.set_level: INFO
- logger.set_level:
level: DEBUG
tag: mqtt.client

NOTE

当使用带有 tag 参数的 logger.set_level 时,会自动启用运行时按标签日志级别支持。 如果您需要直接从 lambda 或外部组件调用 set_log_level(),必须手动启用 日志配置中的 runtime_tag_levels: true

当日志中添加新消息时,此自动化将被触发。 在 lambda 中,您可以从触发器获取消息、日志级别和标签, 使用 messageconst char *)、levelint)和 tagconst char *)。

logger:
# ...
on_message:
level: ERROR
then:
- mqtt.publish:
topic: some/topic
payload: !lambda |-
return "触发 on_message,级别 " + to_string(level) + ",标签 " + tag + ",消息 " + message;

NOTE

日志记录在 on_message 触发器中不起作用。您不能在此自动化中使用 logger.log 动作 和 ESP_LOGx 日志宏。