有奖捉虫:行业应用 & 管理与支持文档专题 HOT
文档中心 > 日志服务 > 操作指南 > 日志采集 > 使用 Kafka 数据订阅采集日志
日志服务(Cloud Log Service,CLS)目前已支持主动订阅自建 Kafka 或腾讯云 CKafka 生产的日志。本文将介绍如何通过 Kafka 数据订阅将日志接入日志服务。

前提条件

已有可用的自建 Kafka 集群或腾讯云 CKafka 集群。
Kafka 版本 > 0.10.2.0。
已创建日志集于日志主题。 具体操作请参见 日志集日志主题

操作步骤

步骤1:登录控制台

2. 在左侧导航栏中,单击日志主题,进入日志主题管理页面。

步骤2:创建 Kafka 数据订阅任务

1. 日志主题管理页中,找到目标日志主题,单击日志主题名称,进入日志主题详情页。


2. 在日志主题详情页中, 选择采集配置页签, 找到 Kafka 数据订阅。


3. 单击新增,创建 Kafka 数据订阅任务。



步骤3:配置 Kafka 数据订阅任务

1. 配置集群步骤中, 配置如下参数:
参数
是否必填
说明
Kafka 类型
目标 Kafka 的类型,支持选择腾讯云 Ckafka 或自建 Kafka。
Ckafka 实例
若 Kafka 类型选择为腾讯云 CKafka,则需要在下拉框中选择目标 Ckafka 实例 。
服务地址
若 Kafka 类型选择为自建 Kafka,则需填写目标 Kafka 的公网 IP 地址或域名。
注意:当目标 Kafka 为 CLS Kafka 消费端,建议使用内网 IP 地址或域名。
是否需要鉴权
目标 Kafka 集群是否需要鉴权才能访问。
协议类型
若目标 Kafka 集群需要鉴权才能访问,则需选择鉴权协议类型:
plaintext
sasl_plaintext
sasl_ssl
认证机制
若目标 Kafka 集群需要鉴权才能访问,且协议类型为 sasl_plaintext 或 sasl_ssl,则需选择鉴权认证机制:
PLAIN
SCRAM-SHA-256
SCRAM-SHA-512
用户名/密码
若目标 Kafka 集群需要鉴权才能访问,则需填写访问目标 Kafka 集群所需的用户名与密码。
Kafka Topic 列表
若 Kafka 类型为腾讯云 Ckafka,需在下拉框中单选或多选 Kafka Topic。
若 Kafka 类型为自建 Kafka,需填写单个或多个 Kafka Topic;多个 Topic 通过逗号隔开。
消费组
若为空,将自动创建消费组,命名规则为 cls-${taskid}。若不为空,则使用指定的消费组消费。
注意:
若为空,确保 Kafka 集群可自动创建消费组。
若不空,请确保当前指定消费组没有被其他任务消费,否则会导致数据缺失。
起始位置
最早:从最早的 offset 开始消费。
最晚:从最新的 offset 开始消费。
注意:起始位置仅支持创建订阅任务时配置,后续不可修改。
2. 完成集群配置之后,可单击预览,如下图所示:



3. 确认集群配置无误后,单击下一步进入订阅规则配置步骤。
4. 订阅规则配置步骤中,配置如下参数:
参数
是否必填
说明
配置名称
Kafka 数据订阅配置名称。
数据提取模式
可选择 JSON、单行全文、单行完全正则三种提取模式,详情请参见 数据提取模式
日志样例
若数据提取模式选择为单行完全正则,需手动填写或自动获取一条日志样例,用于验证正则表达式,并提取键值。
正则表达式
若数据提取模式选择为单行完全正则,需手动填写或自动生成一条正则表达式,系统会根据您填写的正则表达式验证并提取键值。自动生成正则表达式的具体操作,详情请参见 正则表达式自动生成
抽取结果
若数据提取模式选择为单行完全正则,需配置或修改基于正则表达式提取出来的字段的字段名。
手动验证
若数据提取模式选择为单行完全正则,可选择额外填写单条或多条日志样例来验证正则表达式的正确性。
上传解析失败日志
若数据提取模式选择为 JSON 或单行完全正则,若开启上传解析失败日志,在日志解析失败时,LogListener 会上传解析失败的日志;若关闭,则会丢弃解析失败的日志。
解析失败日志的键名称
若开启了上传解析失败日志,您可指定一个字段名作为 Key,解析失败的日志将作为您指定字段的 Value 进行上传。
编码格式
基于您的日志,您可选择以下两种编码格式:
UTF-8
GBK
使用默认时间
开启后将使用系统当前时间或 Kafka 消息时间戳作为日志的时间戳;关闭则将使用日志中的时间字段作为日志时间戳。
默认时间来源
当开启了使用默认时间,您可以选择以下两默认事件作为日志时间戳:
系统当前时间
Kafka 消息时间戳
时间字段
当关闭了使用默认时间,且数据提取模式为 JSON 或正则时,您可以指定日志中代表时间的字段名,该字段的值将会用作日志的时间戳。
时间提取正则
当关闭了使用默认时间,且数据提取模式单行全文时,您可通过正则表达式定义日志中代表时间的字段。 注意:若正则匹配到多个字段, 将使用第一个。
例子:日志原文为:message with time 2022-08-08 14:20:20,则您可以设置提取时间正则为\\d\\d\\d\\d-\\d\\d-\\d\\d\\d\\d:\\d\\d:\\d\\d
时间字段格式
当关闭了使用默认时间,并确认了日志中的时间字段,需进一步指定时间格式,用于解析时间字段的值。详情请参见 配置时间格式
时间字段时区
当关闭了使用默认时间,并确认了日志中的时间字段与格式,需选择以下两种不同的时区标准:
UTC (协调世界时)
GMT (格林威治标准时间)
解析失败使用时间
当关闭了使用默认时间,若时间提取正则或时间字段格式解析失败,支持用户选择以下两种默认时间代替作为日志时间戳:
系统当前时间
Kafka 消息时间戳
Kafka 元数据
支持勾选以下4种 Kafka 相关元数据与日志一起上传:
kafka_topic
kafka_partition
kafka_offset
kafka_timestamp
注意:
若日志原文中存在与以上元数据同名的字段,将会被覆盖。

5. 完成订阅规则配置后,您可单击预览,预览导出结果。如下图所示:


6. 预览无误后, 单击下一步,进入索引配置步骤。
7. 索引配置页面,设置如下信息。


索引状态:确认是否开启。
注意
若要对日志进行检索,索引状态需未开启,否则无法检索日志。
全文索引:全文索引将日志全文整体切分为多个分词进行索引构建,检索时直接通过关键词进行检索(即全文检索),例如使用error检索所有出现过 error 的日志。
配置项
功能描述
全文分词符
对原始日志进行分词的字符集合,仅支持英文符号,控制台默认分词符为@&?|#()='",;:<>[]{}/ \\n\\t\\r\\\\
大小写敏感
检索时是否对大小写敏感。例如日志为 Error,若大小写敏感,则使用 error 无法检索到该条日志。
是否包含中文
日志中包含中文且需要对中文进行检索时可开启该功能。例如日志为“用户登录接口超时”,若未开启该功能,搜索"超时"无法检索到该日志,只有完整地搜索"用户登录接口超时"才能检索到该日志,开启该功能后便可通过搜索“超时”检索到该日志。
键值索引:键值索引将原始日志按字段(即 key:value)分别切分为多个分词进行索引构建,检索时基于键值方式进行检索(即键值检索),例如使用level:error AND timeCost:>1000检索日志级别(level)为 error 且耗时(timeCost)大于 1000ms 的日志。某些日志中还包含一类特殊的“元数据字段”,这类字段配置索引的方式与普通字段一致。
配置项
功能描述
字段名称
字段名称,单个日志主题键值索引最多可添加300个字段。
仅支持字母、数字、下划线和-./@,且不能以下划线开头。
字段类型
字段的数据类型,包括 text、long、double 三种类型。
text 类型支持使用通配符进行模糊检索,不支持范围比较。
long、double 类型支持范围比较,不支持模糊检索。
分词符
对字段值进行分词的字符集合,仅支持英文符号,控制台默认分词符为@&?|#()='",;:<>[]{}/ \\n\\t\\r\\\\
包含中文
字段中包含中文且需要对中文进行检索时可开启该功能。例如日志为“message:用户登录接口超时”,若未开启该功能,使用message:"超时"无法检索到该日志,只有使用message:"用户登录接口超时"才能检索到该日志,开启该功能后便可使用message:"超时"检索该日志。
开启统计
开启后可对该字段使用 SQL 进行统计分析,text 类型字段开启统计时,如果值过长,仅前32766个字符参与统计运算。
开启统计不会额外产生费用,建议您开启。
大小写敏感
检索时是否对大小写敏感例如日志为“level:Error”,若大小写敏感,则使用level:error无法检索到该条日志。
8. 索引相关的更多详情,请参见 索引配置
9. 完成索引配置后,单击提交,即可完成 Kafka 数据订阅任务的创建。

