关于运维:使用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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理