docker安装ELKF收集springboot日志(方法2-推荐)

时间:2021-7-3 作者:qvyue
  • 之前有写过一个方法(https://www.jianshu.com/p/17567e89733f),把日志输出到elk的配置嵌入在springboot服务代码里面,优点配置简单、易上手,缺点没能做到按springboot子项目名分索引,还考虑到会拉低服务运行效率,还是把配置剥离出来。
  • 增加redis缓存,由相对轻量、占用资源少,但功能较少的filebeat代替logstash收集日志,由于filebeat不支持对数据预处理,因此使用filebeat+logstash组合使用 ,最终整个日志收集过程为:各节点filebeat收集日志传送到redis作缓冲,logstash过滤日志,存储到Elasticsearch,最后使用kibana查看。
    docker安装ELKF收集springboot日志(方法2-推荐)
    流程图

环境介绍

主机 服务
192.168.1.10 elk + redis
192.168.1.20 springboot + filebeat

多模块maven项目结构大概如下:

project  #父工程
       -project-1    #子工程(1)
       -project-2    #子工程(2)
       ...
       -project-n    #子工程(n)

目录:

  • 安装filebeat
  • docker-compose安装redis
  • docker-compose安装ELK
    https://www.jianshu.com/p/2d78ce6bc504
  • 访问kibana查看日志信息

安装filebeat

1、配置yum源

cat > /etc/yum.repos.d/filebeat.repo 

2、执行安装

yum -y install filebeat

3、将配置文件 /etc/filebeat/filebeat.yml替换为以下内容 (删除一些注释内容;新增服务日志收集、输出到redis的配置)

#=========================== Filebeat inputs =============================
filebeat.inputs:
##############################################   Springboot服务日志   ##########################################################
#=========== project-1 项目日志 ==============
- type: log
  enabled: true
  paths:
    - /logs/project-1/project-1.log   #指定Springboot项目日志文件的位置
  multiline:
    #pattern: '^s*(d{4}|d{2})-(d{2}|[a-zA-Z]{3})-(d{2}|d{4})'   # 指定匹配的表达式(匹配例如以 1970-01-01 00:00:23:886 时间格式开头的字符串)
    pattern: '^['                              # 匹配以“[”开头的字符串
    #pattern: '^[*ERROR'                       #以日志级别(INFO、DEBUG、ERROR)匹配的字符串
    negate: true                                # 是否匹配到
    match: after                                # 合并到上一行的末尾, 为了error日志
    max_lines: 1000                             # 最大的行数
    timeout: 30s                                # 如果在规定的时候没有新的日志事件就不等待后面的日志
  fields:
     indexname: prod-project-1  #自定义字段;用于logstash,索引名
#=========== project-2 项目日志 ==============
- type: log
  enabled: true
  paths:
    - /logs/project-2/project-2.log
  multiline:
    pattern: '^['
    negate: true
    match: after
    max_lines: 1000
    timeout: 30s
  fields:
     indexname: prod-project-2    #自定义变量(indexname)

##############################################   Springboot服务日志   ##########################################################

#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

#==================== Elasticsearch template setting ==========================
setup.template.settings:
  index.number_of_shards: 3

#================================ Outputs =====================================
# Configure what output to use when sending the data collected by the beat.

##-------------------------- Redis output ------------------------------
output.redis:
   hosts: ["192.168.1.10:6379"]   #输出到redis,缓存
   #password: "123456"
   key: "filebeat:test"   #redis中日志数据的key值ֵ
   db: 0
   timeout: 5
   
#================================ Processors =====================================
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

4、启动并设置filebeat服务开机自启动

systemctl start filebeat
^start^enable

docker-compose安装redis

version: "3.3"
services:
  redis:
    image: redis
    container_name: elk_redis
    network_mode: "bridge"
    restart: always
    environment:
      - TZ=Asia/Shanghai
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - "6379:6379"
    volumes:
      - /data/redis/data:/data
      #- /data/redis/redis.conf:/usr/local/etc/redis/redis.conf   #可以设置密码
#运行redis
docker-compose up -d

docker-compose安装ELK

1、配置ELK

  • 基于文章(https://www.jianshu.com/p/2d78ce6bc504)安装好ELK
  • 将logstash/logstash-springboot.conf文件替换为以下内容
input {
    redis {
        data_type =>"list"
        key =>"filebeat:test"
        host =>"192.168.1.10"   #redis地址
        port => 6379
        #password => "123456"
        threads => "8"
        db => 0
        #codec => json
        }
}
filter {        
    #grok {         #Logstash常用filter插件grok正则捕获(过滤字段)
    #   match => ["message", "%{TIMESTAMP_ISO8601:time}s* s*%{NOTSPACE:thread-id}s* s*%{LOGLEVEL:level}s* s*%{JAVACLASS:class}s* - s*%{JAVALOGMESSAGE:logmessage}s*"]
    #}
    # grok的语法规则是:
    # %{语法:语义}
    # “语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,IP模式则会匹配出127.0.0.1这样的IP地址。

    #视自己实际情况删除字段,不在output中输出以下字段,节省空间;可全注释不作删除  
    mutate {       #Logstash常用filter插件mutate(重命名、删除、替换字段等)                
       #remove_field => [
       #                "beat",
       #                "meta",
       #                "prospector"
       #]
       remove_field => [
                         "log",
                         "[host][os]",
                         "@version",
                         "logmessage",
                         "class",
                         "thread-id",
                         "[agent][ephemeral_id]",
                         "[agent][hostname]",
                         "[agent][id]",
                         "[agent][name]",
                         "[ecs][version]",
                         "[host][architecture]",
                         "[host][containerized]",
                         "[host][id]",
                         "[host][ip]",
                         "[host][mac]",
                         "[host][name]"
        ]
    }
}
output {
    elasticsearch {
        hosts => ["192.168.1.10:9200"]
        index => ["%{[fields][indexname]}-%{+YYYY-MM-dd}"]
        #[fields][indexname]  #调用filebeat服务fields配置中自定义变量(indexname)的值为索引;即无需if判断各个服务使用什么索引。
    }
}
#output {
#    if "prod-project-1" in [tags]{
#        elasticsearch {
#            hosts => ["192.168.1.10:9200"]      
#            index => "prod-project-1-%{+yyyy.MM.dd}"      
#        }
#    }
#    
#    if "prod-project-2" in [tags]{
#        elasticsearch {
#            hosts => ["192.168.1.10:9200"]      
#            index => "prod-project-2-%{+yyyy.MM.dd}"      
#        }
#    }
#
#}

2 、 logstash中安装json_lines插件并重启logstash

docker exec -it elk_logstash /bin/bash -c  "cd /bin && logstash-plugin install logstash-codec-json_lines"
docker restart elk_logstash 
docker安装ELKF收集springboot日志(方法2-推荐)
插件成功安装

访问kibana 查看日志信息

  • 访问http://192.168.1.10:5601,创建各环境服务索引

  • 调用filebeat服务fields配置中自定义变量(indexname)的值为索引

    docker安装ELKF收集springboot日志(方法2-推荐)

    docker安装ELKF收集springboot日志(方法2-推荐)

    docker安装ELKF收集springboot日志(方法2-推荐)

    docker安装ELKF收集springboot日志(方法2-推荐)
    image.png
  • 补充:索引模板(logstash)默认输出很多不必要的字段,可按需通过logstash/logstash-springboot.conf文件里fileter插件mutate删除字段。

    docker安装ELKF收集springboot日志(方法2-推荐)
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。