介紹
Spring Mvc攔截器的作用很多,舉幾個例子
1.記錄接口響應時間
2.判斷用戶是否登錄
3.判斷用戶的權限
今天就用一個攔截器和一個awk命令,秒查線上超時接口
一個攔截器
我們要寫自己的攔截器一般有兩種方式。
1.實現HandlerInterceptor接口
2.繼承HandlerInterceptorAdapter抽象類
我就直接繼承了HandlerInterceptorAdapter抽象類,按需重寫部分實現即可。
HandlerInterceptor有如下3個方法
preHandler:在controller執行之前調用
postHandler:controller執行之后,且頁面渲染之前調用
afterCompletion:頁面渲染之后調用,一般用于資源清理操作
寫一個記錄接口響應時間的攔截器
@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 'BEGIN{}pattern{commands}END{}' file_name
語法格式解釋
BEGIN正式處理數據之前
pattern匹配模式
{commands}匹配命令,可能多行
END處理完所有匹配數據后執行
第二種形式
standard output | awk 'BEGIN{}pattern{commands}END{}'
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 hadoop storm
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