因为每次去查看日志都去登录服务器去查询相关日志文件,还有不同的微服务,不同日期的文件夹,超级麻烦,因为之前用过ELK,原本打算用ELK,在做技术调研的时候发现了一个轻量级的日志系统Loki,果断采用Loki部署。也算是踩了不少坑。这里做一篇博客记录一下。
我这里是单个服务器系统部署,如果是多个服务器的话,修改链接配置即可。
主要是分为三个部分:
1、loki,主服务器,存储日志和处理查询
2、promtail,代理,收集日志并发给Loki
3、Grafana,查询和显示日志
我的服务器是 linux ubuntu系统。这是我部署的目录结构
Linux常用的文件命令一定要记住,下面是创建目录
//切换到你想部署的目录
cd /usr/local/docker
//创建需要的文件
mkdir lokis
cd lokis
mkdir grafana
mkdir loki
mkdir promtail
cd grafana
mkdir conf
cd ..
cd promtail
mkdir conf
// 给文件付权限 否则挂载目录生成会失败
sudo chmod -R 777 /usr/local/docker/lokis
第一步 编辑loki的配置文件 :我放到了 /usr/local/docker/lokis/loki/conf 目录下
vim config.yaml
文件内容如下:
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9095
grpc_server_max_recv_msg_size: 1572864000 #grpc最大接收消息值,默认4m
grpc_server_max_send_msg_size: 1572864000 #grpc最大发送消息值,默认4m
ingester:
lifecycler:
address: 127.0.0.1 #绑定本机 ip
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
wal:
dir: /loki/wal
compactor:
working_directory: /loki/persistent # 压缩目录,一般也作为持久化目录
compaction_interval: 10m # 压缩间隔
retention_enabled: true # 持久化开启
retention_delete_delay: 5m # 过期后多久删除
retention_delete_worker_count: 150 # 过期删除协程数目
schema_config:
configs:
- from: "2023-10-23"
index:
period: 24h
prefix: loki_index_
object_store: filesystem # 持久化方式:本地文件
schema: v11
store: boltdb-shipper
storage_config:
boltdb_shipper:
active_index_directory: /loki/boltdb-index # index 目录
cache_location: /loki/boltdb-cache # cache 目录
filesystem:
directory: /loki/chunks # chunks 目录
limits_config:
retention_period: 240h # 多久过期
第二步:编辑promtail 配置文件:
vim promtail-config.yaml
文件内容如下:
server:
http_listen_port: 9080 #云服务器需开放9080端口
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
#loki地址
clients:
- url: http://loki:3100/loki/api/v1/push
#我名词定义是 ”环境-服务-文件/容器“
scrape_configs:
- job_name: test-systemserver-file
static_configs:
- targets:
- localhost
labels:
client: test #自定义变量 定义环境
job: system-file #变量定义类型
__path__: /data/server/system/logs/**/*.log #收集程序输出的日志 ,日志目录和dokcer-compose挂载相关 /**/
- job_name: test-geteway-file
static_configs:
- targets:
- localhost
labels:
client: dev
job: geteway-file
__path__: /data/server/gateway/logs/**/*.log # 日志目录和dokcer-compose挂载相关 /**/
这里有两个需要注意的地方:
- url: http://loki:3100/loki/api/v1/push
这个地址是你采集日志后发送给loki的网络地址, 如果不同的服务器则采用Ip地址访问,如果同一台服务器可以用127.0.0.1 发送。如果是docker 部署并且在同一个网关内,可以采用容器名通信。如果不理解的可以查一下docker 部署容器直接通信
第二个需要注意的地方是
__path__: /data/server/system/logs/**/*.log
这个日志目录是你部署promtail的时候挂载出来的目录。因为我的微服务日志目录还有日期文件夹所以结尾是__path__: /data/server/system/logs/**/*.log
如果里面没有日期文件夹,直接对应的是日志文件:
__path__: /data/server/system/logs/*.log
其实就是文件的匹配规则。
第三步:获取Grafana的配置文件 defaults.ini
这里不同的版本配置文件不同。有的配置文件是:grafana.ini 有的配置文件是:defaults.ini
你可以先用docker 安装Grafana
然后通过docker命令:
docker exec -it <container_id_or_name> /bin/bash (修改自己的容器名)
查看一下grafana配置文件都有啥,然後通过docker复制文件到宿主机
docker cp abc123:/app/data.txt /home/user/data/ (修改目录和文件路径)
我的目录是这样的。
其他的文件是启动后自动生成的。
第四步:编辑docker-compose.yml文件
创建文件命令:
vim docker-compose.yml
文件内容如下:
version: '3'
services: #数据库
loki:
image: grafana/loki:latest
container_name: loki
ports:
- "3100:3100"
- "9095:9095"
command: -config.file=/etc/loki/config.yaml
volumes:
- ./loki/conf:/etc/loki
- ./loki/data/loki:/loki
#收集
promtail:
image: grafana/promtail
container_name: promtail
restart: always
ports:
- 9080:9080
volumes:
- ./promtail/promtail-config.yaml:/opt/promtail-config.yaml
- /usr/local/docker/javaapp/fxt-system/logs/fxt-sys-server_10201/:/data/server/system/logs/
- /usr/local/docker/javaapp/fxt-gateway/logs/fxt-gateway-center_10001/:/data/server/gateway/logs/
- /etc/localtime:/etc/localtime:ro
privileged: true #不开报错
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 200M
logging:
driver: json-file
options:
max-size: "200m"
max-file: "4"
command: ["-config.file=/opt/promtail-config.yaml"]
#web界面。 有的就不需要再部署了,都一样
grafana:
image: grafana/grafana
container_name: grafana
restart: "always"
ports:
- 3000:3000
environment:
- TZ=Asia/Shanghai
volumes:
- ./grafana/conf/defaults.ini:/usr/share/grafana/conf/defaults.ini
- ./grafana/grafana-storage:/var/lib/grafana
- /etc/localtime:/etc/localtime:ro
networks:
default:
external:
name: mynetwork
这里的networks 是自己创建的docker 网关路由。
所有的配置文件做好以后就可以启动了
//安装部署命令
docker-compose up -d
//查询日志
docker-compose logs -f
启动成功以后可以通过http://192.168.1.48:3000/ 访问Grafana (换成自己服务器的ip地址)
第五步:数据源选项 选择loki选项
配置loki的地址:http://loki:3100 我这里是docker内部的连接 所以是这样的。如果是其他的地址就配置自己的ip地址。
选择自己的服务:
运行查询:出来日志
一种是实时刷新 一种是每次查询一次。
具体看情况。至于怎么使用查询可以学习相关的语句。有什么问题欢迎交流