Debezium系列之:Debezium logging
- 一、概述
- 二、日志记录概念
- 三、了解默认日志记录配置
- 四、配置日志记录
- 1.通过配置记录器设置日志记录级别
- 2.使用 Kafka Connect REST API 动态设置日志记录级别
- 3.使用映射的诊断上下文设置日志记录级别
- 五、配置 Debezium 容器镜像中的日志级别
Debezium设置日志的详细步骤可以参考博主下面这篇技术博客:
- Debezium系列之:将Debezium的info日志、warn日志、error日志拆分到不同文件中
更多内容请阅读博主Debezium专栏,博主会持续更新Debezium专栏:
- Debezium专栏
一、概述
Debezium 在其连接器中内置了广泛的日志记录,可以更改日志记录配置来控制哪些日志语句出现在日志中以及这些日志的发送位置。 Debezium(以及 Kafka、Kafka Connect 和 Zookeeper)使用 Java 的 Log4j 日志框架。
默认情况下,连接器在启动时会生成大量有用信息,但当连接器与源数据库保持同步时,会生成很少的日志。当连接器正常运行时,这通常是足够的,但当连接器表现异常时,这可能不够。在这种情况下,您可以更改日志记录级别,以便连接器生成更详细的日志消息,描述连接器正在执行的操作和未执行的操作。
二、日志记录概念
在配置日志记录之前,您应该了解 Log4J 记录器、日志级别和附加程序是什么。
Loggers
- 应用程序生成的每条日志消息都会发送到特定的记录器(例如,io.debezium.connector.mysql)。记录器按层次结构排列。例如,io.debezium.connector.mysql 记录器是 io.debezium.connector 记录器的子项,io.debezium.connector 记录器是 io.debezium 记录器的子项。在层次结构的顶部,根记录器为其下面的所有记录器定义默认记录器配置。
Log levels:
应用程序生成的每条日志消息也具有特定的日志级别:
- ERROR - 错误、异常和其他重大问题
- WARN - 潜在的问题和问题
- INFO - 状态和一般活动(通常数量较少)
- DEBUG - 更详细的活动,有助于诊断意外行为
- TRACE - 非常详细且详细的活动(通常量很大)
Appenders
- 附加程序本质上是写入日志消息的目的地。每个附加程序都控制其日志消息的格式,使您可以更好地控制日志消息的外观。
- 要配置日志记录,您可以为每个记录器以及应写入这些日志消息的附加程序指定所需的级别。由于记录器是分层的,因此根记录器的配置将作为其下面的所有记录器的默认配置,尽管您可以覆盖任何子(或后代)记录器。
三、了解默认日志记录配置
如果您在 Kafka Connect 进程中运行 Debezium 连接器,那么 Kafka Connect 将使用 Kafka 安装中的 Log4j 配置文件(例如 /opt/kafka/config/connect-log4j.properties)。默认情况下,该文件包含以下配置:
connect-log4j.properties
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n
...
- 根记录器,定义默认记录器配置。默认情况下,记录器包括 INFO、WARN 和 ERROR 消息。这些日志消息将写入 stdout 附加程序。
- stdout 附加程序将日志消息写入控制台(而不是文件)。
- stdout 附加程序使用模式匹配算法来格式化日志消息。
- stdout 附加程序的模式(有关详细信息,请参阅 Log4j 文档)。
除非您配置其他记录器,否则 Debezium 使用的所有记录器都会继承 rootLogger 配置。
四、配置日志记录
默认情况下,Debezium 连接器将所有 INFO、WARN 和 ERROR 消息写入控制台。您可以使用以下方法之一更改默认日志记录配置:
- 通过配置记录器设置日志记录级别
- 使用 Kafka Connect REST API 动态设置日志记录级别
- 通过添加映射的诊断上下文来设置日志记录级别
注意:
您还可以使用其他方法通过 Log4j 配置 Debezium 日志记录。
1.通过配置记录器设置日志记录级别
默认 Debezium 日志记录级别提供了足够的信息来显示连接器是否正常。但是,如果连接器运行状况不佳,您可以更改其日志记录级别来解决问题。
一般来说,Debezium 连接器将其日志消息发送到名称与生成日志消息的 Java 类的完全限定名称相匹配的记录器。 Debezium 使用包来组织具有相似或相关功能的代码。这意味着您可以控制特定类或特定包内或下的所有类的所有日志消息。
程序:
- 打开 log4j.properties 文件。
- 为连接器配置记录器。
此示例为 MySQL 连接器和连接器使用的数据库架构历史实现配置记录器,并将它们设置为记录 DEBUG 级别消息:
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 3
...
- 1.配置名为 io.debezium.connector.mysql 的记录器以将 DEBUG、INFO、WARN 和 ERROR 消息发送到 stdout 附加程序。
- 2.配置名为 io.debezium.relational.history 的记录器以将 DEBUG、INFO、WARN 和 ERROR 消息发送到 stdout 附加程序。
- 3.关闭可加性,这会导致日志消息不会发送到父记录器的附加程序(这可以防止在使用多个附加程序时看到重复的日志消息)。
如有必要,请更改连接器中特定类子集的日志记录级别。
提高整个连接器的日志记录级别会增加日志的详细程度,这可能会导致难以理解正在发生的情况。在这些情况下,您可以仅更改与您正在排除的问题相关的类子集的日志记录级别。
- 将连接器的日志记录级别设置为 DEBUG 或 TRACE。
- 查看连接器的日志消息。查找与您正在排除的问题相关的日志消息。每条日志消息的末尾显示生成该消息的 Java 类的名称。
- 将连接器的日志记录级别设置回 INFO。
- 为您识别的每个 Java 类配置一个记录器。
例如,考虑这样一种场景:您不确定 MySQL 连接器在处理 binlog 时为何跳过某些事件。您可以将连接器的日志记录级别保持为 INFO,然后仅在读取 binlog 的类上配置 DEBUG 或 TRACE,而不是为整个连接器打开 DEBUG 或 TRACE 日志记录:
...
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
...
2.使用 Kafka Connect REST API 动态设置日志记录级别
您可以使用 Kafka Connect REST API 在运行时动态设置连接器的日志记录级别。与您在 log4j.properties 中设置的日志级别更改不同,您通过 API 所做的更改会立即生效,并且不需要您重新启动工作器。
您在 API 中指定的日志级别设置仅适用于接收请求的端点上的工作程序。集群中其他worker的日志级别保持不变。
工作进程重新启动后,指定的级别不会保留。要对日志记录级别进行持久更改,请通过配置记录器或添加映射的诊断上下文来在 log4j.properties 中设置日志级别。
程序
- 通过向 admin/loggers 端点发送 PUT 请求来设置日志级别,该请求指定以下信息:
- 您要更改其日志级别的包。
- 您要设置的日志级别。
curl -s -X PUT -H "Content-Type:application/json"
http://localhost: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"
http://localhost:8083/admin/
loggers/io.debezium.connector.mysql
-d '{"level": "DEBUG"}'
3.使用映射的诊断上下文设置日志记录级别
大多数 Debezium 连接器(以及 Kafka Connect 工作线程)使用多个线程来执行不同的活动。这可能会使查看日志文件并仅查找特定逻辑活动的日志消息变得困难。为了使日志消息更容易查找,Debezium 提供了多个映射诊断上下文 (MDC),为每个线程提供附加信息。
Debezium 提供以下 MDC 属性:
- dbz.connectorType:连接器类型的简短别名。例如MySql、Mongo、Postgres等。与相同类型的连接器关联的所有线程都使用相同的值,因此您可以使用它来查找给定类型的连接器生成的所有日志消息。
- dbz.连接器名称:连接器配置中定义的连接器或数据库服务器的名称。例如产品、serverA 等。与特定连接器实例关联的所有线程都使用相同的值,因此您可以找到特定连接器实例生成的所有日志消息。
- dbz.connectorContext:作为在连接器任务中运行的单独线程运行的活动的简称。例如main、binlog、snapshot等。在某些情况下,当连接器将线程分配给特定资源(例如表或集合)时,可以改用该资源的名称。与连接器关联的每个线程都将使用不同的值,因此您可以找到与此特定活动关联的所有日志消息。
要为连接器启用 MDC,您可以在 log4j.properties 文件中配置附加程序。
程序
- 打开 log4j.properties 文件。
- 配置附加程序以使用任何受支持的 Debezium MDC 属性。
在以下示例中,stdout 附加程序配置为使用这些 MDC 属性:
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)和线程活动(例如快照)。
五、配置 Debezium 容器镜像中的日志级别
Zookeeper、Kafka 和 Kafka Connect 的 Debezium 容器映像都设置了 log4j.properties 文件来配置 Debezium 相关的记录器。所有日志消息都会发送到 Docker 容器的控制台(以及 Docker 日志)。日志消息也会写入 /kafka/logs 目录下的文件中。
容器使用 LOG_LEVEL 环境变量来设置根记录器的日志级别。您可以使用此环境变量来设置容器中运行的服务的日志级别。当您启动容器并将该环境变量的值设置为日志级别(例如 -e LOG_LEVEL=DEBUG)时,容器中的所有代码都会使用该日志级别。
还有一个选项可以覆盖其他 log4j 属性。如果要以不同方式配置 log4j.rootLogger,请使用环境变量 CONNECT_LOG4J_LOGGERS。例如,要仅记录到 stdout(不带附加程序),您可以使用 CONNECT_LOG4J_LOGGERS=INFO, stdout。您还可以使用 CONNECT_LOG4J 前缀设置其他受支持的 log4j 环境变量,通过删除 CONNECT_ 前缀、小写所有字符并将所有“_”字符转换为“.”,这些变量将映射到 log4j.properties 文件中的属性。
如果您需要对日志记录配置进行更多控制,请创建一个基于我们的新容器映像,但在 Dockerfile 中,将您自己的 log4j.properties 文件复制到该映像中。例如:
...
COPY log4j.properties $KAFKA_HOME/config/log4j.properties
...