SPL语法

更新时间: 2025-06-18 16:06:44

本文介绍日志服务SPL语言的基本信息,包括工作原理、语法、指令表达式等。

SPL概述

对于读取出的原始数据,日志服务提供SPL语句(SLS Processing Language)做结构化信息提取、字段操作和数据过滤等操作。另外,日志服务还提供多级管道级联功能,第一级管道是索引过滤条件,后面的多级管道是SPL指令,最终输出经过SPL处理后的结果数据。如果您了解SQL语言的使用,您在不同数据处理需求场景中使用日志服务SPL时,可以参考SPL与SQL的使用场景对照

工作原理

日志服务SPL支持在Logtail采集写入处理器基于规则消费数据加工(新版)通过扫描(Scan)模式查询和分析日志等日志服务功能中使用,工作原理如下图:

说明

关于SPL在各个场景中的功能定义,请参见SPL在不同场景的功能定义

SPL-SPL Doc - ch.jpeg

使用限制

类别

限制项

Logtail采集

写入处理器

实时消费

数据加工(新版)

扫描查询

SPL复杂度

脚本管道级数

16级

16级

16级

16级

16级

脚本长度

64KB

64KB

10KB

10KB

64KB

SPL运行时

运行内存大小

重要

处理方案请参见错误处理

50MB

1GB

1GB

1GB

2GB

运行超时

重要

处理方案请参见错误处理

1秒

5秒

5秒

5秒

2秒

SPL语法

SPL语句

SPL语句是多级数据处理语句,通过英文管道符(|)连接,以英文分号(;)作为语句结束符。SPL语法结构如下:

  • 语法

    <data-source> | <spl-expr> | <spl-expr> ;
  • 参数说明

    参数

    说明

    示例

    data-source

    数据源,包括SLS Logstore,以及SPL定义的数据集。在不同场景中的SPL数据源,请参见SPL在不同场景的功能定义

    * | project status, body;

    spl-expr

    SPL数据处理表达式,详情请参见SPL指令表达式

语法符号列表

在使用SPL语法时,以下是语法符号说明。

符号

说明

示例

*

SLS Logstore数据作为SPL输入数据时的占位符。

将访问日志基于状态码进行过滤和分类处理,然后将其输出。

  • SPL语句

    -- SPL处理结果定义为命名数据集src,作为后续SPL表达式的输入
    .let src = * 
    | where status=cast(status as BIGINT);
    
    -- 以命名数据集src作为输入,筛选status字段为5xx的数据,定义数据集err,不输出
    .let err = $src
    | where status >= 500
    | extend msg='ERR';
    
    -- 以命名数据集src作为输入,筛选status字段为2xx的数据,定义数据集ok,不输出
    .let ok = $src
    | where status >= 200 and status < 300
    | extend msg='OK';
    
    -- 输出命名数据集err和ok
    $err;
    $ok;
  • 输入数据

    # 条目1
    status: '200'
    body: 'this is a test'
    
    # 条目2
    status: '500'
    body: 'internal error'
    
    # 条目3
    status: '404'
    body: 'not found'
  • 输出结果

    # 条目1: 数据集为err
    status: '500'
    body: 'internal error'
    msg: 'ERR'
    
    # 条目2: 数据集为ok
    status: '200'
    body: 'this is a test'
    msg: 'OK'

.

作为SPL语句的第一个字符时,表示SPL语法关键字。

|

SPL管道符,用于引出SPL指令表达式,语法格式为| <spl-cmd> ...

;

SPL语句结束标识。单条语句,或多语句中最后一条的结束符可选。

'...'

字符串常量引用符号。

"..."

字段名称、字段名模式引用符号。

--

注释单行内容。

/*...*/

注释多行内容。

$

命名数据集引用符,语法格式为$<dataset-name>

SPL数据类型

SPL日志字段数据类型说明如下表:

类型类别

类型名称

类型说明

基本数值类型

BOOLEAN

布尔类型。

TINYINT

宽度为8位的整数类型。

SMALLINT

宽度为16位的整数类型。

INTEGER

宽度为32位的整数类型。

BIGINT

宽度为64位的整数类型。

HUGEINT

宽度为128位的整数类型。

REAL

