Apache APISIX tencent-cloud-cls 插件实战:将网关访问日志实时上报腾讯云 CLS
API网关后端云原生微服务【免费下载链接】apisixThe Cloud-Native API Gateway and AI Gateway项目地址https://gitcode.com/gh_mirrors/api/apisix点击查看免费下载本文是 Apache APISIX 官方tencent-cloud-cls日志插件的完整技术指南。该插件通过腾讯云 CLSCloud Log Service提供的结构化日志上传 API把 APISIX 网关处理过的请求日志批量转发到你指定的 CLS Topic供检索、告警与离线分析使用。读完本文你将掌握该插件的全部配置属性、日志格式定制方式、启用与下线方法并能结合源码理解其采样、批量上报与签名认证的实现原理。插件概述tencent-cloud-cls是一个典型的日志类插件在 APISIX 的日志阶段logphase收集请求上下文经过批量处理器Batch Processor聚合后通过 CLS 的structuredlog上传接口写入指定的日志主题。插件主文件位于 apisix/plugins/tencent-cloud-cls.lua从源码可以确认插件优先级priority为397版本号为0.1插件 Schema 通过batch_processor_manager:wrap_schema(schema)包装因此自动继承了批量处理器的全部配置项底层上报逻辑封装在独立的 CLS SDK 模块 apisix/plugins/tencent-cloud-cls/cls-sdk.lua 中负责腾讯云签名、protobuf 序列化与 HTTP 发送。属性配置详解启用插件时可以在 Route、Service、Consumer 或 Plugin Config 上按以下属性进行配置名称类型必填默认值合法取值描述cls_hoststring是CLS API 主机地址Host如ap-guangzhou.cls.tencentyun.com具体参见腾讯云「上传结构化日志」接口文档。cls_topicstring是目标 CLS 的 Topic ID。schemestring否https[http, https]连接 CLS 时使用的协议默认https保证链路安全。secret_idstring是API 密钥的 SecretId。secret_keystring是API 密钥的 SecretKey属于加密存储字段。sample_rationumber否1[0.00001, 1]请求采样比例1表示采集全部请求。include_req_bodyboolean否false[false, true]为true时在日志中附带请求体若请求体过大无法驻留内存则受 NGINX 限制无法记录。include_req_body_exprarray否与include_req_body配合使用的过滤表达式仅当表达式求值为true时才记录请求体语法参考 lua-resty-expr。max_req_body_bytesinteger否5242881允许记录的最大请求体字节数超过该值会截断后再记录。include_resp_bodyboolean否false[false, true]为true时在日志中附带响应体。include_resp_body_exprarray否与include_resp_body配合使用的过滤表达式仅当求值为true时记录响应体。max_resp_body_bytesinteger否5242881允许记录的最大响应体字节数超过该值会截断后再记录。global_tagobject否JSON 形式的键值对随每条日志一起发送。log_formatobject否以 JSON 键值对声明的自定义日志格式。值支持字符串和嵌套对象最多嵌套五层更深字段会被截断字符串内可用$前缀引用 APISIX 变量 或 NGINX 变量。log_format_extraobject否在默认日志条目之上追加的额外日志字段保留全部默认字段而非替换与log_format不同。取值语法与log_format相同设置了log_format时该项被忽略。必填项与加密存储cls_host、cls_topic、secret_id、secret_key四项为必填。源码中的required声明如下apisix/plugins/tencent-cloud-cls.luaencrypt_fields {secret_key}, required { cls_host, cls_topic, secret_id, secret_key }其中encrypt_fields {secret_key}意味着secret_key会以加密形式存储在 etcd 中属于加密存储字段机制避免密钥明文落盘。值得留意的是源码 Schema 中还定义了文档属性表未列出的ssl_verify字段type boolean, default true用于控制上报请求是否校验 CLS 服务端证书默认开启。批量处理能力该插件支持使用批量处理器聚合日志避免频繁提交数据。默认情况下批量处理器每 5 秒提交一次数据或当队列中数据达到1000 条时立即提交。你可以通过插件的batch_max_size、buffer_duration、max_retry_count、retry_delay、inactive_timeout等参数覆盖默认行为详细说明见批量处理器配置。采样与请求体读取的源码实现从源码可以看到采样逻辑实现在access阶段apisix/plugins/tencent-cloud-cls.luafunction _M.access(conf, ctx) ctx.cls_sample false if conf.sample_ratio 1 or math.random() conf.sample_ratio then core.log.debug(cls sampled) ctx.cls_sample true else return end log_util.check_and_read_req_body(conf, ctx) endsample_ratio为1时全量采集否则按随机概率决定本次请求是否进入日志并在body_filter阶段调用log_util.collect_body按需收集响应体。请求体/响应体的表达式过滤include_req_body_expr/include_resp_body_expr与体积截断max_req_body_bytes/max_resp_body_bytes逻辑统一实现在 apisix/utils/log-util.lua其中响应体会优先尝试按Content-Encoding解压后再记录。默认日志格式示例未设置log_format时每条日志的默认结构如下字段含义client_ip客户端 IP、route_id路由 ID、service_id服务 ID、latency总延迟、apisix_latencyAPISIX 内部延迟、upstream_latency上游延迟、start_time请求起始时间戳毫秒等{ response: { headers: { content-type: text/plain, connection: close, server: APISIX/3.7.0, transfer-encoding: chunked }, size: 136, status: 200 }, route_id: 1, upstream: 127.0.0.1:1982, client_ip: 127.0.0.1, apisix_latency: 100.99985313416, service_id: , latency: 103.99985313416, start_time: 1704525145772, server: { version: 3.7.0, hostname: localhost }, upstream_latency: 3, request: { headers: { connection: close, host: localhost }, url: http://localhost:1984/opentracing, querystring: {}, method: GET, size: 65, uri: /opentracing } }从 apisix/utils/log-util.lua 的get_log_entry实现可以看出日志条目的生成遵循以下优先级若插件配置或插件元数据中设置了log_format则生成自定义格式日志否则使用get_full_log生成上述完整默认日志并将log_format_extra声明的额外字段追加到默认字段之上绝不覆盖已有默认字段global_tag中配置的键值对最后合并进条目。通过插件元数据定制日志格式除了在 Route 上配置log_format你还可以通过插件元数据Plugin Metadata全局设置日志格式对所有使用该插件的 Route 和 Service 同时生效。可用元数据如下名称类型必填默认值描述log_formatobject否以 JSON 键值对声明的日志格式值支持字符串与嵌套对象最多五层字符串内可用$引用 APISIX/NGINX 变量。log_format_extraobject否在默认日志条目之上追加的额外字段语法同log_format设置log_format时被忽略。max_pending_entriesinteger否8192等待处理的最大条目数。积压超过该值时新条目将被丢弃避免日志服务器变慢或不可达时无限制增长 worker 内存相关内存开销见批量处理器积压限制。注意插件元数据的配置是全局作用域的会影响所有使用tencent-cloud-cls插件的 Route 与 Service。通过 Admin API 配置元数据的示例先获取admin_keyadmin_key$(yq .deployment.admin.admin_key[0].key conf/config.yaml | sed s///g)curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/tencent-cloud-cls \ -H X-API-KEY: $admin_key -X PUT -d { log_format: { host: $host, timestamp: $time_iso8601, client_ip: $remote_addr, request: { method: $request_method, uri: $request_uri }, response: { status: $status } } }配置生效后日志将按如下紧凑格式输出可见自定义格式会自动附带route_id字段{host:localhost,timestamp:2020-09-23T19:05:05-04:00,client_ip:127.0.0.1,request:{method:GET,uri:/hello},response:{status:200},route_id:1} {host:localhost,timestamp:2020-09-23T19:05:05-04:00,client_ip:127.0.0.1,request:{method:GET,uri:/hello},response:{status:200},route_id:1}启用插件以下示例在/hello路由上启用tencent-cloud-cls插件同时开启请求体与响应体采集并为每条日志附加global_tag标记curl http://127.0.0.1:9180/apisix/admin/routes/1 \ -H X-API-KEY: $admin_key -X PUT -d { plugins: { tencent-cloud-cls: { cls_host: ap-guangzhou.cls.tencentyun.com, cls_topic: ${your CLS topic name}, global_tag: { module: cls-logger, server_name: YourApiGateWay }, include_req_body: true, include_resp_body: true, secret_id: ${your secret id}, secret_key: ${your secret key} } }, upstream: { type: roundrobin, nodes: { 127.0.0.1:1980: 1 } }, uri: /hello }启用后向网关发起请求即可在 CLS Topic 中查看到对应日志curl -i http://127.0.0.1:9080/hello禁用插件需要下线该插件时将路由配置中plugins下的tencent-cloud-cls配置删除即可。APISIX 会自动热加载生效无需重启curl http://127.0.0.1:9180/apisix/admin/routes/1 \ -H X-API-KEY: $admin_key -X PUT -d { uri: /hello, plugins: {}, upstream: { type: roundrobin, nodes: { 127.0.0.1:1980: 1 } } }底层上报原理签名、序列化与批量发送插件的日志上报由 apisix/plugins/tencent-cloud-cls/cls-sdk.lua 完成从源码可以梳理出完整链路1. 腾讯云签名认证SDK 内实现了腾讯云 CLS 的 SHA1 签名算法对应官方「请求签名」规范以POST方法、/structuredlog路径、空参数与空请求头构造http_request_info再依次生成q-sign-time有效期 60 秒、string_to_sign与 HMAC-SHA1 签名最终拼装出Authorization请求头。签名参数包括q-sign-algorithmsha1、q-ak、q-sign-time、q-key-time、q-signature等。2. protobuf 序列化CLS 结构化日志接口要求以application/x-protobuf内容类型提交LogGroupList消息。SDK 在运行时通过 lua-protobuf 动态加载内嵌的cls.proto定义包含Log、LogTag、LogGroup、LogGroupList四个消息将日志条目编码为二进制后再通过resty.http以 POST 方式发送到{scheme}://{cls_host}/structuredlog?topic_id{cls_topic}3. 大小限制与分批发送单条日志的单个字段值最大1 MBMAX_SINGLE_VALUE_SIZE超出会被截断并记录警告单条日志总体积与单个LogGroup累计体积上限均为5 MBMAX_LOG_GROUP_VALUE_SIZE超限日志会被丢弃且发送时会按 5 MB 边界自动拆分为多个LogGroupList分批上传每条日志会带上本机 IP 作为source字段首次通过 DNS 解析主机名得到结果全局缓存连接超时 1000 ms、发送与读取超时各 10000 ms。4. 失败处理与重试语义send_cls_request中HTTP 状态码为413、404、401、403时视为不可重试错误直接放弃其余错误如500会返回失败由批量处理器依据max_retry_count、retry_delay等配置进行重试。测试用例见下文中模拟的 500 响应即验证了该重试路径。测试用例验证插件行为在测试文件 t/plugin/tencent-cloud-cls.t 中有完整覆盖可作为配置与行为的权威参考Schema 校验TEST 1/2验证合法配置通过校验、缺少secret_key时报property secret_key is required批量上报失败与成功TEST 3-6分别向返回 500 的模拟服务器与正常服务器上报断言错误日志Batch Processor[tencent-cloud-cls] failed to process entries [1/1]: got wrong status: 500与成功日志successfully processed the entries请求结构验证TEST 7/8mocksend_to_cls与send_cls_request断言LogGroupList、LogGroup、Log、contents的层级结构正确元数据日志格式TEST 9/10通过元数据设置log_format后验证上报日志包含host、timestamp、client_ip等自定义字段密钥加密存储TEST 12开启data_encryption后通过 Admin API 读取到的是解密后的明文secret_key而从 etcd 直接读取到的是密文如oshn8tcqE8cJArmEILVNPQ印证了encrypt_fields机制的实际效果。使用建议生产环境务必使用https默认值并保持ssl_verify为true避免凭证与日志内容在传输中被窃取请求/响应体采集会带来内存与性能开销建议仅在排障场景开启并结合include_req_body_expr/include_resp_body_expr精确限定采集范围同时用max_req_body_bytes/max_resp_body_bytes控制单条日志体积高流量场景下优先依赖批量处理器聚合上报并通过global_tag附加业务维度标签便于在 CLS 中按模块、网关实例等维度过滤检索若日志字段较多推荐通过元数据配置log_format精简字段既降低存储成本也让 CLS 检索索引更聚焦。赞分享API网关后端云原生微服务【免费下载链接】apisixThe Cloud-Native API Gateway and AI Gateway项目地址https://gitcode.com/gh_mirrors/api/apisix点击查看免费下载相关推荐Apache APISIX tencent-cloud-cls 插件实战把网关访问日志结构化写入腾讯云 CLSApache APISIX tencent cloud cls 插件实战把网关访问日志结构化写入腾讯云 CLS 导读 tencent cloud cls 是后端微服务云原生Apache APISIX tencent-cloud-cls 插件实战将网关访问日志批量推送至腾讯云日志服务Apache APISIX tencent cloud cls 插件实战将网关访问日志批量推送至腾讯云日志服务 tencent cloud cls 是 Apa后端微服务云原生3分钟快速上手Windows上最轻量级安卓应用安装器完全指南3分钟快速上手Windows上最轻量级安卓应用安装器完全指南 你是否曾想过在Windows电脑上直接运行安卓应用而不需要臃肿的安卓模拟器APK InstaAPI网关后端云原生微服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