步骤4:查看 Kafka 数据订阅任务

完成 Kafka 数据订阅任务后,您可在日志主题详情页 - 采集配置页签中找到所有已创建的 Kafka 数据订阅任务。




步骤5:检索分析日志

完成 Kafka 数据订阅任务后,即可开始使用日志的检索与分析,以及更高阶的仪表盘告警等功能了。
仪表盘

规格与限制

规格与限制请参见 Kafka 数据订阅规格与限制

最佳实践

附录

正则表达式自动生成

1. 在弹出的正则表达式自动生成模态视图中,根据实际的检索分析需求,选中需要提取 key-value 的日志内容,并在弹出的文本框中,输入键(key)名,单击确认提取。如下图所示:

系统将自动对该部分内容提取一个正则表达式,自动提取结果会出现在 key-value 表格中。如下图所示:


2. 重复步骤1,直到提取完所有的 key-value 对。 如下图所示:


3. 单击确定,系统将根据提取好的 key-value 对自动生成完整的正则表达式。 如下图所示:



数据提取模式

Kafka 数据订阅提供多种解析方式,如下表所示:
JSON
单行全文
单行完全正则
假设您的一条 JSON 日志原始数据为:
{"remote_ip":"10.135.46.111","time_local":"22/Jan/2019:19:19:34 +0800","body_sent":23,"responsetime":0.232,"upstreamtime":"0.232","upstreamhost":"unix:/tmp/php-cgi.sock","http_host":"127.0.0.1","method":"POST","url":"/event/dispatch","request":"POST /event/dispatch HTTP/1.1","xff":"-","referer":"http://127.0.0.1/my/course/4","agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0","response_code":"200"}
经过日志服务结构化处理后,该条日志将变为如下:
agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0
body_sent: 23
http_host: 127.0.0.1
method: POST
referer: http://127.0.0.1/my/course/4
remote_ip: 10.135.46.111
request: POST /event/dispatch HTTP/1.1
response_code: 200
responsetime: 0.232
time_local: 22/Jan/2019:19:19:34 +0800
upstreamhost: unix:/tmp/php-cgi.sock
upstreamtime: 0.232
url: /event/dispatch
xff: -
单行全文日志是指一行日志内容为一条完整的日志。日志服务在采集的时候,将使用换行符 \\n 来作为一条日志的结束符。为了统一结构化管理,每条日志都会存在一个默认的键值__CONTENT__,但日志数据本身不再进行日志结构化处理,也不会提取日志字段,日志属性的时间项由日志采集的时间决定。
假设一条日志原始数据为:
Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
采集到日志服务的数据为:
__CONTENT__:Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
单行完全正则格式通常用来处理结构化的日志,指将一条完整日志按正则方式提取多个 key-value 的日志解析模式。
假设一条日志原始数据为:
10.135.46.111 - - [22/Jan/2019:19:19:30 +0800] "GET /my/course/1 HTTP/1.1" 127.0.0.1 200 782 9703 "http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0" 0.354 0.354
配置的正则表达式为如下:
(\\S+)[^\\[]+(\\[[^:]+:\\d+:\\d+:\\d+\\s\\S+)\\s"(\\w+)\\s(\\S+)\\s([^"]+)"\\s(\\S+)\\s(\\d+)\\s(\\d+)\\s(\\d+)\\s"([^"]+)"\\s"([^"]+)"\\s+(\\S+)\\s(\\S+).*
采集到日志服务的数据为:
body_bytes_sent: 9703
http_host: 127.0.0.1
http_protocol: HTTP/1.1
http_referer: http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum
http_user_agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0
remote_addr: 10.135.46.111
request_length: 782
request_method: GET
request_time: 0.354
request_url: /my/course/1
status: 200
time_local: [22/Jan/2019:19:19:30 +0800]
upstream_response_time: 0.354