当前位置: 首页 > backend >正文

Fluent Bit系列:字符集转码测试(上)

#作者:程宏斌

文章目录

  • gbk2utf8.lua 脚本说明
  • 在主配置中配置过滤器。
  • 如何在Linux系统中手动生成GBK日志?
  • 验证日志转码的准确性测试
    • 测试方案
    • fluent-bit 3.0.2 转换测试

这部分内容分为两个任务:
是验证 Lua 脚本是否能够将 GBK 编码的文本转换为 UTF-8;
是验证经过转码脚本后,Fluent Bit 的实际处理能力。

gbk2utf8.lua 脚本说明

该Lua脚本实现了将GBK编码的字符串转换为UTF-8编码的字符串的功能。它的主要实现步骤如下:
建立了一个包含了GBK编码到Unicode编码的映射表 to_uni,通过查询这个表,可以将GBK编码的字符转换为Unicode码点。

gbk2uni 函数,用于根据给定的高位和低位字节查找对应的Unicode码点。

uni2utf8 函数,用于将Unicode码点转换为UTF-8编码的字节序列。
主要的转换函数是 convert_gbk_to_utf8,它遍历输入的GBK编码字符串,对每个字符进行处理:如果是ASCII字符,则直接拼接到输出的UTF-8字符串中;否则,根据该字符的高位和低位字节获取对应的Unicode码点,并将其转换为UTF-8编码,然后拼接到输出的UTF-8字符串中。

fluent-bit FILTER 使用 Lua 代码配置说明
Lua filter 允许您使用自定义Lua脚本修改传入的记录(甚至将一个记录拆分为多个记录)。

由于需要灵活的过滤机制,现在可以通过编写Lua编程语言的自定义过滤器来扩展Fluent Bit的能力。基于Lua的过滤器包括两个步骤:

在主配置中配置过滤器。

准备一个Lua脚本,供过滤器使用。
示例如下:

[FILTER]Name    luaMatch   *script  gbk2utf8.luacall   convert_gbk_to_utf8

插件支持以下配置参数:
在这里插入图片描述

如何在Linux系统中手动生成GBK日志?

使用Linux的iconv命令,可以将接收到的UTF-8编码的中文字符转换为GBK编码,并将转换后的内容追加到指定的文件中。之后,通过fluent-bit工具,可以采集次文件内容。

echo “中文字符” | iconv -f utf8 -t gbk  >>   test.log

验证日志转码的准确性测试

这部分内容测试了 Fluent Bit 使用 Lua 代码来处理日志,将 GBK 编码的文本成功转换为 UTF-8 并正确解析的情况。

测试方案

根据提供的 /var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log 日志文件,进行以下测试:验证 Fluent Bit 1.9.4 和 3.0.2 是否都能够成功使用此脚本,并且都能成功转码。
1、确认 /var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log 文件乱码日志内容

# 查看命令如下
less  /var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log

命令结果截图:
在这里插入图片描述
2、确认文件中有需要日志合并的内容
记录关键字to_number后续使用它查看这条日志是否被合并成功。

[root@cdp-10-191-193-8 fluentbit]# sed -n '24,36p' 20230911_filerate-3105-9c659b484-kfp5j.0.log 
329 2023-09-11 17:03:30 [/data01/heht30/guoc//stl_jsdev/src/load_shm.c:fLoadTBillCycle:401] [INFO]sql is [select 
a.bill_cycle_seq, 
a.bill_period_id, 
to_number(to_char(nvl(a.start_date, add_months(sysdate, 0)), 'yyyymmdd')), 
to_number(to_char(nvl(a.cutoff_date, add_months(sysdate, 240)), 'yyyymmdd')), 
nvl(a.split_table_postfix,-1), 
nvl(b.latn_id,-1), 
to_number(b.status) from t_bill_cycle a, t_usage_bill_cycle b 
where a.bill_cycle_seq = b.bill_cycle_seq and a.province_id = 99 and b.province_id = 99 
order by a.bill_cycle_seq, b.status ]

fluent-bit 3.0.2 转换测试

测试使用配置文件

