EFK日志平台搭建

打印 上一主题 下一主题

主题 531|帖子 531|积分 1593

title: EFK日志平台搭建
date: 2022-06-25 11:14:47
tags:
- EFK
categories:
- ElasticSearch
- FileBeat
- Kibana
前言

日志平台对于开发者来说自然不陌生,无论是处于开发阶段还是测试阶段亦或者是项目一上线后,一个优秀的日志平台能够节省大量的时间。
常见日志平台有ELK也就是ElasticSeatch+Logstash+Kibana组成的一套系统。这套系统劣势就在于Logstash的性能有些不是很理想,官方都有些嫌弃它emmm。
还有阿里的Logtail也是一个不错的选择,性能也是极好,当然是收费的,对于中小型企业或白嫖爱好者不太友好。
接下来就是本章的主角: EFK,它于ELK不同的是使用了FileBeat替换了Logstash。
本章就简单记录一下如何使用EFK整合日志文件,实现一个实时的日志查询平台。
注: EFK使用版本为7.6.0。
ElasticSearch安装

ES下载地址
下载解压即可使用.
如果有需要修改配置,可直接修改config/elasticsearch.yml文件。
  1. #配置的集群名称,默认是elasticsearch,es服务会通过广播方式自动连接在同一网段下的es服务,通过多播方式进行通信,同一网段下可以有多个集群,通过集群名称这个属性来区分不同的集群。
  2. cluster.name: zeus-platform
  3. # 当前ES服务节点的名称
  4. node.name: node-1
  5. # 指定该节点是否有资格被选举成为node
  6. #(注意这里只是设置成有资格, 不代表该node一定就是master),默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
  7. node.master: true
  8. # 指定该节点是否存储索引数据,默认为true。
  9. node.data: true
  10. # 设置默认索引分片个数,默认为5片。
  11. #index.number_of_shards: 5
  12. # 设置默认索引副本个数,默认为1个副本。如果采用默认设置,而你集群只配置了一台机器,那么集群的健康度为yellow,也就是所有的数据都是可用的,但是某些复制没有被分配
  13. # (健康度可用 curl 'localhost:9200/_cat/health?v' 查看, 分为绿色、黄色或红色。绿色代表一切正常,集群功能齐全,黄色意味着所有的数据都是可用的,但是某些复制没有被分配,红色则代表因为某些原因,某些数据不可用)。
  14. #index.number_of_replicas: 1
  15. # 设置临时文件的存储路径,默认是es根目录下的work文件夹。
  16. #path.work: /path/to/work
  17. # 设置日志文件的存储路径,默认是es根目录下的logs文件夹
  18. #path.logs: /path/to/logs
  19. # 设置插件的存放路径,默认是es根目录下的plugins文件夹, 插件在es里面普遍使用,用来增强原系统核心功能。
  20. #path.plugins: /path/to/plugins
  21. #允许访问的网域
  22. network.host: 0.0.0.0
  23. # 设置对外服务的http端口,默认为9200。
  24. http.port: 9200
  25. # 设置节点之间交互的tcp端口,默认是9300。
  26. transport.tcp.port: 9300
  27. #请确保 cluster.initial_master_nodes 中的值与 node.name 完全匹配
  28. cluster.initial_master_nodes: ["node-1"]
复制代码
如果需要修改es所占用内存可以修改config/jvm.options文件。
进入bin目录启动es.
  1. ./elasticsearch
  2. # 后台启动
  3. ./elasticsearch -d
复制代码
Ik分词器安装

下载地址
直接解压后放到ElasticSearch的``
Kibana安装

下载地址
直接解压
修改config/kibana.yml文件
  1. # 服务端口
  2. server.port: 5601
  3. # 服务host
  4. server.host: "localhost"
  5. # 所要连接的ElasticSearch集群地址
  6. elasticsearch.hosts: ["http://localhost:9200"]
  7. # 如果es需要认证,需要指定用户名和密码
  8. #elasticsearch.username: "kibana"
  9. #elasticsearch.password: "pass"
  10. # Kibana 中文汉化
  11. i18n.locale: "zh-CN"
复制代码
回到bin目录启动kibana
  1. ./kibana
复制代码
FileBeat安装及配置

下载地址
直接解压即可
1. 创建索引模板

也就是日志消息最终会被解析称的文档结构。
  1. # 创建filebeat zeus-music采集模块 解析日志所需要的模板
  2. PUT _template/zues_music_template
  3. {
  4.   "order": 1,
  5.   "index_patterns": [
  6.       "zues_music_log-*"
  7.   ],
  8.   "settings": {
  9.     "index":{
  10.       "number_of_shards": "1",
  11.       "auto_expand_replicas": "0-1",
  12.       "lifecycle":{
  13.         "name": "zues_music_log",
  14.         "rollover_alias":"zues_music_log"
  15.       },
  16.       "mapping":{
  17.         "total_fields":{
  18.           "limit": "10000"
  19.         }
  20.       }
  21.     }
  22.   },
  23.   //模板字段
  24.   "mappings": {
  25.     "properties": {
  26.       //服务名
  27.       "appName":{
  28.         "type": "keyword"
  29.       },
  30.       //追踪ID
  31.       "traceId": {
  32.         "type": "keyword"
  33.       },
  34.       //日志级别
  35.       "level":{
  36.         "type": "keyword"
  37.       },
  38.       //日志消息
  39.       "message":{
  40.         "type": "text",
  41.         "analyzer": "ik_max_word",
  42.         "search_analyzer": "ik_max_word",
  43.         "norms": false
  44.       },
  45.       //时间戳
  46.       "@timestamp":{
  47.         "type": "date"
  48.       }
  49.     }
  50.   },
  51.   "aliases": {
  52.    
  53.   }
  54. }
复制代码
2. 创建解析管道

用于用一段字符串中提取部分数据.
比如本项目日志格式如下:
  1. [zeus-music] 2022-06-25 18:39:29 INFO 4703 [default] [main] com.zero.music.ZeusMusicApplication 这是一条日志
复制代码
所对应的grok格式
  1. \[%{USERNAME:appName}\] %{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{NUMBER:pid} \[%{USERNAME:traceId}\]
复制代码
ElasticSearch会将这段日志解析成一个json格式
将zeus-music值 赋值到appName中
将2022-06-25 18:39:29 赋值到timestamp属性中
将INFO值 赋值到level属性中。
将4703 赋值到pid属性中。
将default赋值到traceId属性中。
其实就是一个映射过程。
最终会解析成:
  1. {
  2.   "appName": [
  3.     [
  4.       "zeus-music"
  5.     ]
  6.   ],
  7.   "timestamp": [
  8.     [
  9.       "2022-06-25 18:39:29"
  10.     ]
  11.   ],
  12.   "YEAR": [
  13.     [
  14.       "2022"
  15.     ]
  16.   ],
  17.   "MONTHNUM": [
  18.     [
  19.       "06"
  20.     ]
  21.   ],
  22.   "MONTHDAY": [
  23.     [
  24.       "25"
  25.     ]
  26.   ],
  27.   "HOUR": [
  28.     [
  29.       "18",
  30.       null
  31.     ]
  32.   ],
  33.   "MINUTE": [
  34.     [
  35.       "39",
  36.       null
  37.     ]
  38.   ],
  39.   "SECOND": [
  40.     [
  41.       "29"
  42.     ]
  43.   ],
  44.   "ISO8601_TIMEZONE": [
  45.     [
  46.       null
  47.     ]
  48.   ],
  49.   "level": [
  50.     [
  51.       "INFO"
  52.     ]
  53.   ],
  54.   "pid": [
  55.     [
  56.       "4703"
  57.     ]
  58.   ],
  59.   "BASE10NUM": [
  60.     [
  61.       "4703"
  62.     ]
  63.   ],
  64.   "traceId": [
  65.     [
  66.       "default"
  67.     ]
  68.   ]
  69. }
复制代码
在ElasticSearch中 创建 pipeline
  1. # 创建filebeat zeus-music采集模块 所需要用到的pipeline
  2. PUT /_ingest/pipeline/zeus_music_pipeline
  3. {
  4.   //描述
  5.   "description": "zeus_music_pipeline",
  6.   //处理过程
  7.   "processors": [
  8.     {
  9.       "grok": {
  10.         //所要处理的字段名,为zues_music_template中的message字段
  11.         "field": "message",
  12.         "patterns": [
  13.           "\\[%{USERNAME:appName}\\] %{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{NUMBER:pid} \\[%{USERNAME:traceId}\\]"
  14.           ],
  15.         "pattern_definitions": {
  16.           "ALL_CODE": "(\n)*"
  17.         }
  18.       },
  19.       //删除 filebeat自带的时间戳字段
  20.       "remove": {
  21.         "field": "@timestamp"
  22.       }
  23.     },
  24.     {
  25.       // 使用自己日志中的时间
  26.       "date": {
  27.         "field": "timestamp",
  28.         "formats": ["yyyy-MM-dd HH:mm:ss"],
  29.         "timezone": "Asia/Shanghai",
  30.         "target_field": "@timestamp"
  31.       },
  32.       "remove": {
  33.         "field": "timestamp"
  34.       }
  35.     }
  36.   ]
  37. }
复制代码
3. 创建所需配置文件

在filebeat目录下创建一个yml文件,作为启动时配置。
  1. touch zeus_music.yml
复制代码
然后将filebeat.yml文件内容拷贝过来,进行修改。
  1. #=========================== Filebeat inputs =============================
  2. ## 数据采集配置
  3. filebeat.inputs:
  4. #采集类型: 基于日志文件模式采集
  5. - type: log
  6.   # 启用该采集模块
  7.   enabled: true
  8.   # 所要采集的日志文件源
  9.   paths:
  10.     - /usr/local/myproject/music/zeus-music/logs/application/all/*.log
  11.   
  12.   # 该模块标签
  13.   tags: ['zeus-music']
  14.   # 多行日志的前缀,根据该前缀判断是否是同一条日志信息
  15.   multiline.pattern: ^\[zeus-music\]
  16.   # 开启多行错误日志合并
  17.   multiline.negate: true
  18.   multiline.match: after
  19.   #可选的附加字段。这些田地可以自由采摘
  20.   #向爬取的日志文件添加额外信息以进行过滤
  21.   fields:
  22.     # 日志收集到后,使用该模板来解析日志,映射成json文档,这样才能插入到es中
  23.     # 在es中定义该模板
  24.     index: "zues_music_template"
  25. #============================= Filebeat modules ===============================
  26. filebeat.config.modules:
  27.   # Glob pattern for configuration loading
  28.   path: ${path.config}/modules.d/*.yml
  29.   # Set to true to enable config reloading
  30.   reload.enabled: false
  31. #==================== Elasticsearch template setting ==========================
  32. # 索引模板配置
  33. setup.template.settings:
  34.   index.number_of_shards: 1
  35.   # 开启使用索引模板
  36.   setup.template.enabled: true
  37.   # 要使用的索引模板名称
  38.   setup.template.name: 'zues_music_template'
  39.   # 模板的 index_patterns
  40.   setup.template.pattern: 'zues_music_log-*'
  41.   # 关闭索引生命周期
  42.   setup.ilm.enabled: false
  43. output.elasticsearch:
  44.   # ES地址配置
  45.   hosts: ["localhost:9200"]
  46.   # 日志索引库生成规则,每日的日志生成一个索引
  47.   indices:
  48.     - index: 'zues_music_log-%{+yyyy.MM.dd}'
  49.       when.contains:
  50.         fields:
  51.           index: 'zues_music_template'
  52.         #tags: 'zeus-music'
  53.   # 日志解析所需的pipeline
  54.   pipeline: "zeus_music_pipeline"
  55. processors:
  56.   # 过滤一起自带的元素字段属性
  57.   - drop_fields:
  58.       fields: ["log","host","input","agent","ecs"]
  59.       ignore_missing: false
复制代码
ok,现在基本上已经配置完成.
4. 启动


  • 启动ES、Kibana程序。
  • 启动filebeat,加载配置好的配置文件。
  1. ./filebeat -e -c zeus_music.yml
复制代码
正常启动日志
  1. 2022-06-25T19:10:28.909+0800        INFO        log/harvester.go:297        Harvester started for file: /usr/local/myproject/music/zeus-music/logs/application/all/zeus-music.log
  2. 2022-06-25T19:10:29.921+0800        INFO        pipeline/output.go:95        Connecting to backoff(elasticsearch(http://localhost:9200))
  3. 2022-06-25T19:10:29.970+0800        INFO        elasticsearch/client.go:757        Attempting to connect to Elasticsearch version 7.6.0
  4. 2022-06-25T19:10:30.012+0800        INFO        [license]        licenser/es_callback.go:50        Elasticsearch license: Basic
  5. 2022-06-25T19:10:30.040+0800        INFO        [index-management]        idxmgmt/std.go:258        Auto ILM enable success.
  6. 2022-06-25T19:10:30.042+0800        INFO        [index-management.ilm]        ilm/std.go:139        do not generate ilm policy: exists=true, overwrite=false
  7. 2022-06-25T19:10:30.042+0800        INFO        [index-management]        idxmgmt/std.go:271        ILM policy successfully loaded.
  8. 2022-06-25T19:10:30.042+0800        INFO        [index-management]        idxmgmt/std.go:410        Set setup.template.name to '{filebeat-7.6.0 {now/d}-000001}' as ILM is enabled.
  9. 2022-06-25T19:10:30.043+0800        INFO        [index-management]        idxmgmt/std.go:415        Set setup.template.pattern to 'filebeat-7.6.0-*' as ILM is enabled.
  10. 2022-06-25T19:10:30.043+0800        INFO        [index-management]        idxmgmt/std.go:449        Set settings.index.lifecycle.rollover_alias in template to {filebeat-7.6.0 {now/d}-000001} as ILM is enabled.
  11. 2022-06-25T19:10:30.043+0800        INFO        [index-management]        idxmgmt/std.go:453        Set settings.index.lifecycle.name in template to {filebeat {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"30d","max_size":"50gb"}}}}}}} as ILM is enabled.
  12. 2022-06-25T19:10:30.048+0800        INFO        template/load.go:89        Template filebeat-7.6.0 already exists and will not be overwritten.
  13. 2022-06-25T19:10:30.048+0800        INFO        [index-management]        idxmgmt/std.go:295        Loaded index template.
  14. 2022-06-25T19:10:30.051+0800        INFO        [index-management]        idxmgmt/std.go:306        Write alias successfully generated.
  15. 2022-06-25T19:10:30.052+0800        INFO        pipeline/output.go:105        Connection to backoff(elasticsearch(http://localhost:9200)) established
复制代码
  1. 2022-06-25T19:10:28.909+0800        INFO        log/harvester.go:297        Harvester started for file: /usr/local/myproject/music/zeus-music/logs/application/all/zeus-music.log
复制代码
可以看到,已经正常加载了日志目录的日志文件。
不出意外的话,此时你的ElasticSearch已经生成了一个索引库zues_music_log-2022.06.25
5. 踩坑重点


  • 使用Grok解析日志一定要用日志文件内的日志信息为例,控制台与文件内的格式可能有些不同。
  • 通过Grok解析日志抽取的字段名称与ES模板中的字段名是对应的。切记!切记!切记! 我叼nmd。
使用Kibana美化日志查询

进入索引模式
创建索引模式
选择要查看的所有日志索引库

设置筛选字段
进入查看页面


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表