Seq
Seq 是一款专注于结构化应用程序日志和跟踪的实时搜索与分析服务器,能帮助开发人员高效定位问题、剖析系统行为,提供免费和付费版本。关于它的具体安装使用,可参考 官档,本文则将重点介绍其查询语法,助你快速掌握日志分析的核心能力。
基础查询
全文检索(Text)
全文搜索是 Seq 最基本的查询功能,允许你在日志中搜索任意文本。默认情况下,Seq 会将所有字段作为全文索引,你也可以使用 @field:value 语法来指定搜索范围。
例如,要搜索包含 timeout 关键字的日志,你可以使用以下查询:
timeout
上面的查询语句,是以下查询的语法糖(类 SQL 语法):
@Message like '%timeout%'
筛选日志等级
例如,要筛选出所有日志级别为 Error 的日志,你可以使用以下查询:
@Level='error'
其中,各常用日志级别对应的关键字(注意区分大小写):
| 日志级别 | 检索关键字 |
|---|---|
| INFO(LOG) | info |
| WARN | warn |
| ERROR | error |
结构化(JSON)对象属性查询
在生产环境中,应用程序会持续产生海量日志,若仅依赖全文搜索筛选记录,很容易被无关信息干扰 —— 比如搜索 “订单超时” 时,可能同时匹配到普通消息日志、调试日志中的相似文本,导致关键日志被淹没,大幅增加问题定位的时间成本。
而采用结构化日志(通常以 JSON 格式存储)记录信息,能从根源解决这一问题:它会将日志中的关键数据(如订单 ID、用户 ID、接口耗时、错误码等)拆分为独立的字段(例如 orderId、userId、elapsedMs),而非混杂在统一的 Message 文本中。借助 Seq 对结构化对象属性的查询能力,我们可以直接针对这些细分字段精准筛选,快速锁定目标日志,极大提升检索效率。
假设某条结构化日志的 JSON 格式如下(Seq 会自动解析其中的属性为可查询字段):
{
context: {
userId: '2510771',
orderId: 'fe3110df-c486-4cec-8b56-742a3f55f73b',
elapsedMs: 50
}
}
如果要定位用户 2510771 的日志,无需全文搜索,直接通过 userId 字段查询即可:
context.userId='2510771'
函数和操作符
Seq 提供了一些内置的函数和操作符可用来处理单个值。
逻辑运算符
Seq 支持的逻辑运算符有:
| 运算符 | 含义 | 描述 |
|---|---|---|
and | 与 | |
or | 或 | |
not | 非 | 前缀形式,如:not 'keyword' |
例如,要查询用户 2510771 处理耗时大于等于 50ms 的订单日志,你可以使用 AND 操作符组合多个字段:
context.userId = '2510771' AND context.elapsedMs >= 50
在组合使用多个操作符时,为了避免因符号优先级导致的非预期结果,强烈建议使用小括号 ()来明确指定运算顺序。
例如,要查询用户 2510771和 用户 52666 处理耗时大于等于 50ms 的订单日志,你可以使用以下查询:
context.elapsedMs >= 50 and (context.userId = '2510771' or context.userId = '52666')
比较操作符
常用的比较操作符有:
| 操作符 | 含义 |
|---|---|
> >= | 大于、大于等于 |
< <= | 小于、小于等于 |
= | 等于 |
<> | 不等于 |
例如,要查询订单处理耗时大于 50ms 的日志,你可以使用以下查询:
context.elapsedMs > 50
要查询订单 ID 不为 fe3110df-c486-4cec-8b56-742a3f55f73 的日志,你可以使用以下查询:
context.orderId <> 'fe3110df-c486-4cec-8b56-742a3f55f73'
函数
Seq 提供了丰富的内置函数,覆盖日志查询中的匹配筛选与数据聚合场景,能帮我们更高效地处理复杂分析需求。以下列举一些高频实用的函数:
| 函数 | 作用 |
|---|---|
count | 统计日志记录行数 |
distinct | 去重并获得唯一值集合,可配合count函数统计唯一值数量 |
contains | 检索所有包含关键字的日志,支持正则表达式 |
max min | 计算数值表达式或属性名的最小值或最大值 |
ToNumber | 将字符串转换为数值,可以配合操作符使用 |
例如,统计用户 2510771 的订单被处理的次数,你可以使用以下查询:
select count(*) from stream where context.userId='2510771'
获取订单处理的最大耗时值,你可以使用以下查询:
select max(context.elapsedMs) from stream
类 SQL 查询语法
Seq 支持使用类 SQL 语句来检索日志,这一特性极大降低了开发者的学习成本。尤其是对于熟悉 SQL 的用户,无需额外记忆全新语法,就能通过类似 “查询 - 筛选 - 排序 - 聚合” 的逻辑处理日志数据。
例如,获取订单处理耗时最长的一条记录,你可以使用以下的查询:
select context.elapsedMs as elapsedMs, * from stream order by elapsedMs desc limit 1
总结
本文围绕 Seq 日常日志分析场景,梳理了全文搜索、结构化属性查询、多条件组合等核心常用语法,旨在帮助你快速掌握基础查询能力,应对多数常规问题排查需求。
但 Seq 的查询功能远不止于此。如果你需要进一步提升日志分析效率,或应对更复杂的业务场景(如大规模日志聚合、自定义字段计算等),建议访问 Seq 官方查询文档,获取权威、完整的语法说明与示例,解锁更多 Seq 查询的“姿势”。