|
分割,只需要检索日志,不需要统计分析时,可省略其中的管道符|
及 SQL 语句。[检索条件] | [SQL 语句]
status:404
检索响应状态码为404的应用请求日志。检索条件为空或*
时代表无检索条件,即所有日志。status:404 | select count(*) as logCounts
统计响应状态码为404的日志数量。SQL 语句符合 SQL-92规范,语法规则详见 SQL 语句语法规则。error
检索所有出现过 error 的日志。level:error
检索日志级别(level)为 error 的日志。error
检索不到errorMessage
,因为errorMessage
本身是一个单独的词,不等于error
,需使用通配符error*
才能检索该日志。关于分词的更多说明及示例详见 分词与索引。语法 | 说明 |
AND | “与”逻辑操作符,例如 level:ERROR AND pid:1234 |
OR | “或”逻辑操作符,例如 level:ERROR OR level:WARNING |
NOT | “非”逻辑操作符,例如 level:ERROR NOT pid:1234 |
() | 分组操作符,控制逻辑运算优先级,例如 (ERROR OR WARNING) AND pid:1234 |
: | 冒号,表示作用于的 key 字段,即键值检索,例如 level:ERROR |
"" | 双引号,引用一个短语,日志需包含短语内的各个词,且各个词的顺序保持不变,例如 name:"john Smith" |
* | 通配符查询,匹配零个、单个、多个字符,例如 host:www.test*.com 还可以通过 key:* 的方式查询字段(key)存在的日志,等价于 _exists_:key |
? | 通配符查询,匹配单个字符,例如 host:www.te?t.com 与 * 类似,不支持前缀模糊查询 |
> | 范围操作符,表示大于某个数值,例如 status:>400 |
>= | 范围操作符,表示大于等于某个数值,例如 status:>=400 |
< | 范围操作符,表示小于某个数值,例如 status:<400 |
<= | 范围操作符,表示小于等于某个数值,例如 status:<=400 |
TO | “范围”逻辑操作符,例如 request_time:[0.1 TO 1.0] |
[] | 范围操作符,包含边界值的范围,例如 age:[20 TO 30] |
{} | 范围操作符,不包含边界值的范围,例如 age:{20 TO 30} |
\\ | 转义符号,转义后的字符表示符号本身,例如 url:\\/images\\/favicon.ico 如不想使用转义符,可使用 "" 包裹,例如url:"/images/favicon.ico" ,但需注意,双引号内的词会被当作一个短语,日志需包含短语内的各个词,且各个词的顺序保持不变 |
_exists_ | _exists_:key,返回 key 存在的日志,例如 _exists_:userAgent 表示搜索存在 userAgent 字段的日志 |
warning error
等价于 warning OR error
。()
对检索条件进行分组,以明确逻辑优先级,例如(ERROR OR WARNING) AND pid:1234
。场景 | 语句 |
检索来源为某台机器的日志 | __SOURCE__:127.0.0.1 或 __SOURCE__:192.168.0.* |
检索来源为某个文件的日志 | __FILENAME__:"/var/log/access.log" 或__FILENAME__:\\/var\\/log\\/*.log |
检索包含 ERROR 的日志 | ERROR |
检索失败的日志(状态码大于400) | status:>400 |
检索 GET 请求中失败(状态码大于400)的日志 | method:GET AND status:>400 |
检索 ERROR 或 WARNING 级别的日志 | level:ERROR OR level:WARNING |
检索非 INFO 级别 的日志 | NOT level:INFO |
检索 192.168.10.10 主机上非 INFO 级别的日志 | __SOURCE__:192.168.10.10 NOT level:INFO |
检索 192.168.10.10 主机上/var/log/access.log 文件中不包含 INFO 级别的日志 | (__SOURCE__:192.168.10.10 AND __FILENAME__:"/var/log/access.log") NOT level:INFO |
检索 192.168.10.10 主机上 ERROR 或 WARNING 级别的日志 | __SOURCE__:192.168.10.10 AND (level:ERROR OR level:WARNING) |
检索 4XX 状态码的日志 | status:[400 TO 500} |
检索元数据中容器名为 nginx 的日志 | __TAG__.container_name:nginx |
检索元数据中容器名为 nginx ,且请求延时大于1s 的日志 | __TAG__.container_name:nginx AND request_time:>1 |
检索包含 message 字段的日志 | message:* 或 _exists_:message |
检索不包含 message 字段的日志 | NOT _exists_:message |
*
匹配零个、单个、多个字符,或?
匹配单个字符,例如:IP:192.168.1.*
可检索到192.168.1.1
、192.168.1.34
等。host:www.te*t.com
可检索到 www.test.com
、www.telt.com
等。*
或?
不能用在词的开头,即不支持前缀模糊检索。*
或?
进行模糊检索,可以使用数值范围进行检索,例如 status:[400 TO 500}
。host:www.test.com
、host:m.test.com
,需要查询字段中间包含 test 的日志,可为该字段添加分词符.
,便可以直接使用 host:test
对日志进行检索。* | select * where host like '%test%'
,但这种方式相比检索条件性能较差,不适合日志数据量过大的场景。语法 | 说明 |
key:value | 键值检索,查询字段(key)的值中包含 value 的日志,例如: level:ERROR |
value | 全文检索,查询日志全文中包含 value的 日志,例如: ERROR |
AND | “与”逻辑操作符,不区分大小写,例如: level:ERROR AND pid:1234 |
OR | “或”逻辑操作符,不区分大小写,例如: level:ERROR OR level:WARNING |
NOT | “非”逻辑操作符,不区分大小写,例如: level:ERROR NOT pid:1234 |
() | 逻辑分组操作符,控制逻辑运算优先级,例如: level:(ERROR OR WARNING) AND pid:1234 |
" " | 短语检索中不存在逻辑操作符,其等同于查询字符本身,例如: name:"and" |
' ' | |
* | |
> | 范围操作符,表示大于某个数值,例如: status>400 或 status:>400 |
>= | 范围操作符,表示大于等于某个数值,例如: status>=400 或status:>=400 |
< | 范围操作符,表示小于某个数值,例如: status<400 或status:<400 |
<= | 范围操作符,表示小于等于某个数值,例如: status<=400 或status:<=400 |
= | 范围操作符,表示等于某个数值,例如: status=400 ,等价于status:400 |
\\ | 转义符号,转义后的字符表示符号本身。当被检索的值包含空格、 : 、" 、' 、* 时,需进行转义,例如:body:user_name\\:bob 使用双引号进行短语检索时,仅需转义 " 及* ;使用单引号进行短语检索时,仅需转义' 及* 未转义的 * 代表模糊检索 |
key:* | text 类型字段:查询字段(key)存在的日志,无论值是否为空,例如: url:* long/double 类型字段:查询字段(key)存在,且值不为空的日志,例如: response_time:* |
key:"" | text 类型字段:查询字段(key)存在且值为空的日志,值仅包含分词符时也等价为空,例如: url:"" long/double 类型字段:查询字段(key)不存在,或值为空的日志,等价于 NOT key:* |
场景 | 语句 |
检索来源为某台机器的日志 | __SOURCE__:127.0.0.1 或 __SOURCE__:192.168.0.* |
检索来源为某个文件的日志 | __FILENAME__:"/var/log/access.log" |
检索包含 ERROR 的日志 | ERROR |
检索失败的日志(状态码大于400) | status>400 |
检索 GET 请求中失败(状态码大于400)的日志 | method:GET AND status>400 |
检索 ERROR 或 WARNING 级别的日志 | level:(ERROR OR WARNING) |
检索非 INFO 级别 的日志 | NOT level:INFO |
name:"john Smith"
、filepath:"/var/log/access.log"
。与不使用引号包裹的检索相比,短语检索表示日志需在包含字符串内各个词的同时,词之间的顺序也与检索条件严格一致。/
:#1 filepath:"/var/log/access.log"#2 filepath:"/log/var/access.log"
filepath:/var/log/access.log
进行检索时会同时检索到上述两条日志,因为非短语检索不要求词之间的顺序。filepath:"/var/log/access.log"
进行检索时仅会检索到第一条日志。filepath:"/var/log/acc*.log"
,但不支持在词的开头使用通配符,例如filepath:"/var/log/*cess.log"
。*
匹配零个、单个、多个字符,例如:IP:192.168.1.*
可检索到192.168.1.1
、192.168.1.34
等。host:www.te*t.com
可检索到 www.test.com
、www.telt.com
等。*
不能用在词的开头,即不支持前缀模糊检索。*
进行模糊检索,可以使用数值范围进行检索,例如:status>400 and status<500
。host:www.test.com
、host:m.test.com
,需要查询字段中间包含 test 的日志,可为该字段添加分词符.
,便可以直接使用 host:test
对日志进行检索。* | select * where host like '%test%'
,但这种方式相比检索条件性能较差,不适合日志数据量过大的场景。filepath:"/var/log/acc*.log"
,但同样不支持在词的开头使用通配符,例如filepath:"/var/log/*cess.log"
。且短语检索中的通配符仅能匹配到符合条件的128个词,返回包含这128个词的所有日志,指定的词越精确,查询结果越精确,非短语检索无该限制。功能 | Lucene | CQL |
逻辑操作符 | 仅支持大写,例如 AND NOT OR | 同时支持大小写,例如 AND and NOT not OR or |
特殊符号转义 | 存在较多特殊符号需进行转义,例如检索 /book/user/login/ 需转义为\\/book\\/user\\/login\\/ | 需转义的特殊符号较少,可直接检索 /book/user/login/ |
关键词检索 | 关键词包含分词时,分词间的关系为或,例如分词符为 / 时,检索 /book/user/login/ 等价于 book OR user OR login ,会检索到很多不相关的日志 | 关键词包含分词时,分词间的关系为与,例如分词符为 / 时,检索 /book/user/login/ 等价于 book AND user AND login ,符合检索习惯 |
短语检索 | 检索短语时,不支持使用通配符,例如 "/book/user/log*/" 检索不到/book/user/login/ 及/book/user/logout/ | 检索短语时,支持使用通配符,例如 "/book/user/log*/" 可以检索到/book/user/login/ 及/book/user/logout/ |
正则检索 | 支持使用正则表达式对关键词进行检索 | 不支持正则表达式 |
数值范围检索 | 支持 timeCost:[20 TO 30] 形式的语法 | 不支持 timeCost:[20 TO 30] 形式的语法,需使用timeCost>=20 AND timeCost<=30 |
语法 | 说明 |
用于从表中选取数据,默认从当前日志主题中获取符合检索条件的数据,例如`level:ERROR | |
为列名称(KEY)指定别名,例如`level:ERROR | |
用于结合聚合函数,根据一个或多个列(KEY)对结果集进行分组,例如 `level:* | |
用于根据指定的 KEY 对结果集进行排序,例如 `level:* | |
用于限制由 SELECT 语句返回的数据数量,例如 `level:* | |
用于对查询到的原始数据进行过滤,例如`level:ERROR | |
用于对分组聚合后的数据进行过滤,与WHERE的区别在于其作用于分组(GROUP BY)之后,排序(ORDER BY)之前,而WHERE作用于聚合前的原始数据,例如`level:* | |
针对一些复杂的统计分析场景,需要先对原始数据进行一次统计分析,再针对该分析结果进行二次统计分析,这时候需要在一个 SELECT 语句中嵌套另一个 SELECT 语句,这种查询方式称为嵌套子查询。例如`* |
select
。''
包裹,无符号包裹或被双引号""
包裹的字符表示字段或列名。例如'status'
表示字符串 status,status
或"status"
表示日志字段 status。'
时,需使用''
(两个单引号)代表单引号本身。例如'{''version'': ''1.0''}'
表示原始字符串{'version': '1.0'}。字符串内本身包含双引号"
时无需特殊处理。语法 | 说明 |
支持字符串连接、分割、长度计算和大小写转换等。 | |
支持时间格式转换、按时间分组统计和时间间隔计算等。 | |
支持从 IP 解析地理信息等。 | |
支持从 URL 获取域名、参数和编解码等。 | |
支持统计日志条数、数值最大值、最小值和平均值等。 | |
支持统计唯一值个数、数值 P95/P90 分位值等。 | |
支持转换变量类型,常用于对参数的变量类型有特殊要求的函数内。 | |
AND、OR 和 NOT 等逻辑运算。 | |
+、-、*、/等算术运算和>、<等比较运算。 | |
CASE WHEN、IF 等条件判断 。 | |
获取数组元素等。 | |
对比当前时间周期内的计算结果与 n 秒之前时间周期内的计算结果。 | |
获取 JSON 对象、JSON 类型转换等。 |
场景 | 语句 |
统计 GET 请求中失败(状态码大于400)的日志条数 | `method:GET AND status:>400 |
按分钟统计 GET 请求中失败(状态码大于400)的日志条数 | `method:GET AND status:>400 |
统计请求数量最大的5个 URL | `* |
统计平均响应耗时大于1000ms的 URL,并按耗时倒排 | `* |
统计失败请求百分比 | `* |
统计每个 URL 失败请求百分比,并按占比倒排 | `* |
统计每个省份的请求数量 | `* |
指标 | 限制说明 | 备注 |
SQL 结果条数 | SQL 返回结果条数最大10000条 | |
内存占用量 | 每次 SQL 执行占用的服务端内存不能超过3GB | 通常在使用 group by、distinct()、count(distinct()) 时可能触发该限制,是由于被统计的字段在通过 group by 或 distinct() 去重后值过多导致的。建议优化查询语句,使用值更少的字段对数据进行分组统计;或使用 approx_distinct() 替代count(distinct())。 |
本页内容是否解决了您的问题?