前阵子双十一跟风买了阿里云 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 中看到这个项目的日志了。