本文是向大家介绍日志服务的相关概念及功能,查询相关的语法及示例,最后是一些常见问题及解决方案。
一、基本概念及功能特性
什么是日志服务日志服务(Log Service,简称SLS)是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立DT时代海量日志处理能力。
功能特性
日志服务包含以下功能模块,覆盖云原生观测与分析的多种业务场景
1.1 数据采集
日志服务提供50多种数据接入方案。
· 支持采集服务器与应用相关的日志、时序数据和链路数据。
· 支持采集物联网设备日志。
· 支持采集阿里云产品日志。
· 支持采集移动端数据。
· 支持采集Logstash、Flume、Beats、FluentD、Telegraph等开源软件中的数据。
· 支持通过HTTP、HTTPS、Syslog、Kafka、Prometheus等标准协议接入数据。
1.2 查询与分析
日志服务支持实时查询与分析数据。具体说明如下:
· 支持精确查询、模糊查询、全文查询、字段查询。
· 支持上下文查询、日志聚类、LiveTail、重建索引等功能。
· 支持标准的SQL 92语法。
· 提供SQL独享实例。
二、查询语法
2.1 全文查询和字段查询
查询方式 |
说明 |
示例 |
全文查询 |
配置全文索引后,日志服务根据您设置的分词符将整条日志拆分成多个词。您可以指定关键字(字段名、字段值)和查询规则进行查询。 |
PUT and cn-shanghai表示查询同时包含关键字PUT和cn-shanghai的日志。 |
字段查询 |
配置字段索引后,您可以指定字段名称和字段值(Key:Value)进行查询。根据字段索引中设置的数据类型,您可以进行多种类型的基础查询和组合查询。 |
request_time>60 and request_method:Ge*表示查询request_time字段值大于60且request_method字段值以Ge开头的日志。 |
2.2 精确查询和模糊查询
查询方式 |
说明 |
示例 |
精确查询 |
使用完整的词进行查询。 |
host:www.yl.mock.com表示查询host字段值为www.yl.mock.com的日志。 PUT表示查询包含关键字PUT的日志。 |
模糊查询 |
在查询语句中指定一个64个字符以内的词,在词的中间或者末尾加上模糊查询关键字,即星号(*)或问号(?),日志服务会在所有日志中为您查询到符合条件的100个词,返回包含这100个词并满足查询条件的所有日志。指定的词越精确,查询结果越精确。 说明 星号(*)或问号(?)不能用在词的开头。 long数据类型和double数据类型不支持使用星号(*)或问号(?)进行模糊查询。您可以使用数值范围进行模糊查询,例如status in [200 299]。 模糊查询是一种采样查询,查询机制如下所示: 当您开启字段索引,且指定某个字段进行查询时,日志服务从该字段的索引数据中随机采样,返回部分结果并不是全量扫描底层数据。 当您开启全文索引,且没有指定某个字段进行查询时,日志服务从全文索引数据中随机采样,返回部分结果并不是全量扫描底层数据。 |
addr*表示在所有日志中查找以addr开头的100个词,并返回包含这些词的日志。 host:www.yl*表示在所有日志中查找host字段的值以www.yl开头的100个词,并返回包含这些词的日志。 |
2.3 运算符
运算符 |
说明 |
and |
and运算符。例如request_method:GET and status:200。 如果多个关键词之间没有语法关键词,默认为and关系,例如GET 200 cn-shanghai等同于GET and 200 and cn-shanghai。 |
or |
or运算符。例如request_method:GET or status:200。 |
not |
not运算符。例如request_method:GET not status:200、not status:200。 |
( ) |
用于提高括号内查询条件的优先级。例如(request_method:GET or request_method:POST) and status:200。 |
: |
用于字段查询(Key:Value),例如request_method:GET。 如果字段名称或者字段值内有空格、冒号(:)等保留字符,请使用双引号("")包裹字段名称或者字段值,例如"file info":apsara。 |
"" |
使用双引号("")包裹一个语法关键词,可以将该语法关键词转换成普通字符。例如"and"表示查询包含and的日志,此处的and不代表运算符。 在字段查询中双引号("")内的所有词被当成一个整体。 |
\ |
转义符号,用于转义双引号(""),转义后的引号表示符号本身。例如日志内容为instance_id:nginx"01",您可以使用instance_id:nginx\"01\"进行查询。 |
* |
通配符查询,匹配零个、单个、多个字符。例如host:www.yl.mo*k.com。 说明 日志服务会在所有日志中为您查询到符合条件的100个词,返回包含这100个词并满足查询条件的所有日志。 |
? |
通配符查询,匹配单个字符。例如host:www.yl.mo?k.com。 |
> |
查询某字段的值大于某数值的日志。例如request_time>100。 |
>= |
查询某字段的值大于或等于某数值的日志。例如request_time>=100。 |
< |
查询某字段的值小于某数值的日志。例如request_time<100。 |
<= |
查询某字段的值小于或等于某数值的日志。例如request_time<=100。 |
= |
查询某字段的值等于某数值的日志。针对double、long类型的字段,等号(=)和冒号(:)作用相同。例如request_time=100等同于request_time:100。 |
in |
查询某字段的值处于某数值范围内的日志,中括号表示闭区间,小括号表示开区间,两个数字之间使用空格分隔。例如request_time in [100 200]或request_time in (100 200]。 说明 in只能为小写字母。 |
__source__ |
查询某个日志源的日志,支持通配符。例如__source__:192.0.2.*。 注意 日志服务中的__source__为保留字段,可缩写为source。如果您自定义的字段中存在source字段,则会与日志服务保留字段source冲突,此时您需要使用Source、SOURCE等词查询自定义的字段。 |
__tag__ |
通过元数据信息查询日志。例如__tag__:__receive_time__:1609837139。 |
__topic__ |
查询某日志主题下的日志。例如__topic__:nginx_access_log。 |
2.4 查询语句示例
查询需求 |
查询语句 |
查询GET请求成功(状态码为200~299)的日志。 |
request_method:GET andstatusin [200 299] |
查询来自非上海地域的GET请求的日志。 |
request_method:GET notregion:cn-shanghai |
查询GET请求或POST请求的日志。 |
request_method:GET orrequest_method:POST |
查询非GET请求的日志。 |
notrequest_method:GET |
查询GET请求或POST请求成功的日志。 |
(request_method:GET orrequest_method:POST) andstatusin [200 299] |
查询GET请求或POST请求失败的日志。 |
(request_method:GET orrequest_method:POST) notstatusin [200 299] |
查询GET请求成功(状态码为200~299)且请求时间小于60秒的日志。 |
request_method:GET andstatusin [200299] not request_time>=60 |
查询请求时间为60秒的日志。 |
· request_time:60 · request_time=60 |
查询请求时间大于等于60秒,并且小于200秒的日志。 |
· request_time>=60 and request_time<200 · request_timein[60200) |
http_user_agent字段的值中包含Firefox的日志。 |
http_user_agent:Firefox |
http_user_agent字段的值中包含Linux和Chrome的日志。 |
· http_user_agent:"Linux Chrome" · http_user_agent:Linux andhttp_user_agent:Chrome |
包含and的日志。 |
"and" 此处的and为普通字符串,不代表运算符。 |
http_user_agent字段的值中包含Firefox或Chrome的日志。 |
http_user_agent:Firefox orhttp_user_agent:Chrome |
file info字段的值中包含apsara的日志。 |
"file info":apsara |
查询以cn开头的日志。 |
cn* |
查询region字段的值是以cn开头的日志。 |
region:cn* |
查询region字段的值包含cn*的日志。 |
region:"cn*" |
查询region字段的值以hai结尾的所有日志。 |
暂不支持 |
查询以mo开头,以la结尾,中间还有一个字符的日志。 |
mo?1a |
查询以mo开头,以la结尾,中间包含零个、单个或多个字符的日志。 |
mo*1a |
查询包含以Moz开头的词和以Sa开头的词的日志。 |
Moz* and Sa* |
查询https日志主题和http日志主题下的日志。 |
__topic__:https or __topic__:http |
查询采集于192.0.2.1主机的日志。 |
__tag__:__client_ip__:192.0.2.1 __tag__:__client_ip__表示日志所在主机的IP地址。 |
查询remote_user字段的值不为空的日志。 |
not remote_user:"" |
查询remote_user字段的值为空的日志。 |
remote_user:"" |
查询不存在remote_user字段的日志。 |
not remote_user:* |
查询存在remote_user字段的日志。 |
remote_user:* |
查询request_uri字段值为/request/path-2的日志。 |
request_uri:/request/path-2 |
三、常见问题
3.1 SLS只开了只读权限,会弹出错误提示,不影响查询
3.2 标签页数量超出限制,先删除暂时不需要使用的标签页,再打开页面
3.3 未成功采集日志数据如何排查
3.3.1 未成功采集日志数据
如果未成功采集日志数据到日志服务,则无法查询到目标日志。请在预览界面查看是否有日志数据。如果有日志数据,说明日志数据已成功采集到日志服务中,建议您排查其他原因。若没有日志数据,可能是以下原因造成,请进一步排查:
- 日志源没有产生日志数据。
日志源没有日志产生的情况下,日志不可以投递到日志服务。请检查您的日志源。
- Logtail无心跳。
请在机器组状态页面中查看机器是否有心跳。若Logtail无心跳
监控文件没实时写入。
如果监控文件没实时写入,请登录服务器,打开/usr/local/ilogtail/ilogtail.LOG日志文件,查看报错信息。常见错误如下:
-
- parse delimiter log fail:分割符收集日志错误。
- parse regex log fail:正则收集日志错误。
3.3.2 分词设置错误
查看已经设置好的分词符,根据分词符对日志内容进行分割后,是否得到关键字。例如分割符为默认的,;=()[]{}?@&<>/:’,如果日志中有abc”defg,hij会被分割成abc”defg和hij两部分,使用abc搜索不到这条日志。日志服务还支持模糊查询。
说明:
- 为了节约您的索引费用,日志服务进行了索引优化,配置了字段索引的Key,不进行全文索引。例如,日志中有名为message的key,并且配置了字段索引,加了空格做分词(加空格做分词,请把空格加到分词字符串的中间)。message: this is a test message可以使用key:value的格式message:this查询,但是直接查this查询不到,因为配置了字段索引的key,不进行全文索引。
- 创建索引或者对索引做任何更改,只对新进的数据有效,旧数据一律无效。可以查看索引属性,检查已设置的分词是否符合要求。
3.3.3 通过模糊查询日志
通过SQL的like语法进行精确的模糊查询
* | Select * where key like ‘%查询内容%'
通过SQL的正则式函数进行模糊查询
* | select * from log where regexp_like(key, ‘查询内容’ )
3.3.4 其他原因
如果有日志产生,可以先查询修改查询的时间范围。另外由于日志预览的功能数据是实时的,但是查询的功能有1分钟左右的延迟,可以在日志产生后,等待1分钟然后再查询。