综合能源系统优化:两阶段随机规划与Matlab实现

综合能源系统优化:两阶段随机规划与Matlab实现

1. 项目背景与核心挑战在能源系统转型的大背景下,综合能源系统(Integrated Energy System, IES)因其多能互补特性成为研究热点。这个项目聚焦于综合能源生产单元(Integrated Energy Production Unit, IEPU)这一关键组成…

2026/9/21 19:22:58 阅读更多 →
MATLAB连续碰撞检测在无人机导航中的应用

MATLAB连续碰撞检测在无人机导航中的应用

1. 项目背景与核心价值在无人机自主导航领域,运动规划算法需要实时处理复杂环境中的避障问题。传统离散碰撞检测方法存在两个致命缺陷:一是采样间隔导致的"隧道效应"(tunneling effect),高速移动时可能漏检障…

2026/9/21 19:22:58 阅读更多 →
cdcs考试实战揭秘:3个必避坑点让你一次通过面试必问

cdcs考试实战揭秘:3个必避坑点让你一次通过面试必问

cdcs考试实战揭秘:3个必避坑点让你一次通过面试必问 刚接手 cdcs考试 项目时,满屏红色的 StackTrace 让我头皮发麻。那些嵌套了五层的报错信息,看着像天书一样,完全不知道从哪下手。更扎心的是,HR…

