zoukankan      html  css  js  c++  java
  • logstash grok解析自定义日志

    网上关于grok解析自定义日志的资料比较呆板,不符合项目的应用,正好我这边项目要用到,所以记录一下。

    日志格式:

    想从日志中过滤并分析有用的信息,日志格式如下:
    2021-05-20 09:39:08.232 [controller,e89aa194965a41b5,e89aa194965a41b5,haima-rpc-2799] [INFO ] [DISPATCHER-LOGGER] api request enter, requestBody=ApiRequestBody[operation=com.haima.cloudplayer.controller.data.sync,param={type=com.haima.cloudplayer.controller.dal.mysql.domain.InstanceStatusDo, timestamp=1621415358000}]
     
    2021-05-20 09:39:08.234 [controller,e89aa194965a41b5,e89aa194965a41b5,haima-rpc-2799] [INFO ] [DISPATCHER-LOGGER] api request exit, requestBody=ApiRequestBody[operation=com.haima.cloudplayer.controller.data.sync,param={type=com.haima.cloudplayer.controller.dal.mysql.domain.InstanceStatusDo, timestamp=1621415358000}], responseBody=ApiResponseBody[operation=com.haima.cloudplayer.controller.data.sync,code=1000,errorCode=<null>,message=ok,memo=操作成功,response=OperationResult[success=true,value=[],reason=<null>,reasonMessage=<null>]], takes time= 2 ms.
    这是两条日志,一个是API的同步调用,一个是调用后返回,在返回时,有“takes time= 2 ms”表示该接口耗时2ms。日志中还有调用的api接口以及参数信息,并且在测试时,我们重点关注的是“api request exit”,不想要“api request enter“信息。

    logstash配置文件内容

    input {
    kafka {
    bootstrap_servers => "172.16.2.33:9092"
    topics => "paas_api_time"
    auto_offset_reset => "earliest"
    codec => "json"
    group_id => "controller_log"
    consumer_threads => 1
    decorate_events => true
    }
    }
     
    filter {
    if ([message] =~ "api request enter") {
    drop {}
    }
    else {
    grok {
    match => {
    "message" => "(?<api_name>(?<=operation=).*?(?=,)).*?(?<response_code>(?<=code=).*?(?=,)).*?(?<spend_time>(?<=takes time= ).*?(?= ms))"
    }
     
    }
    }
    }
     
    output {
    elasticsearch {
    hosts => ["http://172.16.208.152:9200"]
    index => "paas_api_time"
    user => "elastic"
    password => "elastic"
    }
    }
     

    正则语法解析

    (?<api_name>(?<=operation=).*?(?=,)).*?(?<response_code>(?<=code=).*?(?=,)).*?(?<spend_time>(?<=takes time= ).*?(?= ms))
    是分别获取类名,响应码,耗时的三个命令组合,命令之间用“.*?”组合
    (?<api_name>(?<=operation=).*?(?=,)):是截取“operation=”到“,”之间的字符,并且采用不贪婪模式“.*?”中的“?”就是采用不贪婪模式。
    后面的“.*?”也是这个意思,就可以把自己想获得的信息提取出来,而不用一个一个按照日志的字段来进行解析,因为生产上的日志随着参数不同,内容可能会变化。采用这种方式,就非常方便,这个费了很大的精力才摸索出来的,多练习,到思考,必有所得!

  • 相关阅读:
    java基础学习总结——面向对象1
    java基础学习总结——基础语法2
    java基础学习总结——基础语法1
    java基础学习总结——开篇
    java基础学习总结——java环境变量配置
    Java基础加强总结(二)——泛型
    Java基础加强总结(一)——注解(Annotation)
    Web开发中设置快捷键来增强用户体验
    SQLServer2005中的CTE递归查询得到一棵树
    Jquery操作table
  • 原文地址:https://www.cnblogs.com/devtest/p/14850525.html
Copyright © 2011-2022 走看看