Grafana Loki中的LogQL模板函数详解
概述
Grafana Loki是一个水平可扩展、高可用性的多租户日志聚合系统,其查询语言LogQL基于PromQL设计。在LogQL中,我们可以使用Go模板语言来格式化日志行和标签,这为日志处理提供了极大的灵活性。本文将全面介绍Loki中可用的模板函数,帮助开发者更好地处理和转换日志数据。
模板基础语法
在LogQL中,模板主要用于| line_format和| label_format阶段,采用Go的text/template语法。模板语法支持管道(pipeline)操作,可以将多个函数串联起来:
`{{ .path | replace " " "_" | trunc 5 | upper }}`
上述示例中,我们先获取path标签的值,然后替换空格为下划线,截取前5个字符,最后转换为大写。
内置变量
Loki模板提供了几个特殊的内置变量来访问日志属性:
-
标签变量:所有标签都可以通过
.label_name形式访问`{{ .path }}` // 输出path标签的值 -
日志行变量:
__line__:返回原始日志行__timestamp__:返回日志时间戳
日期时间处理函数
Loki提供了一系列强大的日期时间处理函数:
-
date:格式化时间
`{{ date "2006-01-02" now }}` // 输出当前日期 -
unixEpoch系列:获取时间戳
`{{ unixEpoch now }}` // 当前秒级时间戳 `{{ unixEpochMillis now }}` // 毫秒级 `{{ unixEpochNanos now }}` // 纳秒级 -
toDate/toDateInZone:解析时间字符串
`{{ toDateInZone "2006-01-02" "UTC" "2021-11-02" }}`
字符串处理函数
Loki提供了丰富的字符串处理能力:
-
大小写转换:
`{{ lower "HELLO" }}` // → "hello" `{{ upper "hello" }}` // → "HELLO" `{{ title "hello world" }}` // → "Hello World" -
截取与对齐:
`{{ trunc 5 "hello world" }}` // → "hello" `{{ alignLeft 5 "hi" }}` // → "hi " `{{ alignRight 5 "hi" }}` // → " hi" -
替换与清理:
`{{ replace "hello" "world" "hello world" }}` // → "world world" `{{ trim " hello " }}` // → "hello" `{{ trimAll "$" "$5.00" }}` // → "5.00" -
编码解码:
`{{ "hello world" | urlencode }}` // → "hello+world" `{{ "aGVsbG8=" | b64dec }}` // → "hello"
逻辑判断函数
在模板中可以进行条件判断:
-
包含判断:
`{{ if contains "Err" .err }}错误{{end}}` -
前缀/后缀判断:
`{{ if hasPrefix "http://" .url }}HTTP{{end}}` `{{ if hasSuffix ".jpg" .path }}图片{{end}}` -
等于判断:
`{{ if eq .status "200" }}成功{{end}}`
数学运算函数
Loki模板支持多种数学运算:
-
基本运算:
`{{ add 1 2 3 }}` // → 6 `{{ sub 10 3 }}` // → 7 `{{ mul 2 3 4 }}` // → 24 `{{ div 10 2 }}` // → 5 -
浮点运算:
`{{ addf 1.5 2 3.5 }}` // → 7.0 `{{ divf 10 4 }}` // → 2.5 -
取整函数:
`{{ floor 123.999 }}` // → 123.0 `{{ ceil 123.001 }}` // → 124.0 `{{ round 123.555 2 }}` // → 123.56
实用技巧
-
默认值处理:当字段可能为空时
`{{ .user | default "anonymous" }}` -
JSON处理:解析JSON字段
`{{ range $q := fromJson .queries }}{{ $q.query }}{{ end }}` -
多条件判断:
`{{ if and (contains "Err" .err) (eq .severity "high") }}重要错误{{end}}` -
格式化输出:
`{{ printf "%-15s %5d" .ip .port }}`
总结
Grafana Loki的LogQL模板函数提供了强大的日志处理能力,从简单的字符串操作到复杂的时间处理和数学运算,可以满足各种日志分析和转换需求。掌握这些函数的使用方法,可以显著提升日志查询和分析的效率。
在实际使用中,建议结合管道操作将多个函数串联起来,构建出符合业务需求的日志处理流程。同时,合理使用条件判断可以针对不同特征的日志进行差异化处理。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