2026/9/21 19:22:58 阅读更多 →

最新新闻

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南 配置环境就卡半天,是不是你的常态?很多刚入行的应届生朋友,面对经典的“猴子摘鲜果”算法题,还没开始写逻辑,就在 Python 和 Java 的环境切换中耗尽了耐心。这种 新手避坑…

2026/9/21 20:05:17 阅读更多 →
3个不可能的任务性能优化方案,面试必问实战拆解

3个不可能的任务性能优化方案,面试必问实战拆解

3个不可能的任务性能优化方案,面试必问实战拆解 看了一堆教程还是不会写项目?这是不是你的常态?视频里代码跑得飞快,自己一动手就报错。更扎心的是,面试官抛出一个性能优化场景,你愣在原地,脑子里全是 for 循环和 map…

2026/9/21 20:05:17 阅读更多 →
乔布斯癌症面试真题完整示例:3步拆解考点与避坑

乔布斯癌症面试真题完整示例:3步拆解考点与避坑

乔布斯癌症面试真题完整示例:3步拆解考点与避坑 刚拿到“乔布斯癌症”相关的面试题,复制网上的答案背了半小时,结果面试官问第二层逻辑时直接卡壳。那种感觉就像你手里攥着一把生锈的钥匙,硬插进锁孔,怎么都拧不动。别慌,这种“复制来的代码跑不通不知…

