ELK-Docker化安装

  1. 一、环境:
  2. 二、安装部署:
    1. 1、Docker
    2. 2、Elasticsearch
    3. 3、Kibana
    4. 4、Logstash
    5. 5、Filebeat
      1. 1)非Docker模式:
    6. 6、X-PACK
  3. 三、ELK 使用步骤:

一、环境:

Ubuntu18.04 + Docker 18.09 + ELK Docker Image 7.1

二、安装部署:

1、Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $(whoami)
sudo systemctl start docker
sudo systemctl status docker

2、Elasticsearch

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.1.0
sudo apt install docker-compose

sudo bash -c "echo 'vm.max_map_count=262144' >> /etc/sysctl.conf"
sudo sysctl -p

sudo mkdir -p /data/elasticsearch/data
sudo vim docker-compose.yml
sudo chown -R yimi.yimi  elasticsearch/
sudo docker-compose up -d

docker ps -a
curl http://127.0.0.1:9200/_cat/health
docker-compose down -v

3、Kibana

docker pull docker.elastic.co/kibana/kibana:7.1.0
sudo mkdir /data/kibana
sudo vim docker-compose.yml
sudo docker-compose  up -d
docker logs kibana 

4、Logstash

docker pull docker.elastic.co/logstash/logstash:7.1.0
docker run -it --rm docker.elastic.co/logstash/logstash:7.1.0 -e 'input { stdin { } } output { stdout { } }'
sudo mkdir /data/logstash/
sudo chown -R yimi.yimi logstash/

docker run -d -p 5044:5044 --name logstash --network elasticsearch_esnet \
-v /data/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-v /data/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
docker.elastic.co/logstash/logstash:7.1.0

5、Filebeat

1)非Docker模式:

# 1.edit config with logstash
 
# 2.Index setup 
filebeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["http://10.15.1.27:9200"]'

# 3.kibana setup
filebeat setup -e \
  -E output.logstash.enabled=false \
  -E output.elasticsearch.hosts=['http://10.15.1.27:9200'] \
  -E setup.kibana.host=http://10.15.1.27:5601
  
# 4.startup filebeat:
sudo service filebeat start

####2)Docker模式:

docker run \
docker.elastic.co/beats/filebeat:7.1.1 \
setup -E setup.kibana.host=kibana:5601 \
-E output.elasticsearch.hosts=["elasticsearch:9200"]

docker run docker.elastic.co/beats/filebeat:7.1.1 setup \
--network elasticsearch_esnet --template -E output.logstash.enabled=false \
-E 'output.elasticsearch.hosts=["es01:9200"]'

docker run --net="host" docker.elastic.co/beats/filebeat:7.1.1 setup -e \
  -E output.logstash.enabled=false \
  -E output.elasticsearch.hosts=['localhost:9200'] \
  -E output.elasticsearch.username=filebeat_internal \
  -E output.elasticsearch.password=YOUR_PASSWORD \
  -E setup.kibana.host=localhost:5601

6、X-PACK

x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中。

因为x-pack是收费的,所以试用期只有一个月。长期使用就必须根据官网文档说得来,也是给我们后门,一年一年的续期。

如果要认证,建议用Nginx做反向代理+认证

三、ELK 使用步骤:

Spring Boot 日志输出到指定目录,Filebeat 进行采集,Logstash 进行过滤,Elasticsearch 进行存储,Kibana 进行展示。

Filebeat 示例配置(vi /etc/filebeat/filebeat.yml):

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/spring-boot-log4j2/*.log

  document_type: "spring-boot-log4j2" # 定义写入 ES 时的 _type 值
  multiline:
    #pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'   # 指定匹配的表达式(匹配以 2017-11-15 08:04:23:889 时间格式开头的字符串)
    pattern: '^\s*("{)'                         # 指定匹配的表达式(匹配以 "{ 开头的字符串)
    negate: true                                # 是否匹配到
    match: after                                # 合并到上一行的末尾
    max_lines: 1000                             # 最大的行数
    timeout: 30s                                # 如果在规定的时候没有新的日志事件就不等待后面的日志

  fields:
    logsource: node1
    logtype: spring-boot-log4j2

- input_type: log
  paths:
    - /var/log/messages
    #- /var/log/*.log
  document_type: "syslog" # 定义写入 ES 时的 _type 值
  fields:
    logsource: node1
    logtype: syslog

#output.elasticsearch:
  #hosts: ["node1:9200"]

output.logstash:
  hosts: ["node1:10515"]

上面的配置需要注意几点:

  • pattern:配置的正则表达式,是为了合并异常信息(而不是单行显示),匹配以"{开头的字符串(判断是否 Json 格式),如果匹配不到的话,就进行合并行。
  • document_type:配置的是 Elasticsearch 的 Type 值,方便 Elasticsearch 对日志数据的归类。
  • logtype:新增的字段,用于 Filebeat 和 Logstash 之间传递参数,进行过滤的判断逻辑。

Logstash 示例配置(vi /etc/logstash/conf.d/logstash.conf):

input {
 beats {
   port => 10515
  }
}


filter {

  if [fields][logtype] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" 
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }


  if [fields][logtype] == "spring-boot-log4j2" {
    json {
      source => "message"
      target => "data"
    }
  }
}

output {
  if [fields][logtype] == "spring-boot-log4j2"{
    elasticsearch {
      hosts => ["127.0.0.1:9200"]
      index => "spring-boot-log4j2-%{+YYYY.MM.dd}"
    }
  }
  
  if [fields][logtype] == "syslog"{
    elasticsearch {
      hosts => ["127.0.0.1:9200"]
      index => "filebeat-%{+YYYY.MM.dd}"
    }
  }
}

上面的配置需要注意几点:

  • logstash.conf:配置文件可以配置多个,inputfilteroutput可以单独文件配置。
  • fields logtype:就是上面 Filebeat 配置的字段,这边用来判断服务来源,然后进行单独的处理。
  • filter:过滤器做了两件事,一个是使用grok插件,匹配数据和增加字段值,另一个就是使用json插件,将字符串转换成 Json 对象(会创建data层级结构,如果不想新建层级的话,删掉target配置即可)。
  • output:根据logtype判断,输出到指定的 Elasticsearch 地址,以及创建指定的索引。

简单总结下, Filebeat 是客户端,一般部署在 Service 所在服务器(有多少服务器,就有多少 Filebeat),不同 Service 配置不同的input_type(也可以配置一个),采集的数据源可以配置多个,然后 Filebeat 将采集的日志数据,传输到指定的 Logstash 进行过滤,最后将处理好的日志数据,存储到指定的 Elasticsearch。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com

×

喜欢就点赞,疼爱就打赏