使用docker-elk搭建并实践ELK日志分析框架

隐身守侯 提交于 2020-04-09 12:36:28

1. ELK日志分析简介

1.1 ELK日志分析概述

  ELK可运行于分布式系统之上,通过搜集、过滤、传输、储存,对海量系统和组件日志进行集中管理和准实时搜索、分析,使用搜索、监控、事件消息和报表等简单易用的功能,帮助运维人员进行线上业务的准实时监控、业务异常时及时定位原因、排除故障、程序研发时跟踪分析Bug、业务趋势分析、深度挖掘日志的大数据价值。ELK主要可解决的问题如下:1.日志查询,问题排查,上线检查.2.服务器监控,应用监控,错误报警,Bug管理. 3.性能分析,安全漏洞分析。综上,ELK是一套方便、易用的日志分析开源解决方案。

1.2 ELK主要组件介绍

  生产环境中,ELK通常由以下4个组件构成:

1.2.1 ElasticSearch组件

  ElasticSearch是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

1.2.2 Logstash组件

  Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具,如下图所示:

1.2.3 Kibana组件

  Kibana是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

1.2.4 Filebeat组件

  Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件,并且转发这些信息到赋予他的输出位置(常见如elasticsearch、kafka或logstarsh)中存放。Filebeat等同于一个轻量级的logstash,当你需要收集信息的机器配置或日志资源数量不是特别多时,最佳实践是使用filebeat来代替logstash收集日志,filebeat十分小巧且稳定。下图是filebeat的工作流程:当你开启filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点。

2. Docker-elk搭建实验环境

2.1 sebp/elk镜像的获取

  外网环境下,执行命令:docker pull sebp/elk 将镜像pull到本地来。

2.2 制作上报日志到ELK的filebeat镜像

(1) 本地Window在官网下载filebeat,然后通过SecureCRT导入tar.gz压缩包文件并在linux中解压。

(2) 安装JDK 镜像
  与elk镜像同理,将JDK的官方镜像pull到本地,作为基础镜像就好:java:8u111-jdk .