2026/9/21 20:05:17 阅读更多 →
xxxsss常见报错与解决

xxxsss常见报错与解决

3个核心避坑指南:培训机构选型与通过率真相 刚拿到那份“高薪就业”的推荐名单?别急着交钱。 你是不是也遇到过这种情况:网上搜了一堆“最佳实践”,复制下来的代码在本地环境里跑不通,报错信息看得人头大,完全不知道从哪开始调。…

2026/9/21 20:05:17 阅读更多 →
5步搞定搜索快捷键:源码解析背后的性能优化实战

5步搞定搜索快捷键:源码解析背后的性能优化实战

5步搞定搜索快捷键:源码解析背后的性能优化实战 看了一堆教程还是不会写项目?这种挫败感我太懂了。你盯着屏幕上的代码,明明每个字符都认识,合起来就是跑不通。问题往往不在语法,而在你对底层逻辑的“黑盒”认知缺失。今天我们就拿【搜索快捷键】这个看…

2026/9/21 20:05:17 阅读更多 →
欲练此功必先自宫:后端开发最佳实践与面试避坑指南

欲练此功必先自宫:后端开发最佳实践与面试避坑指南

欲练此功必先自宫:后端开发最佳实践与面试避坑指南 面试被问原理答不上来,是不是觉得脑子里一片浆糊?别慌,这不是你笨,而是你一直只记结论,没摸透底层逻辑。很多新人学编程,就像练绝世武功,光背招式口诀,连内力运行路线都没搞清,遇到变招直接卡壳。…

2026/9/21 20:04:17 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →