Logtail 混合模式:使用插件处理文件日志

作为一个服务百万机器的日志采集 agent,Logtail 目前已经提供了包括日志切分、日志解析(完整正则、JSON、分隔符)、日志过滤在内的常见处理功能,能够应对绝大多数场景的处理需求。但有些时候,由于应用的历史原因或是本身业务日志的复杂性,单一功能可能无法满足所采集日志的处理需求,比如:

  • 日志可能不再是单一格式,有可能同时由 JSON 或者分隔符日志组成。
  • 日志格式可能也不固定,不同的业务逻辑所产生的日志具有不同的字段。
  • ...

为此,Logtail 引入了 混合模式,一方面借助 Logtail 完善的事件机制来保证数据读取阶段的可靠性,另一方面,依赖于插件系统丰富的插件,来加强 Logtail 对复杂日志的处理能力。

Logtail 采集模式划分

从整体来看,Logtail 的采集模式可以划分为以下三种:

  • 纯 Logtail 模式:提供文本日志的采集能力,比如 Nginx 日志、JSON 日志、分隔符日志等。
  • 纯插件模式:作为文本日志采集的补充,提供对更丰富数据源的采集能力,包括 MySQL Binlog、JDBC Query、Syslog 等,同时还提供了一系列的插件来支撑采集后的数据处理。
  • 混合模式:综合上述两者的能力,支持通过插件实现对文本日志的多样处理。

混合模式工作原理

如上图中间部分所示,纯 Logtail 的核心处理部分由日志切分(Splitter)和日志解析(Parser)组成,根据选择的日志采集模式,日志切分把读取的文件内容切割成为一条条日志(比如单行基于换行符、多行基于行首正则),然后交由日志解析从单条日志中提取字段。由此可见,日志的采集模式固定了处理行为,比如完整正则模式要求日志必须完全符合设置的正则表达式,否则会报错。这种基于采集模式的固定行为,拥有更好的性能,但牺牲了灵活性。

相比之下,混合模式则是牺牲一定的性能和计算资源来换取灵活性,以应对更为复杂的场景。如上图所示,在混合模式下,Logtail 会将日志切分的结果直接提交给插件进行处理,在后者中,我们可以组合多种处理插件,来满足我们的需求。

使用及限制说明

  • 混合模式依旧依赖于 Logtail 完成日志切分,所以对于多行日志,依旧需要配置行首正则。
  • 出于性能考虑,Logtail 提交给插件部分的数据并非是单条日志,而是日志的组合,因此插件处理配置的开始需要配置特定插件进行二次切分,具体下文将介绍。
  • 性能开销:视配置而定,混合模式下 Logtail 会消耗更多的资源(主要是 CPU)来完成处理任务,因此需要根据实际情况调整 Logtail 的资源限制。如果采集节点的资源有限,但确实有处理需求,可以仍旧使用纯 Logtail 模式进行采集,之后使用数据加工来实现数据处理。
  • Logtail 的版本需要在 0.16.28 及以上。
  • 一些文本文件的功能在混合模式下无法使用,包括过滤器配置、上传原始日志、机器时区、丢弃解析失败日志、接受部分字段(分隔符模式)等,但其中部分功能可通过相关插件来实现。

插件处理配置语法

插件处理配置使用 JSON 对象进行表示,配置的 key 为 processors,value 是 JSON 对象的数组,数组内的每一个 JSON 对象表示一个处理插件的配置,处理时将按照数组内的定义顺序依次执行。数组内的每个 JSON 对象包含两个字段:type 和 detailtype 表示处理插件的类型(JSON string),detail 表示该插件的详细参数(JSON 对象,key 为参数名,value 为参数值)。

{"processors": [{"type": "processor_regex","detail": {"SourceKey": "content","Regex": "...","Keys": ["time","short_msg","main_msg",]}},{"type": "processor_regex","detail": {"SourceKey": "main_msg","Regex": "...","Keys": [...]}}]
}

如上示例表示使用两个 processor_regex 插件进行日志处理,第一个插件根据配置的 Regex 参数对日志中的 content 字段进行正则提取,结果为 Keys 参数指定的三个字段,而第二个插件对上一步提取得到的 main_msg 字段再次进行正则提取,得到更多的字段。

支持的插件列表

以下是当前所支持的处理插件,关于具体插件如何使用可参考文档处理采集数据。

插件类型(type)功能
processor_add_fields向日志中添加固定的一些字段
processor_rename重命名指定字段名
processor_drop根据字段名丢弃日志中的一些字段
processor_drop_last_key当日志中存在指定的一些字段(名)时,丢弃特定字段,一般用于解析类型的处理插件后,当存在解析后的字段时,表示解析成功,可以丢弃原始字段
processor_filter_key_regex判断字段名是否符合设置的正则表达式,进而决定是否保留该字段
processor_filter_regex判断字段值是否符合设置的正则表达式,进而决定是否保留该字段
processor_geoip对指定字段值(IP)进行地理位置分析,需要自行提供数据库
processor_gotime对指定字段值使用 Go 语言的时间格式进行解析,可将解析结果设置为日志时间
processor_strptime对指定字段值使用 strptime 的时间格式进行解析,可将解析结果设置为日志时间
processor_md5对指定字段值进行 MD5
processor_base64_decoding对指定字段值进行 base64 解码
processor_base64_encoding对指定字段值进行 base64 编码
processor_anchor可以配置 anchor 指定 start/stop 子串,然后对指定字段值进行处理,提取 start/stop 子串之间的内容作为新字段
processor_regex对指定字段值进行正则提取
processor_json对指定字段值进行 JSON 解析,可将结果展开为日志内容
processor_packjson将指定的多个字段以 JSON 对象的格式打包至一个目标字段
processor_split_char对指定字段值进行单字符分隔符(支持设置引用符)解析
processor_split_string对指定的字段值进行多字符分隔符解析
processor_split_key_value对指定的字段值进行键值对解析,如飞天日志
processor_split_log_regex对指定字段值使用行首正则表达式进行切分,结果将分裂为多条日志,一般用于混合模式下对接 Logtail 多行日志
processor_split_log_string对指定字段值使用多字符进行切分,结果将分裂为多条日志,一般用于混合模式下对接 Logtail 单行日志(使用换行符作为分隔)

使用特定插件完成日志的二次切分

前文的说明中曾经提到,出于性能考虑,Logtail 提交给插件部分的数据并非是单条日志,而是日志的组合,需要在插件处理配置的开始增加特定插件进行二次切分。

总的来说,切分时所需要考虑的情况有单行日志和多行日志两种,以下将分别介绍。

注意:此配置仅在混合模式下需要,如果使用的纯自定义插件的采集配置,可以忽略。

单行日志

假设单行日志的内容是 2019-09-23 14:08:16.952 [INFO] hello world,则 Logtail 提交给插件部分的数据内容可能是:

"content": "2019-09-23 14:08:16.952 [INFO] hello world\n2019-09-23 14:08:16.952 [INFO] hello world1\n2019-09-23 14:08:16.952 [INFO] hello world2"

可以看到,多条单行日志被一次性输入到插件处理中,因此,我们需要配置一个针对单行日志的切分插件,即先前列表中最后的 processor_split_log_string。对于单行日志,可以直接复用如下配置:

{"type": "processor_split_log_string","detail": {"SplitKey": "content","SplitSep": "\n"}
}

多行日志

类似地,多行日志在提交给插件部分时也需要使用 processor_split_log_regex 进行基于行首正则的切分,配置如下(假设日志开头为常见的 [] 包裹时间):

{"type": "processor_split_log_regex","detail": {"SplitKey": "content","SplitRegex": "\\[\\d+-\\d+\\d+\\s\\d+:\\d+:\\d+\\].*"}
}

参考此配置时需要根据实际情况调整行首正则表达式(SplitRegex)。

混合模式使用步骤

  1. 根据日志是单行还是多行,确定插件处理配置中需要引入的切分插件及其配置,如果是多行,确认行首正则表达式。
  2. 根据日志的格式组合之前提及的处理插件,完善插件处理配置。
  3. 应用插件处理配置:两种途径,API/SDK 或控制台。

创建混合模式采集配置

从先前的介绍中可以看出,混合模式的采集配置实质上是文本模式的采集配置附加上额外的插件处理配置,因此,配置它的入口依旧是创建文本模式的采集配置:如果是单行日志,创建 极简模式 的采集配置,如果是多行日志,创建 完整正则模式 的采集配置,并切换至多行模式,设置行首正则表达式。

API/SDK

在完成文本模式的采集配置创建后,我们可以通过 API/SDK 的方式添加构建好的插件处理配置。此处,我们借助 CLI 来实现这个过程,代码如下:

# add_plugin_config.py
# -*- coding:utf-8 -*-import commands
import json
import os
import sysif len(sys.argv) != 4:print 'Usage: add_plugin_config.py <your_project_name> <your_config_name> <plugin_config_file>'sys.exit(1)your_project_name = sys.argv[1]
your_config_name = sys.argv[2]
your_plugin_config_file = sys.argv[3]status, output = commands.getstatusoutput('aliyunlog log get_logtail_config --project_name={} --config_name={}'.format(your_project_name, your_config_name))
if status != 0:print '[ERR] can not find specified config, please check your CLI configuration'print 'ErrMsg:', outputsys.exit(1)
config = json.loads(output)
print configplugin = json.load(open(your_plugin_config_file, 'r'))
config["inputDetail"]["plugin"] = plugin
with open('logtail_config.json', 'wb') as f:f.write(json.dumps(config))update_cmd = 'aliyunlog log update_logtail_config --project_name="{}" --config_detail="$(cat logtail_config.json)"'.format(your_project_name)
print update_cmd
print os.system(update_cmd)

确定你需要修改的配置所属的 project_nameconfig_name,把插件处理配置保存到任意文件(比如 plugin_config.json)后,调用脚本传入这三个参数即可。

控制台

在 SLS 控制台上,我们可以通过 高级选项-启用插件处理 来启用混合模式。

在 API/SDK 的方式下,我们需要根据所选模式(JSON、分隔符等)来对二次切分的插件进行配置。而在控制台上使用混合模式时,页面将会根据所选的模式,自动地生成相应的默认配置,我们只需要配置针对单条日志的处理即可。通过 显示/隐藏默认配置,我们可以查看插件配置的完整内容。

以下示例在极简模式下使用 processor_add_fields 插件为每条日志增加两个固定的字段。从两张截图的区别可以发现,页面在默认配置中自动地填充了 processor_split_log_string 来实现按行二次切分。

示例

原始日志

假设我们所采集的是单行文本日志,原始日志内容如下:

"content": "2019-09-23 14:08:16.952 cip>->1.1.1.1_'_sip>->2.2.2.2_'_scheme>->http:POST_'_uri>->/v1/a/b/c_'_rt.all>->21_'_rt.p0>->19_'_\t{\"errcode\":10000,\"errmsg\":\"OK\",\"errdetail\":null,\"data\":{}}"

该日志由 时间多组键值对JSON 对象 三部分组成,分别使用 空格 和 制表符 进行分隔,其中多组键值对部分使用 _'_ 分隔键值对,>-> 分隔键和值。

预期结果

为了方便分析,我们希望将日志的内容提取成如下的字段:

"time": "2019-09-23 14:08:16.952"
"cip": "1.1.1.1"
"sip": "2.2.2.2"
"scheme": "http:POST"
"uri": "/v1/a/b/c"
"rt.all": "21"
"rt.p0": "19"
"errcode": "10000"
"errmsg": "OK"
"errdetail": "null"

插件处理配置

{"processors": [{"type": "processor_split_log_string","detail": {"SplitKey": "content"}},{"type": "processor_regex","detail": {"SourceKey": "content","Regex": "(\\d+-\\d+-\\d+\\s\\d+:\\d+:\\d+\\.\\d+)\\s(.*)_'_\t(.*)","Keys": ["time","main_msg","json_msg"],"NoKeyError": true,"NoMatchError": true,"KeepSource": true}},{"type": "processor_json","detail": {"SourceKey": "json_msg","KeepSource": true    }},{"type": "processor_split_key_value","detail": {"SourceKey": "main_msg","Delimiter": "_'_","Separator": ">->","KeepSource": true}}]
}

如上是我们所创建的混合模式采集配置中的插件处理配置部分,由 4 个处理插件组成:

  • processor_split_log_string:用于完成之前【使用特定插件完成日志的二次切分】提及的日志切分。
  • processor_regex:将日志内容切分为三部分,三个字段分别为 timemain_msgjson_msg
  • processor_json:对上一步提取得到的 json_msg 进行解析,将其中的内容展开为日志字段。
  • processor_split_key_value:对 main_msg 字段进行进一步的解析,将其中的各个键值对展开为日志字段。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯车联发布TAI3.0:三步实现汽车智能进化,2个月快速上车

6月24日&#xff0c;“2020腾讯智慧出行新品发布会”在线上举行&#xff0c;全新升级的TAI3.0生态车联网正式亮相&#xff0c;并在新款哈弗F7上进行了真实驾车场景的功能展示。 据介绍&#xff0c;TAI3.0包含两个车载APP——腾讯随行和腾讯爱趣听&#xff0c;以及一个生态开放…

RuoYi-Cloud 进阶篇_02( Seata 高可用集群与 Nacos 注册中心整合)

文章目录二、安装步骤1. 创建数据库2. 修改配置文件3. 调整数据库驱动4. 修改配置中心二、 启动和验证2.1. 启动nacos2.2. 启动TC Server2.3. 启动第二个节点2.4. 验证高可用二、安装步骤 1. 创建数据库 创建名称为ry_seata的数据库,并初始化ry_seata_20210128.sql脚本 2.…

腾讯TAD Sim2.0领跑自动驾驶仿真市场 双擎驱动构建新一代仿真平台

随着自动驾驶领域硬件、算法等方面的快速发展&#xff0c;虚拟仿真技术在自动驾驶研发和测试领域的应用日渐广泛&#xff0c;成为自动驾驶量产应用的必备工具&#xff0c;城市智慧交通调度管理和相关法规制定的有力辅助。 在这片行业竞争新高地上&#xff0c;腾讯自动驾驶仿真…

RuoYi-Cloud 部署篇_03(windows环境 Oracle + nginx版本)

请参考RuoYi-Cloud 分布式部署_03&#xff08;linux环境 Mysqlnginxredis版本&#xff09;

为了实现在线库的复杂查询,你还在双写吗?

一、在线库不支持在线复杂查询 做在线业务的开发者经常会碰到这样的难题&#xff1a;在线数据库上面运行稍微复杂点的查询&#xff0c;在线业务就挂了&#xff01;不管是单机数据库如MySQL、PG&#xff0c;还是分布式数据库&#xff0c;HBase、MongoDB、Cassandra都有这个问题…

JUC 中断线程的3种方式

文章目录介绍中断方式一中断方式二中断方式三源码解析总结介绍 三个方法&#xff1a; 1、public boolean isInterrupted()判断线程是否被中断&#xff0c;如果此线程已被中断&#xff0c;则为true &#xff1b;否则false 。 2、public void interrupt()中断线程 3、public …

RuoYi-Cloud 进阶篇_04( Seata 高可用集群 AT模式 需求实战)

需求背景&#xff1a; 模拟下单场景&#xff1a;首先去在自己的本地创建一条下单记录&#xff0c;同时&#xff0c;还要去调用库存服务&#xff0c;执行减库存操作。 这里演示一个客户下订单的流程服务来为小伙伴们进一步了解一下分布式事务到底如何使用? 首先&#xff0c;我…

基于Tablestore多元索引打造亿量级店铺搜索系统

一、方案背景 对于一套GEO管理系统&#xff0c;其核心点与瓶颈在于数据库的存储性能与查询能力&#xff1b;一方面&#xff0c;存储服务需要应对海量数据的低延迟存、读&#xff0c;另一方面&#xff0c;存储服务也要提供高效的GEO多维度数据检索。表格存储&#xff08;TableS…

Java中的序列化与反序列化机制

文章目录一、序列化的定义二、为什么需要序列化呢&#xff1f;三、如何序列化四、案列实现4.1、将对象序列化位二进制流4.2 将序列化后的二进制流反序列化为对象五、总结一、序列化的定义 &#x1f4a1; 所谓的序列化就是将Java 中的对象转换成一种流的形式&#xff08;二进制…

今天起,我们喝的百年牛奶要变了!

一天从一杯光明奶开始&#xff0c;是很多小伙伴的日常&#xff1a;牛奶下肚&#xff0c;醇厚、香甜的奶味仍余舌尖。如今&#xff0c;这家百年老字号正在不断焕发新能量。 今天&#xff0c;光明乳业与阿里云达成战略合作。双方将整合优质资源&#xff0c;形成聚合效应&#xf…

Spring 从入门到入土——AOP 就这么简单!| 原力计划

作者| 冢狐责编 | 夕颜出品 | CSDN博客什么是AOP&#xff1f;面向切面编程&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff…

RuoYi-Cloud 进阶篇_03( Seata 高可用集群与 NacosConfig配置中心整合)

文章目录1. 创建文件config.txt2. 创建nacos-config.sh3. 配置导入nacos配置中心4. 配置验证1. 创建文件config.txt 在seata的安装文件夹下创建文件config.txt [rootnode2 ~]# cd /app/seata/seata-server-1.4.2/ [rootnode2 seata-server-1.4.2]# vim config.txt 说明&#…

基于 Tracing 数据的拓扑关系生成原理

背景 随着互联网架构的流行&#xff0c;越来越多的系统开始走向分布式化、微服务化。如何快速发现和定位分布式系统下的各类性能瓶颈成为了摆在开发者面前的难题。借助分布式追踪系统的调用链路还原能力&#xff0c;开发者可以完整地了解一次请求的执行过程和详细信息。但要真…

一条命令导出MySQL表结构xls

文章目录&#x1f331;介绍&#x1f337;一、先尝鲜&#x1f498;二、导出失败的看过来&#x1f412;三、原理&#x1f437;总结&#x1f331;介绍 &#x1f337;一、先尝鲜 &#x1f343;执行下面SQL语句&#xff0c;将会发生神奇的事情&#x1f601; SELECT 字段名称,数据…

揭秘2019双11背后的云网络 – 双11网络架构和洛神系统

图1 天猫双11成交额 2019年天猫双11成交额&#xff0c;2684亿&#xff01;核心系统100%上云&#xff01;全球最大流量洪峰&#xff0c;阿里云扛住了。 狂欢背后的技术栈 网上轻松购物体验实际上是背后复杂的技术组成的&#xff0c;这是一个简化的通用电商系统架构&#xff0…

拿专属内推码!一汽-大众专场直播招聘来了

作者 | 张红月出品 | CSDN遇见OFFER开学即毕业毕业即失业线下宣讲招聘统统被按下了暂停键迷茫&#xff0c;焦虑&#xff0c;惶恐而HR却说&#xff0c;今年招人太难了腾讯总监甚至路边摆摊招聘2020年各大企业纷纷开启线上模式CSDN作为深受开发者喜爱的社区以用户为本特开设遇见O…

vmware workstation 12 打开vm18 不兼容问题解决

由于需要让别人给我发了一下xp系统的虚拟机&#xff0c;可是打开后&#xff0c;却显示&#xff1a;配置文件“”是由VMware产品创建&#xff0c;但该产品与此版VMware workstations 不兼容&#xff0c;因此无法使用。 解决方案&#xff1a; 分析&#xff1a; 出现这种情况主要…

阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

为什么要做这个工具&#xff1f; 由于阿里云上的容器服务 ACK 在使用成本、运维成本、方便性、长期稳定性上大大超过公司自建自维护 Kubernets 集群&#xff0c;有不少公司纷纷想把之前自己维护 Kubernetes 负载迁移到阿里云 ACK 服务上。在迁移过程中&#xff0c;往往会碰到一…

短网址系统设计与实战

&#x1f3a8;领域&#xff1a;Java后端开发&#x1f525;收录专栏&#xff1a; 系统设计与实战 &#x1f412;个人主页&#xff1a;BreezAm &#x1f496;Gitee&#xff1a;https://gitee.com/BreezAm ✨个人标签&#xff1a;【后端】【大数据】【前端】【运维】 文章目录&am…

“我,懂数据,不怕被裁”:这项核心能力到底有多香?

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…