一個攔截器和一個awk命令,秒查線上超時接口


一個攔截器和一個awk命令,秒查線上超時接口


介紹

Spring Mvc攔截器的作用很多,舉幾個例子

1.記錄接口響應時間

2.判斷用戶是否登錄

3.判斷用戶的權限

今天就用一個攔截器和一個awk命令,秒查線上超時接口

一個攔截器

我們要寫自己的攔截器一般有兩種方式。

1.實現HandlerInterceptor接口

2.繼承HandlerInterceptorAdapter抽象類

我就直接繼承了HandlerInterceptorAdapter抽象類,按需重寫部分實現即可。

HandlerInterceptor有如下3個方法

preHandler:在controller執行之前調用

postHandler:controller執行之後,且頁面渲染之前調用

afterCompletion:頁面渲染之後調用,一般用於資源清理操作

寫一個記錄接口響應時間的攔截器

一個攔截器和一個awk命令,秒查線上超時接口


@Slf4j
public class SystemInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("request-starttime", System.currentTimeMillis());
log.info("request enter:{}", request.getRequestURI());
return true;
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
Long startTime = (Long) request.getAttribute("request-starttime");
if (startTime != null) {
long cost = System.currentTimeMillis() - startTime;
log.info("request cost:[" + request.getRequestURI() + ", "
+ request.getQueryString() + "] " + cost);
}
}
}

配置攔截器


一個攔截器和一個awk命令,秒查線上超時接口


一個awk命令

awk是一個文本處理工具,通常用於處理數據並生成結果報告

語法格式

第一種形式

awk 'BEGIN{}pattern{commands}END{}' file_name
一個攔截器和一個awk命令,秒查線上超時接口

語法格式解釋

BEGIN正式處理數據之前

pattern匹配模式

{commands}匹配命令,可能多行

END處理完所有匹配數據後執行

第二種形式

standard output | awk 'BEGIN{}pattern{commands}END{}'

awk的內置變量

一個攔截器和一個awk命令,秒查線上超時接口

內置變量含義

$0整行內容

$1-$n當前行的第1-n個字段(按照指定分隔符分割後)

NF(Number Field)當前行的字段個數,也就是多少列

NR(Number Row)當前行的行號,從1開始計數

FNR(File Number Row)多文件處理時,每個文件行號單獨計數,都是從0開始

FS(Field Separator)輸入字段分割符。不指定默認以空格或者Tab鍵分割

RS(Row Separator)輸入行分割符。默認回車\\n

OFS(Output Field Sepatator)輸出字段分割符。默認為空格

ORS(Output Row)輸出行分隔符。默認為回車

FILENAME當前輸入的文件名字

ARGC命令行參數個數

ARGV命令行參數數組

看一下/etc/passwd文件的內容

cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

輸出文件的每行內容

awk '{print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

輸出第二列內容

需要指定分隔符:

awk 'BEGIN{FS=":"}{print $2}' /etc/passwd

x
x
x

不需要指定分割符,默認空格,tab鍵,多個也可以分隔(如一個空格+一個tab鍵)

show.txt文件內容如下

# 空格分隔
python java php
# tab鍵分隔
flink\thadoop\tstorm
awk '{print $1}' show.txt

輸出如下:

python
flink

攔截器和awk命令都介紹完畢。

grep 'request cost' xxx.log | awk ' $7 >1000 {print $0}' \\ 

上面這個命令就是打印xxx.log中接口響應時間超過1s的日誌,相信經過前面的介紹,你已經看懂了

效果演示

省略了部分內容

[INFO] request cost:[/api/message/getKfConversation, null] 1005
[INFO] request cost:[/api/kf/meet, null] 1004



分享到:


相關文章: