简介: 日志上下文浏览是排查业务故障时常用的方式,但受限于Logtail插件系统的设计,在Logtail 1.2.1版本前,如果用户使用Logtail插件来处理日志或采集容器的标准输出,那么用户将无法使用上下文浏览及Livetail功能。为了解决这一问题,本文将重点介绍如何使用日志上下文聚合插件来使能上下文查询和Livetail功能。

背景

在排查业务故障时,用户往往需要查看业务日志文件来定位问题。然而,当用户在使用SLS收集业务日志时,同一个Logstore中往往存放着不同的日志(例如同一台主机上不同目录下的文件,抑或是同一个K8S集群节点上不同容器内的文件或标准输出),直接在控制台上点击“查询/分析”按钮并不能直观地得到某一份日志文件的完整上下文内容。

为了解决这个问题,SLS提供了上下文查询LiveTail功能,使得用户能够快速直观地浏览同一日志文件中的内容:

  • 上下文查询:用户可在指定Logstore中的某条日志后,直接查询某条该条日志的上下文(即该条日志在所在文件中的前后若干条日志);
  • Livetail:实时展示指定日志所在文件的最新日志,类似于对该文件执行tail -f。

然而,在Logtail 1.2.1版本之前,上述两个功能仅针对使用固定解析模式解析日志的场景(如极简模式、完整正则模式等),当额外使用Logtail插件来提升日志解析能力或采集容器的标准输出时,上述两个功能就不再起效。从Logtail 1.2.1版本起,当用户使用Logtail插件来处理日志或采集容器的标准输出时,可以通过配置日志上下文聚合插件来使用上述两个功能。

原理概览

Logtail采用批量发送日志数据的模式,即多条日志会被打包在同一个日志组中进行传送。在这种模式下,为了高效地获取某条日志的上下文或进行Livetail,Logtail在打包日志数据时采用以下策略:

  • 同一个日志组中只存放同一来源的日志,并在日志组的Meta信息中记录代表日志来源的唯一标识符及序号,组内日志按时间顺序排列;
  • 对于存放同一来源日志的日志组,日志组的序号按时间先后顺序依次递增。

在这种模式下,每一条日志都可用(日志组标识符+序号,组内序号)的二元组合进行唯一标识,SLS服务端据此对该二元组合建立索引,从而实现日志上下文的快速查找。

然而,受限于Logtail插件系统的设计,在1.2.1版本前,当用户使用插件系统处理数据或采集容器的标准输出时,Logtail无法执行上述策略。具体来说,由于插件系统的输入模块是以一条条日志的形式向后续模块传递信息,因此日志的来源信息从离开输入模块后便出现缺失,从而导致无法在日志打包阶段(即聚合模块)将同一来源的日志放入同一个日志组中,最终导致日志上下文查询及Livetail功能的失效。

为了解决上述问题,Logtail在现有各模块之间的数据交互上额外增加日志来源信息,同时新增了一个日志上下文聚合插件。由于日志的来源信息得以保留,该插件因此可以依照上文提到的日志打包策略对日志进行打包,从而实现日志的上下文查询及LiveTail。

采集配置设置

下面将介绍当用户使用Logtail插件来处理日志或采集容器的标准输出时,如何设置采集配置以使用上下文查询和Livetail功能。

采集文本日志且使用Logtail插件处理日志

在采集文本日志时,如果使用Logtail插件来解析日志,则需要在插件配置的中额外增加日志上下文插件aggregator_context:

{
"global": {...},
"processors": [...],
"aggregators": [
{
"type": "aggregator_context",
"detail": {}
}
]
}
  • 示例:使用Logtail插件解析单行正则日志,则在控制台的插件配置框内填入以下内容:
{
"global": {
"DefaultLogQueueSize": 10
},
"processors": [
{
"type": "processor_split_log_string",
"detail": {
"SplitKey": "content",
"PreserveOthers": true
}
},
{
"type": "processor_regex",
"detail": {
"SourceKey": "content",
"Regex": "(\\S+)\\s-\\s(\\S+)",
"Keys": [
"remote_addr",
"remote_user"
]
}
}
],
"aggregators": [
{
"type": "aggregator_context",
"detail": {}
}
]
}

采集容器标准输出

当用户在采集容器标准输出时,也需要在插件配置的中额外增加日志上下文插件aggregator_context:

{
"inputs": [
{
"detail": {
"Stdout": true,
"Stderr": true
},
"type": "service_docker_stdout"
}
],
"aggregators": [
{
"type": "aggregator_context",
"detail": {}
}
]
}

功能使用

上下文查询

对于选定的日志,在该日志的左上角单击图标进入上下文查询页面:

此时可以使用鼠标在当前页面上下滚动查看指定日志的上下文信息。界面中的按钮功能如下:

  • 单击更早,进行向上翻页浏览。
  • 单击更新,进行向下翻页浏览。
  • 在高亮显示文本框中设置需要高亮显示的字符串,可实现字符串标红显示。
  • 在过滤条件文本框中设置过滤字符串,可实现日志列表中只显示包含过滤字符串的日志。
  • 字段过滤下拉菜单中可选择需要展示的字段。

Livetail

对于选定的日志,在该日志的左上角单击图标进入Livetail页面:

此时该条日志所在文件的最新的日志数据将实时显示在页面底部。界面中的按钮功能如下:

  • 在高亮显示文本框中设置需要高亮显示的字符串,可实现字符串标红显示。
  • 在过滤条件文本框中设置过滤字符串,可实现日志列表中只显示包含过滤字符串的日志。
  • 字段过滤下拉菜单中可选择需要展示的字段。

关于iLogtail

iLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。

GitHub:https://github.com/alibaba/ilogtail

社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme

企业版官网:https://help.aliyun.com/document_detail/65018.html

本文为阿里云原创内容,未经允许不得转载。

使用日志上下文聚合插件使能上下文查询及Livetail的更多相关文章

  1. 【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」

    日志追踪 日志追踪对于功能问题的排查和数据流转的路径分析时非常重要的,有了全链路日志追踪体系机制可以非常有效且快速的定位问题,但在多线程环境中,若没有相关成熟的框架的支持,想要实现日志追踪,就需要手动 ...

  2. .NET:线程本地存储、调用上下文、逻辑调用上下文

    .NET:线程本地存储.调用上下文.逻辑调用上下文 目录 背景线程本地存储调用上下文逻辑调用上下文备注 背景返回目录 在多线程环境,如果需要将实例的生命周期控制在某个操作的执行期间,该如何设计?经典的 ...

  3. 利用kibana插件对Elasticsearch查询

    利用kibana插件对Elasticsearch查询 Elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据. 查询分类: 基本查询:使用Elasticsear ...

  4. MySQL 笔记整理(2) --日志系统,一条SQL查询语句如何执行

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 2) --日志系统,一条SQL查询语句如何执行 MySQL可以恢复到半个月内任意一秒的状态,它的实现和日志系统有关.上一篇中记录了一 ...

  5. CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒

    问题: CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Wind ...

  6. flask上下文全局变量,程序上下文、请求上下文、上下文钩子

    Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...

  7. python-day71--django多表双下划线查询及分组聚合及F/Q查询

    #====================================双下划线的跨表查询===============# 前提 此时 related_name=bookList 属性查询: # 查 ...

  8. springboot结合mybatis使用pageHelper插件进行分页查询

    1.pom相关依赖引入 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...

  9. 1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This

    参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p ...

  10. 自定义Mybatis-plus插件(限制最大查询数量)

    自定义Mybatis-plus插件(限制最大查询数量) 需求背景 ​ 一次查询如果结果返回太多(1万或更多),往往会导致系统性能下降,有时更会内存不足,影响系统稳定性,故需要做限制. 解决思路 1.经 ...

随机推荐

  1. 基于Python的子进程获取键盘输入

    一 概念 众所周知,python中的获取键盘输入,input函数是没办法用在子程序的,这就限制了它的用途.想要在子程序中获取键盘输入.唯有 fn=sys.stdin.fileno函数了. 二 实例解析 ...

  2. day01-2-导入驱动和工具类

    满汉楼01-2 4.功能实现01 4.1导入驱动和工具类 4.1.1导入驱动 首先将连接mysql的相关jar包引入项目中,分别右键,点击add as library 4.1.2导入工具类Utilit ...

  3. 逆向通达信Level-2 续五 (调试窗口层次结构)

    演示 hierarchy, checkCWnd命令. 窗口层次结构向上追溯寻根.自动识别是否为CWnd对象,并且自动搜索对象指针. 窗口层次结构内容包括: 1.窗口类名 2.窗口实现所在模块 3.窗口 ...

  4. 记录--通过Promise实现分批处理接口请求

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 如何通过 Promise 实现百条接口请求? 实际项目中遇到需要批量发起上百条接口请求怎么办? 最新案例代码在此!点击看看 前言 不知你项 ...

  5. 神经网络——基于sklearn的参数介绍及应用

    一.MLPClassifier&MLPRegressor参数和方法 参数说明(分类和回归参数一致): hidden_layer_sizes :例如hidden_layer_sizes=(50, ...

  6. Oracle 视图创建自增ID

    select ROW_NUMBER() over (order by sysdate()) as id

  7. KingbaseES V8R3集群运维案例---failover切换故障分析

    案例说明: KingbaseES V8R3集群主库数据库服务重启后,failover切换失败,分析failover失败的具体原因. 适用版本: KingbaseES V8R3 一.集群架构 node1 ...

  8. KingbaseES数据库运维案例之---permission denied to create "sys_catalog.xxx"

    ​ KingbaseES数据库运维案例之---permission denied to create "sys_catalog.bdsj_bdgl_test" 案例说明: 在Kin ...

  9. KingbaseES V8R6数据库运维案例之---索引坏块故障处理

    案例说明: 在执行表数据查询时,出现下图所示错误,索引故障导致表无法访问,后重建索引问题解决.本案例复现了此类故障解决过程. 适用版本: KingbaseES V8R3/R6 一.创建测试环境 # 表 ...

  10. kafka主题、消费者、生产者命令行操作

    十二.Kafka (1)Topic 1)查看当前服务器中的所有topic bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --list 2) ...