基于Docker方式安装Loki聚合系统只能用于测试验证,不要直接在生产环境使用。
其实对于Docker方式的部署,官方文档已经做了非常详细的说明,整理此博客仅仅是记录自己在第一次接触和部署Loki时遇到的问题以及困惑,具体的部署步骤如下所述。
由于Loki系统包含3个组件,分别是:Loki(日志存储和处理),Promtail(将日志发送给Loki),Grafana(展示日志数据),所以需要部署3个Docker容器,可以直接基于Docker Compose方式实现。
在部署之前需要下载3个文件,分别是:Loki配置模板文件,Promtail配置模板文件,Docker Compose配置文件,下载到本地后分别命名为:loki-local-config.yaml
,promtail-docker-config.yaml
和docker-compose.yaml
。
简单测试
Loki配置模板文件(loki-local-config.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: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
#
# Statistics help us better understand how Loki is used, and they show us performance
# levels for most users. This helps us prioritize features and documentation.
# For more information on what's sent, look at
# https://github.com/grafana/loki/blob/main/pkg/usagestats/stats.go
# Refer to the buildReport method to see what goes into a report.
#
# If you would like to disable reporting, uncomment the following lines:
#analytics:
# reporting_enabled: false
暂时可以不用修改,直接使用即可。
Promtail模板配置文件(promtail-docker-config.yaml
)默认内容如下:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/**/*.log
文件docker-compose.yaml
默认内容如下:
version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:2.9.0
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.9.0
volumes:
- /var/log:/var/log
command: -config.file=/etc/promtail/config.yml
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
为了能够实现自定义配置,需要在将Loki和Promtail的本地配置文件挂载到Docker容器中:
loki:
image: grafana/loki:2.9.0
user: root
ports:
- "3100:3100"
volumes:
- ./loki-local-config.yaml:/etc/loki/local-config.yaml # 将Docker宿主机上的loki配置文件挂载到容器中
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.9.0
volumes:
- /var/log:/var/log
- ./promtail-docker-config.yaml:/etc/promtail/config.yml # 将Docker宿主机上的promtail配置文件挂载到容器中
command: -config.file=/etc/promtail/config.yml
networks:
- loki
执行docker-compose -f docker-compose.yaml up
后就可以启动相应容器实例:
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
loki-grafana-1 grafana/grafana:latest "sh -euc 'mkdir -p /…" grafana 46 hours ago Up 14 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
loki-loki-1 grafana/loki:2.9.0 "/usr/bin/loki -conf…" loki 46 minutes ago Up 14 minutes 0.0.0.0:3100->3100/tcp, :::3100->3100/tcp
loki-promtail-1 grafana/promtail:2.9.0 "/usr/bin/promtail -…" promtail 46 minutes ago Up 14 minutes
只要3个容器(分别是loki-loki
,loki-promtail
,loki-grafana
)都存在且状态为Up时,表明整个Loki日志聚合系统已经部署成功了。
访问Grafana的地址:http://host:3000
,输入默认用户名和密码:admin/admin
,第一次访问会提示修改密码(也可以跳过)。
进入到Explore
界面,此时可能还看不到任何数据。
不要慌,这是正常的!
由于已经在Promtail的配置文件promtail-docker-config.yaml
中默认添加了对/var/log/
路径下日志的抓取:
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/**/*.log # 在promtail配置文件中添加了对指定路径日志的抓取,注意:这里抓取的是Docker容器实例内部的路径
同时,在docker-compose.yaml
中将Docker宿主机目录/var/log
挂载到了Promtail容器实例的/var/log
目录上:
promtail:
image: grafana/promtail:2.9.0
volumes:
- /var/log:/var/log # 将Docker宿主机目录/var/log挂载到容器中
- ./promtail-docker-config.yaml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
networks:
- loki
所以实际上Promtail抓取的是Docker宿主机目录/var/log
下所有的.log
文件数据,因此数据肯定是已经有了,目前就是还没找到正确查看日志数据的方式。
在Grafana界面上有2种日志标签过滤方式:filename,job。
当在Select label
下拉框中选择标签为filename
时,在Select value
下拉框中可以看到采集的所有日志文件名。
再选中指定的文件名之后,点击右上角Run query
按钮即可看到对应日志文件中的详细数据了。
当在Select label下拉框中选择标签为job时,在Select value下拉框中可以看到在Promtail配置文件中指定的job名称。
抓取应用日志
在上述简单测试中,默认只抓取了Docker宿主机上/var/log
路径下的日志文件,如果需要抓取具体业务系统的日志信息,可以在Promtail配置文件中添加新的抓取配置:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/**/*.log
# 如下是在Promtail中添加抓取应用系统日志的配置
- job_name: myapp # 区分不同抓取配置的标识
static_configs:
- targets:
- localhost # 上报日志的Loki地址
labels:
job: myapp-log # 具体的任务名称,将来在Grafana中查询日志时作为过滤标签使用
__path__: /myapp/logs/*log # 需要抓取的日志路径
注意:
如上在Promtail配置文件中添加了对应用系统日志的抓取配置,但是由于在本文中涉及的Promtail实例是Docker方式部署的,所以配置的抓取路径也是Docker容器内的日志路径。而应用系统可能是部署在Docker宿主机上的,因此还需要在docker-compose.yaml
中对promtail
服务添加对Docker宿主机上应用系统日志路径的挂载:
promtail:
image: grafana/promtail:2.9.0
volumes:
- /var/log:/var/log
- ~/myapp/logs:/myapp/logs # 将Docker宿主机上应用系统的日志路径挂载到容器中,否则Promtail无法抓取到具体的日志信息
- ./promtail-docker-config.yaml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
networks:
- loki
这个地方也是我第一次部署Loki时忽略了的,以至于无法在Grafana上查询到业务系统的日志信息。
完整配置详见test-loki。
另外,对于Grafana的版本选择,个人觉得7.3.10易用性更好,可以在浏览器页面中可以展示更多的日志信息。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^