(3) 开放filebeat访问ELK的权限
  在我们使用的elk镜像源码的git仓库中(地址是https://github.com/spujadas/elk-docker),下载该镜像的logstash-beats.crt文件来给filebeat提供授权,制作镜像时要放在指定目录下。




(4) 修改配置文件filebeat.yml
  首先配置抓取WEB日志的目录:

    - type: log
      # Change to true to enable this prospector configuration.
      enabled: true
      # Paths that should be crawled and fetched. Glob based paths.
      paths:
    - /applog/*.log

  接下来为filebeat提供ELK授权:

    #output.logstash:
      # The Logstash hosts
      hosts: ["localhost:5044"]
      # Optional SSL. By default is off.
      # List of root certificates for HTTPS server verifications
      ssl.certificate_authorities: ["/home/hik/docker/logstash-beats.crt"]

(5) 制作filebeat和web服务的启动脚本
  编写启动filebeat和web应用的脚本filebeat-springboot-entrypoint.sh,在docker容器启动的时候执行,这样就能让fliebeat和web应用在容器启动后也自动启动了:

echo "start filebeat now ..."
nohup /opt/filebeat-6.2.2-linux-x86_64/filebeat -e -c /opt/filebeat-6.2.2-linux-x86_64/filebeat.yml >/dev/null 2>&1 &
echo "start springboot jar now ..."
java -jar $1

(6) 通过Dockerfile完成filebeat镜像构建
  Dockerfile脚本的内容如下:

#基础镜像
FROM java:8u111-jdk

#定义日志文件存放目录,这个要和web应用的日志配置一致
ENV APP_LOG_PATH /applog

#定义证书文件目录,这个要和filebeat.yml的配置一致
ENV FILE_BEAT_CRT_PATH /etc/pki/tls/certs

#定义filebeat文件夹名称
ENV FILE_BEAT_PACKAGE_NAME filebeat-6.2.2-linux-x86_64

#定义证书文件名称
ENV FILE_BEAT_CRT_NAME logstash-beats.crt

#定义启动文件名称
ENV ENTRYPOINT_FILE_NAME filebeat-springboot-entrypoint.sh

#定义时区参数
ENV TZ=Asia/Shanghai

#设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#使之生效
RUN . /etc/profile

#创建日志目录文件夹
RUN mkdir $APP_LOG_PATH

#存放证书的文件夹
RUN mkdir -p $FILE_BEAT_CRT_PATH

#从当前目录將证书文件复制到镜像中
COPY ./$FILE_BEAT_CRT_NAME $FILE_BEAT_CRT_PATH/

#从当前目录將filebeat文件复制到镜像中
COPY ./$FILE_BEAT_PACKAGE_NAME /opt/$FILE_BEAT_PACKAGE_NAME

#复制启动文件
COPY ./$ENTRYPOINT_FILE_NAME /$ENTRYPOINT_FILE_NAME

#赋写权限
RUN chmod a+x /$ENTRYPOINT_FILE_NAME

  如上所述,前面我们准备的材料在脚本都统统用上了;将filebeat-6.2.2-linux-x86_64 文件夹、Dockerfile文件、filebeat-springboot-entrypoint.sh文件、logstash-beats.crt放在同一目录下,执行以下命令即可将镜像构建成功:

docker build -t springboot-app-filebeat:0.0.3 .

  注意:最后有一个空格和一个点,这代表当前路径,不加的话会构建失败。

2.3 通过2.2制作web工程镜像

(1) 用maven创建一个springboot的web工程,在工程的目录src/main/resources下增加一个logback.xml文件,用于配置日志有关的参数。日志文件的目录设置在/applog/,和filebeat.yml中搜集日志的目录保持一致(完成)

<!-- 文件日志:输出全部日志到文件 -->
<appender name="FILE"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/applog/output.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>${ENCODER_PATTERN}</pattern>
    </encoder>
</appender>

(2) 在web工程的pom.xml中,新增一个插件docker-maven-plugin,用于将当前工程构建成的jar做成docker镜像文件,基础镜像使用2.2中构建好的filebeat镜像。

<!--新增的docker maven插件-->
<plugin>
   <groupId>com.spotify</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>0.4.12</version>
   <!--docker镜像相关的配置信息-->
   <configuration>
      <!--镜像名,这里用工程名-->
      <imageName>bolingcavalry/${project.artifactId}</imageName>
      <!--TAG,这里用工程版本号-->
      <imageTags>
         <imageTag>${project.version}</imageTag>
      </imageTags>
      <!--镜像的FROM,使用springboot-app-filebeat:0.0.3-->
      <baseImage>springboot-app-filebeat:0.0.3</baseImage>
      <!--该镜像的容器启动后,直接运行spring boot工程-->
      <entryPoint>["sh","/filebeat-springboot-entrypoint.sh","/${project.build.finalName}.jar"]</entryPoint>
      <!--构建镜像的配置信息-->
      <dockerHost>http://10.66.35.173:2375</dockerHost>
      <resources>
         <resource>
            <targetPath>/</targetPath>
            <directory>${project.build.directory}</directory>
            <include>${project.build.finalName}.jar</include>
         </resource>
      </resources>
   </configuration>
</plugin>

(3) 新增HelloController.java用于响应web请求,并且每次收到请求时都会打印一行日志到指定文件中。

 @RequestMapping(value="/hello/{username}",method= RequestMethod.GET)
public String hello(@PathVariable String username) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String time = sdf.format(new Date());
    logger.info("execute hello from {} - {}", username, time);
    return "hello " + username + ", " + time;
}

(4) 在pom.xml文件所在目录执行以下命令,即可编译构建当前工程,并制作成docker镜像:shell mvn clean package -U -DskipTests docker:build

2.4 连接2.1和2.3实现ELK管理WEB服务

  通过docker-compose.yml来启动ELK和最终镜像。完成两者的连接,使web工程在ELK容器中运行。

vi docker-compose.yml

version: '2'
services:
  elk:
    image: elk:6.4.2
    ports:
      - "5601:5601"
      - "9200:9200"
    restart: always
  webapp:
    image: elkdemo:1.0
    depends_on:
      - elk
    links:
      - elk:elkhost
    ports:
      - "18080:8080"
restart: always

启动:shell sudo docker-compose up -d

注意:1.ELK server容器的5601端口映射为当前电脑的5601端口,用于访问kibana;2.web应用镜像使用link参数绑定ELK server容器,3使用webapp作为域名的地方都会被解析为ELK server容器的IP地址;3.web容器的8080映射为当前电脑的18080端口,访问当前电脑的18080端口即可访问web服务。

  至此,整个ELK环境所需的镜像和脚本都已做好,web服务和ELK服务也都成功运行起来了,实验环境搭建完毕。

3. Logstash与filter插件应用

3.1 Logstash常用filter插件

  Filter是Logstash功能强大的主要原因,它可以对Logstash Event进行丰富的处理,比如说解析数据、删除字段、类型转换等等,常见的有如下几个:

(1)date: 日志解析,从字段解析日期以用作事件的Logstash时间戳。
(2)grok:正则匹配解析。将非结构化事件数据分析到字段中。 这个工具非常适用于系统日志,Apache和其他网络服务器日志,MySQL日志,以及通常为人类而不是计算机消耗的任何日志格式。
(3)dissect:分割符解析。基于分隔符原理解析数据,解决grok解析时消耗过多cpu资源的问题,使用分隔符将非结构化事件数据提取到字段中。解剖过滤器不使用正则表达式,速度非常快。 但是,如果数据的结构因行而异,grok过滤器更合适。dissect的应用有一定的局限性:主要适用于每行格式相似且分隔符明确简单的场景 。
(4)mutate:对字段做处理,比如重命名、删除、替换等。
(5)json:按照json解析字段内容到指定字段中。
(6)geoip:增加地理位置数据。根据ip地址提供对应的地域信息,比如经纬度、城市名等,方便进行地理数据分析。




3.2 Logstash日志过滤实践

(1) 修改filebeat.yml文件,将filebeat的输出从elasticsearch改为logstash:

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  # hosts: ["localhost:9200"]   #注释掉这句,filebeat不再输出到elasticsearch,改为向logstash输出

  # Optional protocol and basic auth credentials.
  #protocol: "https"
  #username: "elastic"
  #password: "changeme"

#----------------------------- Logstash output --------------------------------
#output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  ssl.certificate_authorities: ["/home/hik/docker/logstash-beats.crt"]

(2) 查看正在运行中的容器,找到ELK容器elk:6.4.2

hik@root:~/docker/filebeat-6.2.2-linux-x86_64$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
c02f0f0f6047        elkdemo:1.0         "sh /filebeat-spring…"   8 weeks ago         Up About an hour    0.0.0.0:18080->8080/tcp                                              docker_webapp_1
308de13c21e0        elk:6.4.2           "/usr/local/bin/star…"   8 weeks ago         Up About an hour    0.0.0.0:5601->5601/tcp, 5044/tcp, 9300/tcp, 0.0.0.0:9200->9200/tcp   docker_elk_1

(3) 进入ELK容器: sudo docker exec –it /bin/bash ,此处的container-name为308de13c21e0

hik@root:~/docker/filebeat-6.2.2-linux-x86_64$ sudo docker exec -it 308de13c21e0 /bin/bash
root@308de13c21e0:/# ls
bd_build  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

(4) 修改/opt/logstash/config路径下的logstash-sample.conf,增加JSON过滤插件

#本操作使用json插件,处理结果删除掉message字段。
input {
  beats {
    port => 5044
  }
}
filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

(5) 通过配置文件来启动logstash,若出现端口占用需要先杀掉此前占用5044端口的进程:

bin/logstash -f logstash-sample.conf

(6) 处理结果为

 {
  "_index": "filebeat-2019.05.22",
  "_type": "doc",
  "_id": "CnCs3WoBtWWwz0jz3Y4z",
  "_version": 1,
  "_score": null,
  "_source": {
    "beat": {
      "name": "be58d50b9f23",
      "hostname": "be58d50b9f23",
      "version": "6.2.2"
    },
    "tags": [
      "beats_input_codec_plain_applied"
    ],
    "@version": "1",
    "source": "/applog/output.2019-05-22.log",
    "@timestamp": "2019-05-22T03:53:09.901Z",
    "offset": 2722,
    "prospector": {
      "type": "log"
    },
    "host": "be58d50b9f23"
  },
  "fields": {
    "@timestamp": [
      "2019-05-22T03:53:09.901Z"
    ]
  },
  "sort": [
    1558497189901
  ]
}

4. 小结

  本文首先简单介绍了ELK日志分析的总体框架和重要组件,接下来通过docker-elk完成了日志分析平台的实验环境搭建,最后对logstash和它的filter插件做了简单介绍和实验验证。后续会继续研究ELK的配置优化和插件运用,为后续ELK集成的WEB打好基础。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!