• 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=”到“,”之间的字符,并且采用不贪婪模式“.*?”中的“?”就是采用不贪婪模式。
    后面的“.*?”也是这个意思,就可以把自己想获得的信息提取出来,而不用一个一个按照日志的字段来进行解析,因为生产上的日志随着参数不同,内容可能会变化。采用这种方式,就非常方便,这个费了很大的精力才摸索出来的,多练习,到思考,必有所得!

  • 相关阅读:
    转:马云邮件全文
    XIFF资料1
    代码还是请一个字母一个字母敲(如果您只想混口饭吃就不要读了本文只面向想成为hacker的程序员)
    一个本来很有希望的项目噶然而止,脑子一下子空了
    转:进京感受一个技术人职业发展心得
    java中定义接口
    两个大数相乘(纯C实现)
    [ios学习入门1]hello,word!
    两台电脑通信的连接过程
    谁说引用不可改变
  • 原文地址:https://www.cnblogs.com/devtest/p/14850525.html
Copyright © 2020-2023  润新知