日常我都是使用 ubuntu 系统做开发,可以用 tail
命令很方便地实时查看一个日志文件,比如 nginx 日志 tail -f /var/log/nginx/access.log
。
但是开发微服务的时候,本地可能会启动很多个服务,同时生成多个日志文件,tail
或者 multitail
同时查看很多个日志文件的话,就不是很方便了。
常见的日志系统比如 elk、efk,搭建起来比较复杂,又非常耗资源。
今天给大家介绍一个轻量级的日志系统 GLP(grafana loki promtail)。
简介
- Loki 是受 Prometheus 启发的一种水平可扩展、高度可用、支持多租户的日志聚合系统。它旨在非常具有成本效益且易于操作。它不会索引日志的内容,而是针对每个日志流通过一组标签进行索引。
- Promtail Promtail 是一个代理工具,将本地日志内容发送到私有的 Grafana Loki 实例或 Grafana Cloud 中。
- Grafana Grafana 能够查询、可视化、提醒和探索您存储的度量、日志和追踪数据。
安装
Loki
如果你熟悉 docker,你也可以使用 docker
或者 docker-compose
安装,这里我们选择本地安装,下载安装包 github.com/grafana/lok... ,loki 跟 promtail 安装包都在这里下载,你可以一起下载好。
配置 loki,如果你下载的是 deb 或者 rpm 格式的,安装之后配置文件已经帮你生成好了,默认放在 /etc/loki/config.yml
。
yaml
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
instance_addr: 127.0.0.1
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2020-10-24
store: tsdb # 这里修改成了 tsdb,之前版本是 boltdb-shipper,新版本推荐使用 tsdb
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
promtail
下载 loki 的页面也可以下载 promtail,promtail 的配置文件很多地方类似于 prometheus
,比如 scrape_config
,这里重点关注下 pipline_stages
、relabel_configs
的相关配置,详细文档可以在 loki 官网 stages 查看。
yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: kitex
pipeline_stages:
- json:
expressions:
level: level # json 获取到日志里的 level 字段
- labels:
level: # 使用上面获取到的 level 设置为 label
static_configs:
- targets:
- localhost
labels:
job: kitex # 设置固定 labels
__path__: /opt/golang/tmp/log/kitex.log
这里我是要收集本地一些 kitex 项目的日志
单行日志格式
{"level":"info","msg":"hello world","time":"2024-01-15T00:34:03+08:00"}
grafana
grafana 可以在 grafana 官网 下载,这个没有太多要解释的,如果需要深入了解可以多看看官方文档,loki 暂时我们使用 explore 界面来查看收集到的日志
使用
打开 grafana,添加一个 Data sources,类型选择 loki,地址就填 http://127.0.0.1:3100
拉到最下边,Save & test
打开 Explore 界面,Label filters 选择刚刚设置好的 label
, job=kitex
选中 wrap lines
日志太长会换行,prettify json
可以展开 json 日志
对于堆栈日志会提示 Your logs might have incorrectly escaped content
可以点击右边的 Escape newlines
查看日志就非常方便了
如果需要增加日志文件,只需要新增一个 target,搜索的时候也可以按 level 来搜索,当然也可以增加其他的 label,比如在日志里增加项目名 {"app": "product"}
,只需要将 pipeline_stages 修改成下面的样子
yaml
- json:
expressions:
level: level # json 获取到日志里的 level 字段
app: app # json 获取到日志里的 app 字段
- labels:
level: # 使用上面获取到的 level 设置为 label
app: