⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 飞天小牛肉 「小牛肉」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

前阵子双十一跟风买了阿里云 99 元的 2 核 2 G 的小水管,该说不说,确实便宜,但就是买来不知道干啥,本身我已经有了一个比较高配置的服务器,这个 2G 的小水管 docker 装点啥都容易崩溃,本来想用 skywalking + es 搭一个分布式链路追踪平台,这样方便做自己项目的监控。

结果我还是太高看 2G 内存了,docker 装完我还习惯性设置了 restart = always,于是就悲剧了,服务器直接卡死,重启也不好使,后来还是找阿里云工作人员解决了。

链路追踪这条路走不通了,退而求其次追踪下日志吧,ELK 肯定是用不了,最起码得 4G 起步,网上找了好久,终于锁定了 Loki 这个轻量级日志框架,下面是我搭建起来配合 Grafana 可视化的结果,整体还是挺好上手的,本期就出一篇教程,各位可以参考自己搭一套起来。

环境部署

组件就两个,Loki 和 Grafana,非常轻量,实测 Docker 运行大概不到 1G 内存,下面是 docker-compose.yml 文件(docker 和 docker-compose 的安装大家自行谷歌哈):

version: "3"

networks:
loki:

services:
loki:
image:grafana/loki:latest
ports:
-"3100:3100"
command:-config.file=/etc/loki/local-config.yaml
networks:
-loki

grafana:
environment:
-GF_PATHS_PROVISIONING=/etc/grafana/provisioning
-GF_AUTH_ANONYMOUS_ENABLED=true
-GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
entrypoint:
-sh
--euc
-|
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: true
version: 1
editable: false
EOF
/run.sh
image:grafana/grafana:latest
ports:
-"3000:3000"
networks:
-loki

在 docker-compose.yaml 所在的目录执行下面这个命令行,拉镜像并启动容器:

docker-compose -f docker-compose.yaml up

docker ps 观察到两个容器在运行即为安装部署成功。

SpringBoot 集成 Loki 上传日志

SpringBoot 集成 Loki 的实质就是将 Loki 与 Logback 进行集成,在产生日志时调用 Loki 的push接口,将微服务日志上传到 Loki 服务器,故而可以实现分布式日志监控。

除了 logback,还需要引入 loki-logback-appender-jdk8 依赖:

<dependency>
<groupId>com.github.loki4j</groupId>
<artifactId>loki-logback-appender-jdk8</artifactId>
<version>1.4.2</version>
</dependency>

logback-spring.xml 文件:

<!-- loki日志上传 -->
<springProperty name="serverIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
<springProperty name="serverPort" scope="context" source="server.port" defaultValue="0000"/>
<springProperty name="appName" scope="context" source="spring.application.name"/>
<springProperty name="lokiUrl" scope="context" source="loki.url"/>

<property name="APP_NAME" value="${appName}"/>
<property name="LOKI_URL" value="${lokiUrl}"/>

<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<http class="com.github.loki4j.logback.ApacheHttpSender">
<url>${LOKI_URL}/loki/api/v1/push</url>
</http>
<format>
<label>
<pattern>app=${APP_NAME},host=${HOSTNAME},instance=${serverIP}:${serverPort}, level=%level</pattern>
</label>
<message>
<pattern>l=%level h=${HOSTNAME} i=${serverIP}:${serverPort} c=%logger{20} t=%thread | %msg %ex</pattern>
</message>
<sortByTime>true</sortByTime>
</format>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="LOKI"/>
</root>

lokiUrl 配置在 application.yml 中(注意这里填你服务器的 ip 或者本地 ip):

# loki配置
loki:
url: http://192.168.11.11:3100

后续所有通过 logback 打出来的日志比如 log.error,log.info 等等都会被汇总到 Loki 中

Grafana 可视化 Loki

前置工作已准备完毕,接下来我们使用Grafana来配置展示服务信息和日志信息。

访问 http://服务器ip:3000/login,进入 Grafana 登录页,默认用户名密码都是 admin,首次登录会引导进行密码修改。

进入之后点击 Data Source 添加数据源:

找到 Loki,Connection 中的 Url 可以直接填 http://容器名:3100:

填完后拉到最后 Test 下连接是否成功:

连接成功后就可以添加 Dashboard 了,查询语句里面可以简单写一个 {app="appName"},这里的 appName 就是你在项目配置文件中配置的 spring.application.name,这样就可以在这个 DashBoard 中看到这个项目的日志了。

文章目录
  1. 1. 环境部署
  2. 2. SpringBoot 集成 Loki 上传日志
  3. 3. Grafana 可视化 Loki