您正在查看 Debezium 未发布版本的文档。
如果您想查看此页面的最新稳定版本,请在此 查看。

Debezium 日志

Debezium 在其连接器中内置了丰富的日志记录功能,您可以更改日志配置来控制哪些日志语句出现在日志中以及日志被发送到何处。Debezium(以及 Kafka 和 Kafka Connect)使用 Java 的 Log4j 日志框架。

默认情况下,连接器在启动时会产生大量有用的信息,但在连接器跟上源数据库的进度时,产生的日志非常少。这在连接器正常运行时通常足够了,但在连接器行为异常时可能不够。在这种情况下,您可以更改日志级别,以便连接器生成更多详细的日志消息,描述连接器正在做什么以及它没有做什么。

日志概念

在配置日志记录之前,您应该了解 Log4J 的 日志记录器日志级别附加程序 是什么。

日志记录器

应用程序生成的每条日志消息都会发送到一个特定的 日志记录器(例如,io.debezium.connector.mysql)。日志记录器是分层组织的。例如,io.debezium.connector.mysql 日志记录器是 io.debezium.connector 日志记录器的子项,而 io.debezium.connector 日志记录器又是 io.debezium 日志记录器的子项。在层级的顶端,根日志记录器 定义了其下所有日志记录器的默认日志配置。

日志级别

应用程序生成的每条日志消息也有一个特定的 日志级别

  1. ERROR - 错误、异常和其他严重问题

  2. WARN - 潜在 的问题和故障

  3. INFO - 状态和一般活动(通常低流量)

  4. DEBUG - 对诊断意外行为有用的更详细的活动

  5. TRACE - 非常详细和冗长的活动(通常高流量)

附加程序

附加程序 本质上是写入日志消息的目的地。每个附加程序都控制其日志消息的格式,让您可以更精细地控制日志消息的外观。

要配置日志记录,您需要为每个日志记录器指定所需的级别以及应将这些日志消息写入的附加程序。由于日志记录器是分层的,根日志记录器的配置将作为其下所有日志记录器的默认值,尽管您可以覆盖任何子(或后代)日志记录器。

了解默认日志配置

如果您在 Kafka Connect 进程中运行 Debezium 连接器,那么 Kafka Connect 会使用 Kafka 安装中的 Log4j 配置文件(例如,/opt/kafka/config/connect-log4j.properties)。默认情况下,此文件包含以下配置

示例 1. connect-log4j.properties 中的默认配置
log4j.rootLogger=INFO, stdout  (1)

log4j.appender.stdout=org.apache.log4j.ConsoleAppender  (2)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  (3)
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n  (4)
...
表 1. 默认 connect-log4j.properties 设置的说明
属性 描述

1

根日志记录器,定义了默认的日志记录器配置。默认情况下,日志记录器包括 INFOWARNERROR 消息。这些日志消息被写入 stdout 附加程序。

2

指示 stdout 附加程序将日志消息写入控制台,而不是文件。

3

指定 stdout 附加程序使用模式匹配算法格式化日志消息。

4

stdout 附加程序使用的模式(有关详细信息,请参阅 Log4j 文档)。

除非您配置其他日志记录器,否则 Debezium 使用的所有日志记录器都继承 rootLogger 的配置。

配置日志

默认情况下,Debezium 连接器会将所有 INFOWARNERROR 消息写入控制台。您可以通过以下任一方法更改默认日志配置

您还可以使用其他方法通过 Log4j 配置 Debezium 日志。有关更多信息,请搜索有关设置和使用附加程序将日志消息发送到特定目标的教程。

通过配置日志记录器设置日志级别

默认的 Debezium 日志级别提供了足够的信息来显示连接器是否健康。但是,如果连接器不健康,您可以更改其日志级别来排查问题。

通常,Debezium 连接器将其日志消息发送到名称与生成日志消息的 Java 类完全限定名匹配的日志记录器。Debezium 使用包来组织相似或相关功能的代码。这意味着您可以控制特定类的所有日志消息,或特定包内或其下的所有类的所有日志消息。