[SERVICE]Flush 1Parsers_File parsers.confHTTP_Server  OnHTTP_Listen  0.0.0.0HTTP_PORT    3302
[INPUT]Name         tailTag          regex-fluentDB           ./db/regex-fluent.dbRead_from_Head truePath  /var/log/pods/logtest/*.logPath_Key  pod_log_pathmultiline.parser    multiline-regex-new
[FILTER]Name modifyMatch *Add paas_log_belong         userAdd paas_log_type           middlewareAdd paas_collection_type    userfileAdd paas_account_id         123456789Add paas_region_id          lftstAdd paas_product_id         cccAdd paas_instance_name      test10Add paas_host_ip            127.0.0.1Add paas_manager_ip         127.0.0.1Add pod_namespace           defaultAdd pod_name                test-0Add pod_container_name      test 
[FILTER]Name    luaMatch   *script  gbk2utf8.luacall   convert_gbk_to_utf8
[OUTPUT]Name fileMatch *Path /vdata/logtest

核查数据结果

# 检查采集结果命令
less /vdata/logtest/regex-fluent #提前获取中文字符
egrep -n '匹配费率为0,不进行计价|to_number' regex-fluent | head -n 5

以下是采集后的结果被输入到 /vdata/logtest/regex-fluent 文件中。在Linux系统中,通过使用 grep 命令搜索关键字,可以看到文件的第46、47、48行,确认没有出现任何 GBK 格式的乱码。这表明 Fluent Bit 3.0.2 成功地将 GBK 格式转换为 UTF-8。此外,第16和18行的内容也确认了日志被正确合并。

[root@cdp-10-191-193-8 logtest]# egrep -n '匹配费率为0,不进行计价|to_number' regex-fluent | head -n 5
16:regex-fluent: [1720148659.722281097, {"paas_collection_type":"userfile","pod_container_name":"test","paas_account_id":"123456789","paas_region_id":"lftst","paas_product_id":"ccc","paas_host_ip":"127.0.0.1","paas_instance_name":"test10","log":"329 2023-09-11 17:03:30 [/data01/heht30/guoc//stl_jsdev/src/load_shm.c:fLoadTBillCycle:401] [INFO]sql is [select \na.bill_cycle_seq, \na.bill_period_id, \nto_number(to_char(nvl(a.start_date, add_months(sysdate, 0)), 'yyyymmdd')), \nto_number(to_char(nvl(a.cutoff_date, add_months(sysdate, 240)), 'yyyymmdd')), \nnvl(a.split_table_postfix,-1), \nnvl(b.latn_id,-1), \nto_number(b.status) \n from t_bill_cycle a, t_usage_bill_cycle b \nwhere a.bill_cycle_seq = b.bill_cycle_seq \n  and a.province_id = 99 \n  and b.province_id = 99 \norder by a.bill_cycle_seq, b.status ]\n \n","pod_log_path":"/var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log","paas_manager_ip":"127.0.0.1","paas_log_belong":"user","pod_namespace":"default","paas_log_type":"middleware","pod_name":"test-0"}]
18:regex-fluent: [1720148659.722322978, {"paas_collection_type":"userfile","pod_container_name":"test","paas_account_id":"123456789","paas_region_id":"lftst","paas_product_id":"ccc","paas_host_ip":"127.0.0.1","paas_instance_name":"test10","log":"329 2023-09-11 17:03:31 [/data01/heht30/guoc//stl_jsdev/src/load_shm.c:fLoadTCdrCalc:682] [INFO]sql is [select \n nvl(cdr_calc_group_id,-1),\n  NVL(FEE_TYPE, -1),\n  nvl(rate_period_id,-1), \n nvl(holiday_type_id,-1), \n nvl(rate_id,-1),\n nvl(cdr_calc_id,-1),\n to_number(nvl(to_char(active_date,'yyyymmdd'),'19700101')), \n to_number(to_char(nvl(inactive_date,add_months(sysdate,360)),'yyyymmdd'))\n from t_cdr_calc \n order by cdr_calc_group_id,FEE_TYPE \n]\n \n","pod_log_path":"/var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log","paas_manager_ip":"127.0.0.1","paas_log_belong":"user","pod_namespace":"default","paas_log_type":"middleware","pod_name":"test-0"}]
46:regex-fluent: [1720148659.722746975, {"paas_collection_type":"userfile","pod_container_name":"test","paas_account_id":"123456789","paas_region_id":"lftst","paas_product_id":"ccc","paas_host_ip":"127.0.0.1","paas_instance_name":"test10","log":"329 2023-09-11 17:04:53 [/data01/heht30/guoc//stl_jsdev/src/stl_pub.c:CdrRating:761] [INFO]匹配费率为0,不进行计价\n \n","pod_log_path":"/var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log","paas_manager_ip":"127.0.0.1","paas_log_belong":"user","pod_namespace":"default","paas_log_type":"middleware","pod_name":"test-0"}]
47:regex-fluent: [1720148659.722757221, {"paas_collection_type":"userfile","pod_container_name":"test","paas_account_id":"123456789","paas_region_id":"lftst","paas_product_id":"ccc","paas_host_ip":"127.0.0.1","paas_instance_name":"test10","log":"329 2023-09-11 17:04:53 [/data01/heht30/guoc//stl_jsdev/src/stl_pub.c:CdrRating:761] [INFO]匹配费率为0,不进行计价\n \n","pod_log_path":"/var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log","paas_manager_ip":"127.0.0.1","paas_log_belong":"user","pod_namespace":"default","paas_log_type":"middleware","pod_name":"test-0"}]
48:regex-fluent: [1720148659.722766852, {"paas_collection_type":"userfile","pod_container_name":"test","paas_account_id":"123456789","paas_region_id":"lftst","paas_product_id":"ccc","paas_host_ip":"127.0.0.1","paas_instance_name":"test10","log":"329 2023-09-11 17:04:53 [/data01/heht30/guoc//stl_jsdev/src/stl_pub.c:CdrRating:761] [INFO]匹配费率为0,不进行计价\n \n","pod_log_path":"/var/log/pods/logtest/20230911_filerate-3105-9c659b484-kfp5j.0.log","paas_manager_ip":"127.0.0.1","paas_log_belong":"user","pod_namespace":"default","paas_log_type":"middleware","pod_name":"test-0"}]
http://www.xdnf.cn/news/18676.html

相关文章:

  • 使用 Prometheus 监控服务器节点:Node Exporter 详解与配置
  • 实时监测蒸汽疏水阀的工作状态的物联网实时监控平台技术解析
  • 容器学习day02
  • 基于 OpenCV 与 Mediapipe 的二头肌弯举追踪器构建指南:从环境搭建到实时计数的完整实现
  • 力扣498 对角线遍历
  • 4G模块 EC200通过MQTT协议连接到阿里云
  • (LeetCode 每日一题) 498. 对角线遍历 (矩阵、模拟)
  • 撤回git 提交
  • 【龙泽科技】汽车车身测量与校正仿真教学软件【赛欧+SHARK】
  • 什么是共模抑制比?
  • 三坐标如何实现测量稳定性的提升
  • RustFS在金融行业的具体落地案例中,是如何平衡性能与合规性要求的?
  • WRC2025 | 澳鹏亮相2025世界机器人大会,以数据之力赋能具身智能新纪元
  • 大数据毕业设计选题推荐-基于大数据的餐饮服务许可证数据可视化分析系统-Spark-Hadoop-Bigdata
  • LevelDB SSTable模块
  • Consul 在 Windows 上的启动方法
  • 【ACP】2025-最新-疑难题解析-6
  • pytest+requests+Python3.7+yaml+Allure+Jenkins+docker实现接口自动化测试
  • 消息中间件RabbitMQ03:结合WebAPI实现点对点(P2P)推送和发布-订阅推送的Demo
  • 软考中级网络工程师通关指南:从学习到实战
  • 04-Maven工具介绍
  • 从0开始学习Java+AI知识点总结-25.web实战(AOP)
  • KEPServerEX——工业数据采集与通信的标准化平台
  • 服务器(Linux)新账户搭建Pytorch深度学习环境
  • Devops之Jenkins:Jenkins服务器中的slave节点是什么?我们为什么要使用slave节点?如何添加一个windows slave节点?
  • 云计算之中间件与数据库
  • 机器学习:贝叶斯派
  • 2025年金九银十Java面试场景题大全:高频考点+深度解析+实战方案
  • 【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍
  • Linux 进阶之性能调优,文件管理,网络安全