前言

前段时间不是搭建了一套ELK日志分析系统嘛,然后日志是通过beats读取落地日志推送给logstash,然后再由logstash推送到elasticsearch索引库,最后通过kibana可视化工具进行日志的分析查看,搭建过程详见Springboot/Springcloud整合ELK平台,(Filebeat方式)日志采集及管理(Elasticsearch+Logstash+Filebeat+Kibana)

下面这张图是kibana展示的结果,这里我们发现有好多无用和重复的字段,并且我的日志字段还得展开才能看到,这部分肯定可以优化。然后我的Springboot/Springcloud整合ELK平台,(Filebeat方式)日志采集及管理(Elasticsearch+Logstash+Filebeat+Kibana)这篇文章评论区也有个小伙伴问我beats可以直接推送到elasticsearch,为什么还要通过logstash?
在这里插入图片描述

在这个小伙伴评论之前,我就已经优化好了日志, 这篇文章记录一下我解析优化日志的过程!

在这里插入图片描述
在这里插入图片描述

优化结果

在这里插入图片描述

实现

首先,我们知道logstash有很多的过滤插件
插件说明
date日期解析
grok正则匹配解析
dissect分隔符解析
mutate对字段作处理,比如重命名、删除、替换
json按照json解析字段内容到指定字段中
geoip增加地理位置数据
ruby利用ruby代码来动态修改Logstash Event

这里我参考了这两篇文章的示例,之后对我的logstash日志进行修改
Logstash filter 的使用
logstash配置详解

  • 这是我的输出日志
2022-06-10 11:00:47.974 ERROR [main] com.alibaba.nacos.client.config.http.ServerHttpAgent : [NACOS SocketTimeoutException httpGet] currentServerAddr:http://127.0.0.1:8848, err : connect timed out
# log4j2 
%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%thread] %style{%logger{36}}{cyan} : %msg%n
# logstash配置中解析
%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{JAVALOGMESSAGE:thread} %{JAVALOGMESSAGE:style} : %{JAVALOGMESSAGE:msg}

logstash

input {
  beats {
    port => 5044
    type => "logs"
  }
  tcp {
    mode => "server"
    host => "127.0.0.1"
    port => 4560
    codec => json_lines
  }
}
filter {
  //解析日志
  grok{
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{JAVALOGMESSAGE:thread} %{JAVALOGMESSAGE:style} : %{JAVALOGMESSAGE:msg}" }
  }
  //将入库时间替换成我们日志中的时间
  date {
    match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss,S", "ISO8601" ]
  } 
  //删除多余字段
  mutate { 
    remove_field => "agent"
    remove_field => "ecs" 
    remove_field => "@version"
    remove_field => "host"    
    remove_field => "path"
    remove_field => "log"
    remove_field => "message"
  }
}
output {
  elasticsearch {
	hosts => ["http://127.0.0.1:9200"]
    user => "elastic"
    passwrod => "123456"
	index => "%{[fields][servicename]}-%{+yyyy.MM.dd}"
  }
}

filebeat

添加配置
multiline:
pattern: ‘^\s*(\d{4}|\d{2})-(\d{2}|[a-zA-Z]{3})-(\d{2}|\d{4})’ 符合java日志换行规则

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - E:\ideaProject\SpringCloudAlibaba2022\logs\order-service\info.log
    #- c:\programdata\elasticsearch\logs\*
  fields:
    servicename: order-service
  multiline:
    pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'
    negate: true
    match: after
    timeout: 5s
- type: log
  enabled: true
  paths:
    - E:\ideaProject\SpringCloudAlibaba2022\logs\user-service\info.log
    #- c:\programdata\elasticsearch\logs\*
  fields:
    servicename: user-service
  multiline:
    pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'
    negate: true
    match: after
    timeout: 5s

完成以上这些配置修改之后,重启filebeat、logstash

有任何问题随时私信联系!
原创不易,如果有帮助到你的话点个赞再走吧!感谢!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