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