乐趣区

关于运维:使用logstash的grok插件解析springboot日志

一、背景

咱们的应用程序通常每天都会产生十分多的日志,这些日志大多都是一个字符串的格局,那么咱们如果想从中提取一些有用的信息(比方:申请的工夫、日志的级别等),那么应该如果实现呢?

二、解决思路

针对以上的问题,咱们能够通过 正则表达式 来匹配咱们的日志内容,从而达到提取到有用的数据。而 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. 比方: (?<userName>[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

退出移动版