網上關於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=”到“,”之間的字符,並且采用不貪婪模式“.*?”中的“?”就是采用不貪婪模式。
后面的“.*?”也是這個意思,就可以把自己想獲得的信息提取出來,而不用一個一個按照日志的字段來進行解析,因為生產上的日志隨着參數不同,內容可能會變化。采用這種方式,就非常方便,這個費了很大的精力才摸索出來的,多練習,到思考,必有所得!

