Docker:ELK + kibana 日志收集系统

Posted 拾荒的小海螺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker:ELK + kibana 日志收集系统相关的知识,希望对你有一定的参考价值。

1、简述

ELK作为一套日志收集工具,顾名思义,ELK包含了三个开源工具,它们分别是elasticsearch、logstash、kibana,其中elasticsearch是一款搜索和数据分析引擎,Logstash是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,Kibana是一个免费且开放的用户界面,能够对Elasticsearch数据进行可视化。

ELK有多种架构可供部署,根据数据量大小、服务器需求等可选择不同架构,有些架构还需要用到消息队列中间件,比如kafka或者redis,用于进行数据持久化,防止日志数据丢失的这一情况。

2、Elasticsearch 集群

2.1 拉取镜像

安装elasticsearch,当前选择的是7.2.0版本的

 docker pull elasticsearch:7.2.0

2.2 创建集群目录

创建es1,es2,es3集群目录:

[root@localhost ~]# mkdir -p /data/elk/es1/data
[root@localhost ~]# chmod -R 777 /data/elk/es1/data
[root@localhost ~]# mkdir -p /data/elk/es2/data
[root@localhost ~]# chmod -R 777 /data/el

docker容器使用loki收集日志

docker-compose安装loki套件(loki+promtail+grafana)

loki进行日志聚合处理  类似elk中的es

promtail是日志收集,类似elk中的logstash filebeat等,如果是只收集docker容器的日志则可以用loki的docker plugin替代

grafana是日志显示,类似elk中的kibana,可以通过各种标签和表达式过滤显示日志

 

docker-compose.yml内容如下

version: "3"

networks:
  loki:
  
services:
  loki:
    image: grafana/loki
restart: always environment: - TZ
=Asia/Shanghai - LANG=zh_CN.UTF-8 ports: - 3100:3100 networks: - loki promtail: image: grafana/promtail
restart: always environment: - TZ
=Asia/Shanghai - LANG=zh_CN.UTF-8 networks: - loki grafana: image: grafana/grafana:master
restart: always environment: - TZ
=Asia/Shanghai - LANG=zh_CN.UTF-8 ports: - 3000:3000 networks: - loki

如果只用docker plugin来收集日志则可以把promtail部分删除,已经有grafana的也可以直接复用

 

安装loki的docker plugin

命令行运行

docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

 

对于loki的docker plugin有两种使用方式。

  • 配置daemon.json,收集此后创建的所有容器的日志(注意,是配置daemon.json后重启docker服务后创建的容器才会把日志输出到loki)。
  • 新建容器时指定logging类型为loki,这样只有指定了logging的容器才会输出到loki

全局收集配置

编辑daemon.json。linux下默认路径是/etc/docker/daemon.json (需要sudo), windows则默认是%userprofile%.dockerdaemon.json

{
  "log-driver": "loki",
  "log-opts": {
    "loki-url": "http://YOUR_IP:3100/loki/api/v1/push",
    "max-size": "50m",
    "max-file": "10"
  },
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

记得把YOUR_IP换成loki所在主机的IP,一般都是本机的局域网地址,如果loki映射的端口换了记得这里也需要换。镜像仓库地址也可以换成自己云服务的。

其中max-size表示日志文件最大大小,max-file表示最多10个日志文件,都是对单个容器来说的。

 

然后重启docker服务。

sudo systemctl restart docker

在此之后创建的容器默认都会把日志发送到loki。

 

如果不全局配置,而只想特定的容器进行日志收集,则根据启动容器的方式,有两种配置方法。

docker run配置日志输出到loki

通过docker run启动容器,可以通过--log-driver来指定为loki。示例如下

docker run --rm --name=grafana --log-driver=loki --log-opt loki-url="http://YOUR_IP:3100/loki/api/v1/push" --log-opt max-size=50m --log-opt max-file=10 grafana/grafana
--log-driver=loki指定日志驱动器为loki
--log-opt loki-url则指定了loki的url
--log-opt max-size日志最大大小
--log-opt max-file日志文件最大数量

docker-compose 配置日志输出到loki

docker-compose 小于3.4可以对需要日志输出的配置添加配置如下

logging:
  driver: loki
  options:
    loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
    max-size: "50m"
    max-file: "10"

注意:max-size和max-file这里需要加引号

 

对于3.4极其以上版本可以通过定义模板来减少代码量

version: "3.4"

x-logging:
  &loki-logging
  driver: loki
  options:
    loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
    max-size: "50m"
    max-file: "10"

services:
  host:
    container_name: grafana
    image: grafana/grafana
    environment:
    - TZ=Asia/Shanghai
    - LANG=zh_CN.UTF-8
    logging: *loki-logging

&loki-logging表示定义模板

*loki-logging表示引用模板。对于多个服务就只需要对应加上一行 logging: *loki-logging 即可。相比之前的版本可谓是大大简化了

 

Grafana显示和过滤日志

一开始安装的时候将grafana映射到了宿主机的3000端口,所以地址就为 http://YOUR_IP:3000

grafana默认用户名密码是admin和admin

第一次进入需要修改admin的密码

添加loki数据源

技术图片

 

技术图片

 

 

 技术图片

 

 

 选择loki。

 

因为一开始安装grafana和loki是在一个docker-compose里,所以默认在同一个子网下,因此可以url可以直接写http://loki:3100。如果grafana和loki是分开的,则需要改为填loki所在的宿主机ip

 技术图片

 

 

点击  保存和测试 。会提示链接成功。

 

查看过滤日志

左侧菜单栏选择探索 

技术图片

 

 

label里有对应选项可以选择。  compose_project就是docker-compose的项目名  compose_service就是其中的服务名   container_name就是容器名。这几个基本就够我们定位到具体的某个容器了。

 

 技术图片

 

 

 

关键字查询    |~ "keyword"      文档链接: LogQL文档

技术图片

 

 

 

 

然后是时间段选择

技术图片

 

 

 

后续应该是loki增加缓存以优化查询速度和集群配置(k8s)






以上是关于Docker:ELK + kibana 日志收集系统的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot应用整合并使用Docker安装ELK实现日志收集

docker容器使用loki收集日志

filebeat+elasticsearch+logstash+kibana收集系统日志(docker)

docker安装ELK 收集springboot日志(方法1)

Docker安装部署ELK教程 (Elasticsearch+Kibana+Logstash+Filebeat)

ELK之kibana 部署及日志收集