一、背景

我们的应用程序通常每天都会产生非常多的日志,这些日志大多都是一个字符串的格式,那么我们如果想从中提取一些有用的信息(比如:请求的时间、日志的级别等),那么应该如果实现呢?

二、解决思路

针对以上的问题,我们可以通过正则表达式来匹配我们的日志内容,从而达到提取到有用的数据。而 logstashgrok正好可以帮助我们做到这种事。

如果我们的日志是有一定的格式的,也可以使用 dissert 插件来解决,这个是根据某个分隔符来获取日志内容的。

三、前置知识

  1. grok插件为我们提供了大概120可用的模式。可以简单理解,grok提供好了120种定义好的可用这则。

    1. 比如: INT 对应的正则(?:[+-]?(?:[0-9]+)) 表示 正负数字。
    2. grok 提供好的可用模式。 https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
  2. grok语法的格式
    1. %{SYNTAX:SEMANTIC}

      1. SYNTAX 表示需要匹配文本的格式。比如: 文本内容: 123 可以被 INT匹配到。
      2. SEMANTIC表示 SYNTAX 匹配到文本后,将内容保存到那个字段中。比如:%{INT:age} 则匹配到后的age字段有值。
  3. 自定义grok模式(custom patterns)
    1. 语法格式:(?<field_name>the pattern here)
    2. 比如: (?[a-zA-Z]{3,5}) 用户名只能是 3到5位的字母
  4. grok调试网站
    1. 可以在此网站调试我们的grok表达式是否编写正确 http://grokdebug.herokuapp.com/
  5. grok解析失败和超时会增加如下标签
    1. 解析失败,会在生成数据中的tags中介增加 _grokparsefailure标签
    2. 解析超时,会在生成数据中的tags中增加_groktimeout标签

四、实现步骤

1、准备测试数据

