本文主要介绍用Grafana+Loki的方式实现日志可视化管理,采用Loki4j通过http协议直接将日志发送到Loki,不需要采用Promtail 的形式发送。
1 Loki
1.1 安装
$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.4.2/loki-linux-amd64.zip"
# extract the binary
$ unzip "loki-linux-amd64.zip"
# make sure it is executable
$ chmod a+x "loki-linux-amd64"
# 如果没有crul命令,可以通过下述命令安装
$ yum install curl
$ yum update nss
本文的系统环境是CentO S 7.9,如果需要其他系统环境的,可以去官网找自己需要的版本:Releases · grafana/loki · GitHub
PS:如果指令下载失败,下载压缩包上传解压就可以了
1.2 配置文件
# 获取配置文件
$ wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
# 没有wget命令可以
$ yum install -y wget
1.3 配置防火墙
温馨提示:如果防火墙安全策略非操作系统服务firewalld管理,请参考自己的防火墙开放对应端口;
# 查看防火墙状态
$ systemctl status firewalld
# 开启防火墙
$ systemctl start firewalld
# 查看所有打开的端口
$ firewall-cmd --zone=public --list-ports
# 开放端口
$ firewall-cmd --zone=public --add-port=3100/tcp --permanent
# 重载防火墙,并不中断用户连接,即不丢失状态信息
$ firewall-cmd --reload
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
1.4 验证
./loki-linux-amd64 -config.file=loki-local-config.yaml
登录http://localhost:3100/metrics,有信息展示,则安装成功。(localhost请修改成对应的服务器地址)
2 Grafana
2.1 下载
$ wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.4.4-1.x86_64.rpm
$ sudo yum install grafana-enterprise-8.4.4-1.x86_64.rpm
可以去官网下载对应系统所需的版本Download Grafana | Grafana Labs
2.2 配置防火墙
# 查看所有打开的端口
$ firewall-cmd --zone=public --list-ports
# 开放端口
$ firewall-cmd --zone=public --add-port=3000/tcp --permanent
# 重载防火墙
$ firewall-cmd --reload
# 查看所有打开的端口
$ firewall-cmd --zone=public --list-ports
2.3 启动
# 重新加载配置文件
$ systemctl daemon-reload
# 查看状态
$ systemctl status grafana-server
# 启动
$ systemctl start grafana-server
打开http://localhost:3000/login 默认账号密码是:amdin admin
2.4 配置loki数据库
如下图所示,添加loki数据库,然后进入设置界面,设置界面只需要修改url就可以了,一般是http://localhost:3100, 然后点击save&test看看是否成功。
3 Loki4j
3.1 使用Loki4j
引入依赖pom.xml文件
<dependency>
<groupId>com.github.loki4j</groupId>
<artifactId>loki-logback-appender-jdk8</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
在logback的xml配置中追加
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<http class="com.github.loki4j.logback.ApacheHttpSender">
<url>http://localhost:3100/loki/api/v1/push</url>
</http>
<format>
<label>
<pattern>app=my-app,host=${HOSTNAME},level=%level</pattern>
</label>
<message>
<pattern>l=%level h=${HOSTNAME} c=%logger{20} t=%thread | %msg %ex</pattern>
</message>
<sortByTime>true</sortByTime>
</format>
</appender>
<root level="DEBUG">
<appender-ref ref="LOKI" />
</root>
3.2 配置参数
3.2.1 通用配置
参数 | 默认 | 描述 |
---|---|---|
batchMaxItems | 1000 | 单次传输最大事件数 |
batchMaxBytes | 4194304 | 单次最大字节数(由 Loki 计算)。此值不应大于server.grpc_server_max_recv_msg_size Loki 配置中的值 |
batchTimeoutMs | 60000 | 发送时间最长间隔 |
sendQueueMaxBytes | 41943040 | 发送队列的最大字节数 |
useDirectBuffers | true | 使用堆外内存存储中间数据 |
drainOnStop | true | true, appender关闭时发送所有剩余时间, false, 丢弃未发送的数据 |
metricsEnabled | false | true, appender 将使用 Micrometer 报告其指标 |
verbose | false | true, appender 会将自己的调试日志打印到 stderr |
3.2.2 HTTP设置
参数 | 默认 | 描述 |
---|---|---|
http.url | 必填. 发送loki的端点 | |
http.connectionTimeoutMs | 30000 | Loki链接的响应时间(毫秒) |
http.requestTimeoutMs | 5000 | 请求的响应时间(毫秒) |
http.auth.username | 用户名 | |
http.auth.password | 密码 | |
http.tenantId | 租户标识符。仅在将日志直接发送到在多租户模式下运行的 Loki 时才需要。否则此设置无效 |
3.2.3 格式设置
参数 | 默认 | 描述 |
---|---|---|
format.label.pattern | 必填. 用于日志记录标签的 Logback 模式 | |
format.label.pairSeparator | , | 用作标签之间分隔符的字符 |
format.label.keyValueSeparator | = | 用作标签名称与其值之间分隔符的字符 |
format.label.nopex | true | true, 异常信息不会添加到标签中, false, 注意正确的格式 |
format.message.pattern | 必填. 用于日志记录消息的 Logback 模式 | |
format.staticLabels | false | 如果您对所有日志记录仅使用一个标签,则可以将此标志设置为 true 并在按标签分组记录时节省一些 CPU 时间 |
format.sortByTime | false | 如果为 true,则批处理中的日志记录按时间戳排序。如果为 false,记录将按到达顺序发送给 Loki。如果您从 Loki 看到“输入乱序”错误,请启用此选项 |
4 使用
4.1 使用界面
启动项目,可以直接创建一个简答的SpringBoot项目,然后将loki4j的引入项目即可,搜索日志。
结果如下:
4.2 过滤方式
Loki使用LogQL进行日志筛选, 分为标签过滤和运算符过滤, 标签过滤类似于索引, 能快速过滤想要获得的信息, 运算符过滤类似于全文查找, 对一些不适合建立标签的数据进行进一步刷选, 主要针对信息体进行查找。
4.2.1 标签过滤
- =: 完全匹配
- !=: 不匹配
- =~: 正则表达式匹配
- !~: 正则表达式不匹配
在grafana中, 标签过滤可以直接通过Log browser下的标签进行选择需要的值
{host="DESKTOP-6M06VIR",logger!="RepositoryConfigurationDelegate"}
4.2.2 运算符过滤
- |=:日志行包含的字符串
- !=:日志行不包含的字符串
- |~:日志行匹配正则表达式
- !~:日志行与正则表达式不匹配
{host="DESKTOP-6M06VIR",logger!="RepositoryConfigurationDelegate"}|="current ips:(1)"
参考文件:
Download Grafana | Grafana Labs
Releases · grafana/loki · GitHub
Loki4j Logback · Pure Java Logback appender for Grafana Loki