John Stone

1996-04-04

中国 河北

docker 安装EFK 进行 spring boot日志分析笔记

芦苇小白

Feb 4, 2021 11:11:00 AM 317

安装过程记录一下

服务器场景

  • spring boot 服务器:192.168.3.103
  • ELK 服务器:192.168.3.104
  • 官网:https://www.elastic.co/cn/elastic-stack

    安装过程

    1. 104服务器拉取ElasticSearch镜像

    注意:直接从docker hub搜索到的镜像版本可能比较低,这里以官方文档中给出的镜像为准:
    docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    
    尝试执行,发现找不到资源,不清楚什么鬼,若无法拉取,可以改成这样(后面的一些操作照葫芦画瓢):
    docker pull elasticsearch:7.10.1
    

    2. 创建并启动elasticsearch

    因为是本地开发用,所以部署为单机模式,若以集群模式部署可以参考这里
    discovery.type=single-node表示单节点(单机模式)。
    /home/dockerapps/elasticsearch/data:/usr/share/elasticsearch/data将物理机dockerapp下的目录映射到容器以进行持久化。
    另外可以不映射9300端口,这里的9300是集群用的。
    docker run -p 9200:9200 -p 9300:9300 -v /home/dockerapps/elasticsearch/data:/usr/share/elasticsearch/data -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    
    执行后出现AccessDeniedException,修改物理机目录对应权限
    chmod -R 777 /home/dockerapps/elasticsearch/data
    
    重新启动容器,问题解决。测试访问http://192.168.3.104:9200/
    得到es基本信息,至此es部署完毕:
    es信息

    3. 安装Kibana

    docker pull docker.elastic.co/kibana/kibana:7.10.1
    

    4. 创建并启动Kibana容器

    docker run -p 5601:5601  --name kibana docker.elastic.co/kibana/kibana:7.10.1
    
    此时通过日志发现无法连接到elasticsearch,因此做一个容器和物理机的路径映射,并修改一些配置
    docker cp kibana:/usr/share/kibana /home/dockerapps
    docker stop kibana
    docker rm kibana
    docker run -p 5601:5601 -v /home/dockerapps/kibana:/usr/share/kibana --name kibana docker.elastic.co/kibana/kibana:7.10.1
    
    修改kibana/config/kibana.yml,指定elasticsearch.hosts的正确地址并重启容器。
    访问http://192.168.3.104:5601 进入kibana管理页面,显示如下表示成功
    kibana 安装完毕首次访问

    5. 103服务器安装filebeat

    这里选择filebeat作为日志抓取工具,它更轻量。
    docker pull docker.elastic.co/beats/filebeat:7.10.1
    

    6. 创建并启动filebeat

    注意映射spring boot的日志存放路径和elasticsearch地址。
    docker run -d \
    --name=filebeat \
    --user=root \
    --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
    --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
    --volume="/root/dockerapps/services/logs:/data/logs" \
    docker.elastic.co/beats/filebeat:7.10.1 filebeat -e -strict.perms=false \
    -E output.elasticsearch.hosts=["192.168.3.104:9200"]
    

    7. 修改filebeat配置

    修改filebeat.yml, 指定要抓取的日志以及处理规则。
    因为我已经在启动参数里指定了output.elasticsearch.hosts, 因此yml文件中这个地方的配置不做更改。
filebeat:
  inputs:
    # 文件系统日志抓取
    - type: log
      enabled: true
      paths:
        - /data/logs/test-file.log
      tags: ["file"]
      multiline:
        pattern: ^[0-9]{4}
        negate: true
        match: after
        timeout: 3s

    # 试卷仓库日志抓取
    - type: log
      enabled: true
      paths:
        - /data/logs/test-store.log
      tags: ["store"]
      multiline:
        pattern: ^[0-9]{4}
        negate: true
        match: after
        timeout: 3s

    # 用户中心日志抓取
    - type: log
      enabled: true
      paths:
        - /data/logs/test-uc.log
      tags: ["uc"]
      multiline:
        pattern: ^[0-9]{4}
        negate: true
        match: after
        timeout: 3s
filebeat.config:
 modules:
   path: ${path.config}/modules.d/*.yml
   reload.enabled: false

processors:
  # 自定义字段 - 取日志中的时间
  - script:
      lang: javascript
      id: my_filter
      tag: enable
      source: >
        function process(event) {
            var str= event.Get("message");
            var time =str.substr(0, 23);
            event.Put("log_time",time);
        }
  # 将自定义的字段替换到系统默认时间戳
  - timestamp:
      field: log_time
      timezone: Asia/Shanghai
      layouts:
        - '2006-01-02 15:04:05'
        - '2006-01-02 15:04:05.999'
      test:
        - '2019-06-22 16:33:51'
  - add_cloud_metadata: ~
  - add_docker_metadata: ~

output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
  username: '${ELASTICSEARCH_USERNAME:}'
  password: '${ELASTICSEARCH_PASSWORD:}'

重启filebeat容器,进入[kibana>Stack Management>Index patterns] 添加filebeat索引并查看日志。

最终预览

kibana 日志分析
kibana 实时日志流

拖动滑块验证
验证通过 验证失败

全部评论