[9708] 2021-05-13 11:14:51.873 [http-nio-8080-exec-1] INFO  org.springframework.web.servlet.DispatcherServlet#initServletBean:547 -Completed initialization in 1 ms
[9708] 2021-05-13 11:14:51.910 [http-nio-8080-exec-1] ERROR com.huan.study.LogController#showLog:32 -请求:[/showLog]发生了异常
java.lang.ArithmeticException: / by zero
at com.huan.study.LogController.showLog(LogController.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

2、编写grok表达式

(?m)^\[%{INT:pid}\]%{SPACE}%{TIMESTAMP_ISO8601:createTime}%{SPACE}\[%{DATA:threadName}\]%{SPACE}%{LOGLEVEL:LEVEL}%{SPACE}%{JAVACLASS:javaClass}#(?<methodName>[a-zA-Z_]+):%{INT:linenumber}%{SPACE}-%{GREEDYDATA:msg}

注意️:

1、如果要匹配多行文本,比如java中的异常堆栈,则在表达式前需要加上(?m)

2、使用\可以进行转义。

3、其中的(?<methodName>[a-zA-Z_]+) methodName 为我们自定义的正则。

3、编写 logstash pipeline文件

input {
file {
id => "mutate-id"
path => ["/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/filter-grok/*.log"]
start_position => "beginning"
sincedb_path => "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/filter-grok/sincedb.db"
codec => multiline {
pattern => "^\[+"
negate => "true"
what => "previous"
charset => "UTF-8"
auto_flush_interval => 2
}
}
} filter { grok {
match => {
"message" => "(?m)^\[%{INT:pid}\]%{SPACE}%{TIMESTAMP_ISO8601:createTime}%{SPACE}\[%{DATA:threadName}\]%{SPACE}%{LOGLEVEL:LEVEL}%{SPACE}%{JAVACLASS:javaClass}#(?<methodName>[a-zA-Z_]+):%{INT:linenumber}%{SPACE}-%{GREEDYDATA:msg}"
}
}
} output {
stdout {
codec => rubydebug { }
}
}

4、查看运行结果

五、代码地址

1、SpringBoot程序测试地址

六、参考网址

1、https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

2、http://grokdebug.herokuapp.com/

3、https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

使用logstash的grok插件解析springboot日志的更多相关文章

  1. Logstash使用grok插件解析Nginx日志

    grok表达式的打印复制格式的完整语法是下面这样的: %{PATTERN_NAME:capture_name:data_type}data_type 目前只支持两个值:int 和 float. 在线g ...

  2. logstash 使用grok正则解析日志

    http://xiaorui.cc/2015/01/27/logstash%E4%BD%BF%E7%94%A8grok%E6%AD%A3%E5%88%99%E8%A7%A3%E6%9E%90%E6%9 ...

  3. 关于Logstash中grok插件的正则表达式例子

    一.前言 近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK(Elasticsearch, Logstash, Kibana)莫属. Logstash负责采集日志,Ela ...

  4. Logstash使用grok解析IIS日志

    Logstash使用grok解析IIS日志 1. 安装配置 安装Logstash前请确认Elasticsearch已经安装正确,参见RedHat6.4安装Elasticsearch5.2.0. 下载链 ...

  5. Logstash的grok以及Ruby

    logstash的grok插件的用途是提取字段,将非格式的内容进行格式化, input { file { path => "/var/log/http.log" } } fi ...

  6. Logstash收集nginx日志之使用grok过滤插件解析日志

    grok作为一个logstash的过滤插件,支持根据模式解析文本日志行,拆成字段. nginx日志的配置: log_format main '$remote_addr - $remote_user [ ...

  7. logstash实战filter插件之grok(收集apache日志)

    有些日志(比如apache)不像nginx那样支持json可以使用grok插件 grok利用正则表达式就行匹配拆分 预定义的位置在 /opt/logstash/vendor/bundle/jruby/ ...

  8. Filebeat+Logstash+ElasticSearch+Kibana搭建Apache访问日志解析平台

    对于ELK还不太熟悉的同学可以参考我前面的两篇文章ElasticSearch + Logstash + Kibana 搭建笔记.Log stash学习笔记(一),本文搭建了一套专门访问Apache的访 ...

  9. logstash -grok插件语法介绍

      介绍 logstash拥有丰富的filter插件,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的 logstash 事件到后续的流程中去!Grok 是 Logsta ...

随机推荐

  1. Spring中使用@within与@target的一些区别

    目录 背景 模拟项目例子 看看使用@within和@target的区别 @within @target @target 看起来跟合理一点 通知方法中注解参数的值为什么是不一样的 想用@within,但 ...

  2. JAVA反序列化漏洞基础原理

    JAVA反序列化漏洞基础原理 1.1 什么是序列化和反序列化? Java序列化是指把Java对象转换为字节序列的过程: Java反序列化是指把字节序列恢复为Java对象的过程: 1.2 为什么要序列化 ...

  3. Spring Cloud Eureka 之常用配置解析

    [原创内容,转载.引用请注明出处] 1. 配置项解析 1.1 通用配置 # 应用名称,将会显示在Eureka界面的应用名称列 spring.application.name=config-servic ...

  4. undefined和null

    undefined和null undefined的情景: 声明变量为赋值 var name; console.og(name); //undefined 访问对象上不存在的属性 var obj={} ...

  5. discuz连接微博登陆,第三方登录

    首先记一下discuz的ucenter的架构: ucenter 是用户中心.其他的应用都是和ucenter连接,包括discuz也是ucenter的一个应用(默认的); 第一步: 在ucenter新建 ...

  6. 手机访问pc网站自动跳转手机端网站PHP代码

    $agent = $_SERVER['HTTP_USER_AGENT']; if(strpos($agent,"comFront") strpos($agent,"iPh ...

  7. Linux系列(28) - 软件包简介

    软件包分类 源码包(脚本安装包) 优点 开源,如果有足够的能力,可以修改源代码: 可以自由选择所需的功能: 软件是编译安装,所以更加适合自己的系统,更加稳定.效率更高: 卸载方便: 缺点 安装过程步骤 ...

  8. shell脚本中 /dev/null 的用途

    /dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同样,/dev/nul ...

  9. Gitee自动化部署python脚本

    一.前期准备 1.1 安装环境 1.安装python3 2.打开命令行安装selenium pip install selenium 二.python代码 2.1 源码 #!/usr/bin/pyth ...

  10. HTML 网页开发、CSS 基础语法——八.HTML基本语法

    表格制作 1.表格基础 创建一个简单的表格至少有三个标签组成,分别是<table>,<tr>,<td>标签. table:表格,定义的是整个的表格大结构. tr:t ...