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