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

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

环境介绍

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

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

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

目录:


安装filebeat

1、配置yum源

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

[filebeat]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=0
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

EOF

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

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 
插件成功安装

访问kibana 查看日志信息

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

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





    image.png
  • 补充:索引模板(logstash)默认输出很多不必要的字段,可按需通过logstash/logstash-springboot.conf文件里fileter插件mutate删除字段。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容