尝试使用Grafana+Loki来记录Docker容器的日志
总结
最近在云原生领域似乎很受关注的日志工具Loki,我尝试用Docker试了一下。
谈到容器日志,目前一般使用EFK堆栈(Elasticsearch + Fluentd + Kibana),但在个人开发环境或娱乐环境中,因为Elasticsearch很重,对于使用EFK有些抵触。然而,Loki在使用上没有明显的资源消耗,并且简单方便,可能会成为需要在Docker开发环境中至少安装的东西。
虽然目前还不是1.0版本,但似乎将来还可以与Prometheus进行协作,但对于个人使用来说,目前的功能已经足够有用了。
建立
-
- DockerにLokiのプラグインをインストールする
-
- 各コンテナがログをLokiへ転送するように設定する
-
- ログ収集用のLokiコンテナと可視化用のGrafanaコンテナを起動する
- GrafanaからLokiに接続する設定をする
事前准备只需要一个选项:
确认没有任何一个集装箱已经被提升起来。
如果有提升起来的话,将其移除掉。
docker container ls -a
在Docker上安装Loki插件。
只需执行一个指令。
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
可以使用docker plugin ls命令来确认安装情况。
$ docker plugin ls
ID NAME DESCRIPTION ENABLED
bb97061da4a3 loki:latest Loki Logging Driver true
将每个容器配置为将日志传输到Loki。
通过更改Logging Driver的设置,使日志传送到Loki。
基本上,只需要按照官方docker-driver的README中所述进行设置即可。如果想要了解更多细节,可以参考同一页面上记录的log-opts选项的说明。
如果在同一主机上使用默认端口号启动Loki,您可以通过localhost:3100访问。因此,如果要更改daemon.json文件,只需按照以下方式进行记录即可。
如果您想为每个容器指定日志配置,则需要在每个docker-compose.yaml文件中为每个服务记录logging选项,这可能会有些麻烦。
{
"debug" : true,
"log-driver": "loki",
"log-opts": {
"loki-url": "http://localhost:3100/api/prom/push",
"loki-batch-size": "400"
}
}
为了使daemon.json的更改生效,重新启动Docker。
systemctl restart docker.service
我还没有启动Loki,但是现在先这样设置,以便将来启动的容器日志转移到Loki。
接下来,重点是启动Loki和Grafana。
启动用于日志收集的Loki容器和用于可视化的Grafana容器。
获取代码
可以使用以下参数从公式的GitHub中获取代码。
https://github.com/grafana/loki/blob/master/production/docker-compose.yaml是必要的,因此可以直接创建docker-compose.yaml而无需进行git clone,也没有任何问题。
git clone https://github.com/grafana/loki.git
cd loki/production/
编辑docker-compose.yaml文件
默认情况下,promtail会收集主机的/var/log/ * log日志文件,但如果只想收集Docker容器的日志,则可以将promtail部分注释或删除。
如果想要同时收集主机的日志,则无需进行任何更改。
如果要更改Loki主机端口号,请不要忘记同时调整daemon.json文件。
Grafana端口只用于通过浏览器从外部访问,所以可以选择任意喜欢的端口号,可能不会有问题。
突然出现了一个叫做promtail的东西,从形象上来说,我觉得可以这样理解。
Loki = Elasticsearch みたいなやつ(ログが集まる場所)
promtail = Fluentd みたいなやつ(ログ集めるやつ)
Grafana = Kibana みたいなやつ(集まったログを見やすくするやつ)
因为可以直接将日志发送给Loki,所以很难理解promtail的存在意义,但我认为一般类型的容器日志通常会直接发送给Loki并存储在文件中,而记录在文件中的日志(主要是服务器日志)则通过promtail发送给Loki。
version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
# promtail:
# image: grafana/promtail:latest
# volumes:
# - /var/log:/var/log
# command: -config.file=/etc/promtail/docker-config.yaml
# networks:
# - loki
grafana:
image: grafana/grafana:master
ports:
- "3000:3000"
networks:
- loki
完成编辑后,启动 Loki 和 Grafana 容器。如果要正确使用,我认为应该持久化保存 Loki 日志累积目录。Grafana 则随意。
docker-compose up -d
进行与Grafana连接到Loki的配置。
我认为可以在容器启动时发送预先设定好的设置文件,而不需要在屏幕上手动进行设定。
-
- ブラウザでGrafana(デフォルトでは「http://<サーバアドレス>:3000」)にアクセスし、admin/adminでログインする。
-
- adminユーザのパスワード変更を求められるので適当に変更
-
- 「Add data source」をクリックし、Lokiをクリック
- URLに「http://loki:3100」と入力し、「Save & Test」をクリック
当数据源连接成功且找到了标签时,会显示”Data source connected and labels found”,表示成功。
需要注意的是,即使连接成功,但如果启动Loki后没有添加任何日志,就会出现”Data source connected, but no labels received. Verify that Loki and Promtail is configured properly.”的错误。先产生任意一种日志,就不会再显示这个错误。
如果更改了daemon.json文件,则Loki和Grafana应该已经有了日志,所以不应该出现错误。但如果计划在docker-compose.yaml等中单独更改,要注意。
用
只需一个选项,以下是中文的同义句:
在启动容器后,只需从侧边栏中点击“探索”,然后在左上角的“日志标签”中点击想要查看的容器名称等,就可以显示该容器的日志。可以按照主机单位或指定多个容器来查看。
由于默认不会自动更新,所以在右上角的“刷新”按钮上更改适当的更新间隔会很方便。
虽然在初始页面上有一个示例,但也可以使用正则表达式进行过滤显示,例如:{app=”cassandra”} (duration|latency)\s*(=|is|of)\s*[\d\.]+,这样比通过docker命令费力地查看日志要轻松得多。
只是不幸的是,仪表板似乎不支持Loki,每次打开页面都需要输入查询,有点麻烦。
其他
失败的事情
最初,我认为可以通过将/var/lib/docker/containers/挂载给promtail,并仅导入json文件的方式来记录容器的日志。这种方法不需要更改daemon.json等文件,并且可以方便地将已经启动的容器的日志作为收集对象。然而,有人试图做同样的事情,尽管在过去的版本中可以勉强实现,但现在看起来已经无法实现了。请参考:https://github.com/grafana/loki/issues/333
如果想在服务器上查看日志
如果您想将日志转发到Loki,您需要将主机的/var/lib/docker/containers/<容器ID>/<容器ID>-json.log配置为常规写入日志的地方,然后可以使用docker container logs命令正常查看日志。
然而,令人奇怪的是,当使用docker-compose logs命令时,会显示WARNING:no logs are available with the ‘loki’ log driver,并且无法查看日志。
如果您希望在服务器上查看日志,请注意。