过程
  1. 打开 connect-log4j.properties 文件。

  2. 配置连接器的日志记录器。

    以下示例配置了 MySQL 连接器及其使用的数据库模式历史实现日志记录器,并将它们设置为记录 DEBUG 级别的消息

    示例 2. 启用日志记录器并将日志级别设置为 DEBUGconnect-log4j.properties 配置
    ...
    log4j.logger.io.debezium.connector.mysql=DEBUG, stdout  (1)
    log4j.logger.io.debezium.relational.history=DEBUG, stdout  (2)
    
    log4j.additivity.io.debezium.connector.mysql=false  (3)
    log4j.additivity.io.debezium.storage.kafka.history=false
    ...
    表 2. 启用日志记录器和设置日志级别的 connect-log4j.properties 设置的说明
    属性 描述

    1

    配置名为 io.debezium.connector.mysql 的日志记录器,以将 DEBUGINFOWARNERROR 消息发送到 stdout 附加程序。

    2

    配置名为 io.debezium.relational.history 的日志记录器,以将 DEBUGINFOWARNERROR 消息发送到 stdout 附加程序。

    3

    这对 log4j.additivity.io 条目禁用了 additivity(累加性)。如果您使用多个附加程序,请将 additivity 值设置为 false,以防止重复的日志消息发送到父日志记录器的附加程序。

  3. 如果需要,更改连接器内特定类子集的日志级别。

    提高整个连接器的日志级别会增加日志的冗长程度,这可能会使理解正在发生的事情变得困难。在这种情况下,您可以仅更改与您正在排查的问题相关的类的子集的日志级别。

    1. 将连接器的日志级别设置为 DEBUGTRACE

    2. 查看连接器的日志消息。

      查找与您要排查的问题相关的日志消息。每条日志消息的末尾都显示了生成该消息的 Java 类的名称。

    3. 将连接器的日志级别改回 INFO

    4. 为识别出的每个 Java 类配置一个日志记录器。

      例如,考虑一个场景,您不确定 MySQL 连接器在处理 binlog 时为何会跳过某些事件。与其为整个连接器开启 DEBUGTRACE 日志记录,不如将连接器的日志级别保持为 INFO,然后仅为读取 binlog 的类配置 DEBUGTRACE

      示例 3. 启用 BinlogReader 类的 DEBUG 日志记录的 connect-log4j.properties 配置
      ...
      log4j.logger.io.debezium.connector.mysql=INFO, stdout
      log4j.logger.io.debezium.connector.mysql.BinlogReader=DEBUG, stdout
      log4j.logger.io.debezium.relational.history=INFO, stdout
      
      log4j.additivity.io.debezium.connector.mysql=false
      log4j.additivity.io.debezium.storage.kafka.history=false
      log4j.additivity.io.debezium.connector.mysql.BinlogReader=false
      ...

使用 Kafka Connect REST API 动态设置日志级别

您可以使用 Kafka Connect REST API 在运行时动态设置连接器的日志级别。与在 connect-log4j.properties 中设置的日志级别更改不同,通过 API 所做的更改会立即生效,并且不需要您重新启动工作节点。

您在 API 中指定的日志级别设置仅适用于接收请求的端点的那个工作节点。群集中其他工作节点的日志级别保持不变。

指定的级别在工作节点重启后不会持久化。要使日志级别更改持久化,请通过 配置日志记录器添加映射诊断上下文connect-log4j.properties 中设置日志级别。

过程
  • 通过向 admin/loggers 端点发送 PUT 请求来设置日志级别,该请求指定以下信息

    • 您想更改日志级别的包。

    • 您想设置的日志级别。

      curl -s -X PUT -H "Content-Type:application/json" https://:8083/admin/loggers/io.debezium.connector.<connector_package> -d '{"level": "<log_level>"}'

      例如,要为 Debezium MySQL 连接器记录调试信息,请向 Kafka Connect 发送以下请求

      curl -s -X PUT -H "Content-Type:application/json" https://:8083/admin/loggers/io.debezium.connector.mysql -d '{"level": "DEBUG"}'

使用映射诊断上下文设置日志级别

大多数 Debezium 连接器(以及 Kafka Connect 工作节点)使用多个线程来执行不同的活动。这使得在查看日志文件时很难只找到某个逻辑活动的日志消息。为了使日志消息更容易查找,Debezium 提供了一些 映射诊断上下文(MDC),它们为每个线程提供额外的信息。

Debezium 提供以下 MDC 属性

dbz.connectorType

连接器类型的简短别名。例如,MySqlMongoPostgres 等。同一类型连接器的所有线程都使用相同的值,因此您可以使用此值查找给定类型的连接器生成的所有日志消息。

dbz.connectorName

连接器或数据库服务器的名称,如连接器配置中所定义。例如 productsserverA 等。特定连接器实例的所有线程都使用相同的值,因此您可以找到特定连接器实例生成的所有日志消息。

dbz.connectorContext

连接器任务中作为单独线程运行的活动的简短名称。例如,mainbinlogsnapshot 等。在某些情况下,当连接器将线程分配给特定资源(如表或集合)时,可以使用该资源的名称。与连接器关联的每个线程都会使用不同的值,因此您可以找到与此特定活动关联的所有日志消息。

要为连接器启用 MDC,您需要在 connect-log4j.properties 文件中配置一个附加程序。

过程
  1. 打开 connect-log4j.properties 文件。

  2. 配置一个附加程序以使用任何支持的 Debezium MDC 属性。在以下示例中,stdout 附加程序被配置为使用这些 MDC 属性。

    示例 4. 将 stdout 附加程序设置为使用 MDC 属性的 connect-log4j.properties 配置
    ...
    log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p  %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext}  %m   [%c]%n
    ...

    前面示例中的配置会生成类似如下输出的日志消息

    ...
    2017-02-07 20:49:37,692 INFO   MySQL|dbserver1|snapshot  Starting snapshot for jdbc:mysql://mysql:3306/?useInformationSchema=true&nullCatalogMeansCurrent=false&useSSL=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull with user 'debezium'   [io.debezium.connector.mysql.SnapshotReader]
    2017-02-07 20:49:37,696 INFO   MySQL|dbserver1|snapshot  Snapshot is using user 'debezium' with these MySQL grants:   [io.debezium.connector.mysql.SnapshotReader]
    2017-02-07 20:49:37,697 INFO   MySQL|dbserver1|snapshot  GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%'   [io.debezium.connector.mysql.SnapshotReader]
    ...

日志中的每一行都包含连接器类型(例如,MySQL)、连接器名称(例如,dbserver1)以及线程活动(例如,snapshot)。

在 Debezium 容器镜像中配置日志级别

用于 Kafka 和 Kafka Connect 的 Debezium 容器镜像都设置了它们的 log4j.properties 文件来配置 Debezium 相关的日志记录器。所有日志消息都发送到 Docker 容器的控制台(从而发送到 Docker 日志)。日志消息也写入 /kafka/logs 目录下的文件中。

容器使用 LOG_LEVEL 环境变量来设置根日志记录器的日志级别。您可以使用此环境变量来设置容器中运行的服务日志级别。当您启动容器并将此环境变量的值设置为日志级别(例如,-e LOG_LEVEL=DEBUG)时,容器内的所有代码都将使用该日志级别。

还有一个选项可以覆盖其他 log4j 属性。如果您想以不同方式配置 log4j.rootLogger,请使用环境变量 CONNECT_LOG4J_LOGGERS。例如,要仅将日志记录到 stdout(不带 appender),您可以使用 CONNECT_LOG4J_LOGGERS=INFO, stdout。您还可以使用 CONNECT_LOG4J 前缀设置其他支持的 log4j 环境变量,它们将映射到 log4j.properties 文件中的属性,方法是删除 CONNECT_ 前缀,将所有字符小写,并将所有 '_' 字符转换为 '.'。

如果您需要更精细地控制日志配置,请创建一个基于我们的新容器镜像,但在您的 Dockerfile 中,将您自己的 log4j.properties 文件复制到镜像中。例如

Dockerfile
...
COPY log4j.properties $KAFKA_HOME/config/log4j.properties
...