目录

  • ELK的概念
  • 安装docker-compose
  • 编写docker-compose.yml
  • 执行build
  • 创建配置文件
  • 启动容器
  • 安装filebeat
  • filebeat 配置
  • 字符编码配置
  • 多行合并配置
  • logstash配置
  • 完成
  • 最后说一点


ELK的概念

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。

安装docker-compose

参考文章 Docker搭建RabbitMQ

编写docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1
    container_name: elasticsearch7.1.1
    ulimits:        # 栈内存的上限
      memlock:
        soft: -1    # 不限制
        hard: -1    # 不限制
    hostname: elasticsearch
    restart: always
    environment:
      - node.name=node-1
      - node.master=true
      - http.port=9200
      - cluster.initial_master_nodes=node-1
      - http.cors.enabled=true
      - http.cors.allow-origin=*
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      envdm:
        aliases:
          - elasticsearch
  kibana:
    image: docker.elastic.co/kibana/kibana:7.1.1
    container_name: kibana7.1.1
    environment:
      XPACK_MONITORING_ENABLED: "true"
      XPACK_MONITORING_UI_CONTAINER_ELASTICSEARCH_ENABLED: "true"
      ELASTICSEARCH_HOSTS: http://172.16.0.7:9200
      CSP_STRICT: "true"
      SERVER_BASEPATH: "/kbstatic"
      I18N_LOCALE: "zh-CN"
    depends_on:
      - elasticsearch
    restart: always
    ports:
      - 5601:5601
    volumes:
      - /data/elk/kibana.yml:/etc/kibana/kibana.yml
    networks:
      envdm:
        aliases:
          - kibana
  logstash:
    image: docker.elastic.co/logstash/logstash:7.1.1
    container_name: logstash7.1.1
    hostname: logstash
    restart: always
    depends_on:
      - elasticsearch
    volumes:
      - /data/elk/logstash.conf:/etc/logstash/conf.d/logstash.conf
      - /data/elk/logstash.yml:/etc/logstash/logstash.yml
    ports:
      - 9600:9600
      - 5044:5044
    networks:
      envdm:
        aliases:
          - logstash

networks:
  envdm:
    driver: bridge

执行build

编写好docker-compose.yml之后再同级目录下面执行如下脚本

docker-compose build

创建配置文件

这里我们把容器内部的配置文件挂在宿主机里面

touch kibana.yml   logstash.yml logstash.conf

启动容器

nohup docker-compose up 1>elk.log 2>&1 &

logstash的配置需要进入容器内部 修改修改pipline.yml里面的配置文件路径,不然会使用默认的配置文件,导致容器挂载不生效

安装filebeat

下面列举了两种安装方式,取其一即可

rpm:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-x86_64.rpm 
sudo rpm -vi filebeat-7.1.1-x86_64.rpm

tar:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-darwin-x86_64.tar.gz 
tar xzvf filebeat-7.1.1-darwin-x86_64.tar.gz 
cd filebeat-7.1.1-darwin-x86_64/

filebeat 配置

type : 当前输入数据源的类型

enabled:启用当前输入

paths: 路径数组,数据源的路径

tags:标签,可用于的logstash里面区分数据来源

tail_files : 从文件尾部开始输入

fields:可以添加自定义子字段

docker 容器 日志收集 docker 日志采集_docker

字符编码配置

在日志输出的时候有可能会出现中文乱码的情况,我们需要配置一下编码

docker 容器 日志收集 docker 日志采集_elasticsearch_02

多行合并配置

配置多行合并可以用于把多行记录合并为一行记录,最典型的就是我们的异常堆栈信息

#java异常信息的处理
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after

logstash配置

logstash的配置类似于管道的模式。
首先是input,标识输入的数据源,这里配置的是filebeat
然后是filter 里面可以使用grok对日志进行格式化,具体使用可以搜索grok表达式,或者使用正则表达式
也可以使用mutate删除指定字段,output是把处理之后的日志输出到指定的目标位置,可以是ES

# 接受filebeat的日志输入
input{
    beats {
    port => 5044
    }
}

filter {
	# 格式化日志信息
	grok{
		    match => {"message" => "%{TIMESTAMP_ISO8601:time}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{NUMBER:pid}\s*%{DATA:no1}\s*\[%{DATA:thread}]\s*%{DATA:path}\s*\:\s*%{GREEDYDATA:msg}"}
	}
# 删除无关字段
	mutate {
	      remove_field => ["host","tags","no1","beat","@version","prospector","input"]
	    }
	}
	output{
		# 输出到ES
		if "back-base-data"==[fields][type]  {
		elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-basedata-index"
		        }
		}
		else if "back-customer-portal"==[fields][type] {
		
		    elasticsearch {
		        hosts => ["172.16.0.7:9200"]  
		        index => "back-customer-portal-index"
		    }
		}    
		else if "back-system-config"==[fields][type] {
		
		        elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-system-config-index"        }
		}
		else if "back-customer-management"==[fields][type] {
		
		        elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-customer-management-index"
		       }
		}
		else if "back-suppliers-management"==[fields][type] {
		
		        elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-suppliers-management-index"
		        }
		}
	}
}

完成

上面启动好elk之后就可以进入kibana控制台界面,我们先要在kibana的配置模块里面找到索引配置,配置好对应的索引模式,这里我就配置了一个back*的索引模式,配置好之后可以kibana查看数据

docker 容器 日志收集 docker 日志采集_elk_03


至于后面怎么去对数据进行统计分析就看你自己的了

最后说一点

搭建这个东西不难,但是用好这个东西,从里面提取出有价值有意义的数据缺失是一件不容易的事情,所以我们作为开发人员在开发的时候应该要学会规范的打日志,一些无用的日志只会让系统看起来乱糟糟