宽度为32位可变精度浮点数类型。

DOUBLE

宽度为64位可变精度浮点数类型。

TIMESTAMP

精度为纳秒的UNIX时间戳类型。

DATE

日期数据类型,格式为YYYY-MM-DD。

VARCHAR

可变长度字符数据类型。

VARBINARY

可变长度二进制数据类型。

结构化数值类型

ARRAY

数组类型。元素访问使用[],元素访问下标从1开始。

例如* | extend a = ARRAY[0, 1, 2] | extend b = a[1]

MAP

字典类型,键只能是基本数值类型,值可以是任意类型。元素访问使用[]

例如* | extend a = MAP(ARRAY['foo', 'bar'], ARRAY[0, 1]) | extend b = a['foo']

JSON类型

JSON

JSON类型。

SPL数据处理过程中的数据类型转换说明,请参见通用参考

SPL指令表达式

指令表达式语法

cmd -option=<option> -option ... <expression>, ... as <output>, ...

参数说明

参数

说明

cmd

指令名称。

option

指令执行参数,可选。使用时必须指定参数名,参数名以中划线(-)开头,参数顺序无要求。

支持如下2种参数类别:

  • 键值参数-option=<option>:使用指令时以键值对的形式输入。

  • 开关参数-option:指令定义中默认均为关闭状态,添加该参数即表示打开开关。

expression

指令对数据源执行处理逻辑,必填。使用时,无需指定参数名,但参数顺序必须与指令的定义保持一致。

表达式类别:

  • SPL表达式

    • 字段名及其通配模式表达式,例如content。如果包含[a-zA-Z_]以外的字符,需要使用双引号("")包裹,例如"__tag__:__path__"

    • 字段赋值表达式,直接对字段赋值例如level='INFO',或者将正则表达式的提取结果赋值给字段例如msg=regex_extract(content, '\S+')

  • SQL表达式

    • 数据计算表达式返回值,例如cast(status as int)>=500

output

处理结果中的输出字段。例如| parse-csv content as a, b, c

指令概览

SPL支持如下指令。更多信息,请参见SPL指令

指令类别

指令名称

说明

控制指令

.let

定义命名数据集,SPL数据集详情请参见SPL数据集

字段操作指令

project

保留与给定模式相匹配的字段、同时可重命名指定字段。指令执行过程中,先完成所有字段保留表达式的执行,再执行重命名表达式。

project-away

移除与给定模式相匹配的字段,原样保留其他所有字段。

project-rename

重命名指定字段,并保留其他所有字段原样。

expand-values

展开指定字段的第一层JSON对象,生成多条结果。

结构化数据SQL计算指令

extend

通过SQL表达式计算结果产生新字段。支持的SQL函数列表,请参见SPL支持的SQL函数列表

where

根据SQL表达式过滤数据,保留满足SQL表达式的数据条目。where指令支持的SQL函数列表,请参见SPL支持的SQL函数列表

弱结构化数据提取指令

parse-regexp

提取指定字段中的正则表达式分组匹配信息。

parse-csv

提取指定字段中的CSV格式的信息。

parse-json

提取指定字段中的第一层JSON信息。

parse-kv

提取指定字段中的键值对信息。

数据加工(新版)指令

pack-fields

将日志字段进行打包,以JSON序列化输出到新字段,适用于需要结构化传输的场景(如API请求体构建)。

log-to-metric

将日志格式转化为时序存储的格式。

metric-to-metric

对已有时序数据进一步加工(如添加/修改/删除标签)。

聚合指令

stats

用于统计分析日志的指令,类似 SQL 中的聚合函数(如 COUNTSUMAVG 等)。对日志数据中的特定字段进行统计、分组和聚合操作。

sort

对查询结果进行排序,支持对字段值或统计结果进行升序(asc)或降序(desc)排序。它是日志分析中快速定位关键数据、生成有序报表的重要工具。

limit

用于限制查询结果返回的日志行数,是控制数据量的核心指令之一。通过 limit 可有效防止查询结果过大导致的性能问题或资源浪费,适用于日志分析、实时监控等多种场景。

上一篇: 如何解决查询分析与流处理两种场景下的数据口径差异 下一篇: SPL指令
阿里云首页 日志服务 相关技术圈