Seq

183 阅读5分钟

Seq

Seq 是一款专注于结构化应用程序日志和跟踪的实时搜索与分析服务器,能帮助开发人员高效定位问题、剖析系统行为,提供免费和付费版本。关于它的具体安装使用,可参考 官档,本文则将重点介绍其查询语法,助你快速掌握日志分析的核心能力。

基础查询

全文检索(Text)

全文搜索是 Seq 最基本的查询功能,允许你在日志中搜索任意文本。默认情况下,Seq 会将所有字段作为全文索引,你也可以使用 @field:value 语法来指定搜索范围。

例如,要搜索包含 timeout 关键字的日志,你可以使用以下查询:

timeout

image.png

上面的查询语句,是以下查询的语法糖(类 SQL 语法):

@Message like '%timeout%'

image.png

筛选日志等级

例如,要筛选出所有日志级别为 Error 的日志,你可以使用以下查询:

@Level='error'

其中,各常用日志级别对应的关键字(注意区分大小写):

日志级别检索关键字
INFO(LOG)info
WARNwarn
ERRORerror

结构化(JSON)对象属性查询

在生产环境中,应用程序会持续产生海量日志,若仅依赖全文搜索筛选记录,很容易被无关信息干扰 —— 比如搜索 “订单超时” 时,可能同时匹配到普通消息日志、调试日志中的相似文本,导致关键日志被淹没,大幅增加问题定位的时间成本。

采用结构化日志(通常以 JSON 格式存储)记录信息,能从根源解决这一问题:它会将日志中的关键数据(如订单 ID、用户 ID、接口耗时、错误码等)拆分为独立的字段(例如 orderIduserIdelapsedMs),而非混杂在统一的 Message 文本中。借助 Seq 对结构化对象属性的查询能力,我们可以直接针对这些细分字段精准筛选,快速锁定目标日志,极大提升检索效率。

假设某条结构化日志的 JSON 格式如下(Seq 会自动解析其中的属性为可查询字段):

{
    context: {
        userId: '2510771',
        orderId: 'fe3110df-c486-4cec-8b56-742a3f55f73b',
        elapsedMs: 50
    }
}

如果要定位用户 2510771 的日志,无需全文搜索,直接通过 userId 字段查询即可:

context.userId='2510771'

image.png

函数和操作符

Seq 提供了一些内置的函数和操作符可用来处理单个值。

逻辑运算符

Seq 支持的逻辑运算符有:

运算符含义描述
and
or
not前缀形式,如:not 'keyword'

例如,要查询用户 2510771 处理耗时大于等于 50ms 的订单日志,你可以使用 AND 操作符组合多个字段:

context.userId = '2510771' AND context.elapsedMs >= 50

image.png

在组合使用多个操作符时,为了避免因符号优先级导致的非预期结果,强烈建议使用小括号 ()来明确指定运算顺序。

例如,要查询用户 2510771和 用户 52666 处理耗时大于等于 50ms 的订单日志,你可以使用以下查询:

context.elapsedMs >= 50 and (context.userId = '2510771' or context.userId = '52666')

image.png

比较操作符

常用的比较操作符有:

操作符含义
> >=大于、大于等于
< <=小于、小于等于
=等于
<>不等于

例如,要查询订单处理耗时大于 50ms 的日志,你可以使用以下查询:

context.elapsedMs > 50

image.png

要查询订单 ID 不为 fe3110df-c486-4cec-8b56-742a3f55f73 的日志,你可以使用以下查询:

context.orderId <> 'fe3110df-c486-4cec-8b56-742a3f55f73'

image.png

函数

Seq 提供了丰富的内置函数,覆盖日志查询中的匹配筛选与数据聚合场景,能帮我们更高效地处理复杂分析需求。以下列举一些高频实用的函数:

函数作用
count统计日志记录行数
distinct去重并获得唯一值集合,可配合count函数统计唯一值数量
contains检索所有包含关键字的日志,支持正则表达式
max min计算数值表达式或属性名的最小值或最大值
ToNumber将字符串转换为数值,可以配合操作符使用

例如,统计用户 2510771 的订单被处理的次数,你可以使用以下查询:

select count(*) from stream where context.userId='2510771'

image.png

获取订单处理的最大耗时值,你可以使用以下查询:

select max(context.elapsedMs) from stream

image.png

类 SQL 查询语法

Seq 支持使用类 SQL 语句来检索日志,这一特性极大降低了开发者的学习成本。尤其是对于熟悉 SQL 的用户,无需额外记忆全新语法,就能通过类似 “查询 - 筛选 - 排序 - 聚合” 的逻辑处理日志数据。

例如,获取订单处理耗时最长的一条记录,你可以使用以下的查询:

select context.elapsedMs as elapsedMs, * from stream order by elapsedMs desc limit 1

image.png

总结

本文围绕 Seq 日常日志分析场景,梳理了全文搜索、结构化属性查询、多条件组合等核心常用语法,旨在帮助你快速掌握基础查询能力,应对多数常规问题排查需求。

Seq 的查询功能远不止于此。如果你需要进一步提升日志分析效率,或应对更复杂的业务场景(如大规模日志聚合、自定义字段计算等),建议访问 Seq 官方查询文档,获取权威、完整的语法说明与示例,解锁更多 Seq 查询的“姿势”。