package com.korgs.framework.logger;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.korgs.framework.Constants;
import com.korgs.framework.UUIDUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* @Title: com.shukun.data.app.interceptor.AccessLogInterceptor
* @Description AccessInterceptor
* -- extends AbstractGrpcAccessInterceptor
* -- @Component ,subclasses don't have to use this annocation
*
* Tracklog format:
* tid=8633542882073873365 app=app ip=0:0:0:0:0:0:0:1 uri=/systemlog/v1/list_systemlog controller=com.zd.baseframework.core.controller.core.SystemLogController#listSystemLog(SystemLogQueryRequest) inTime=1658916277205
* tid=7532975723136214833 exec=31284
*
* >tid:trackid,Used to trace stack requests
* >appid:client app id
* >ip:client ip
* >uri:request uri
* >param:request parameter
* >inTime:time of begin process
* >exec:total time of request
*
* @author liudong
* @date 2022/1/13 4:44 PM
*/
@Slf4j
@Component
public class AccessLogInterceptor implements HandlerInterceptor {
private final static String X_FORWARDED_FOR = "x-forwarded-for";
private final static String PROXY_CLIENT_IP = "Proxy-Client-IP";
private final static String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
long inTime = System.currentTimeMillis();
String ip1 = StrUtil.emptyToDefault(request.getHeader(X_FORWARDED_FOR), "");
String ip2 = StrUtil.emptyToDefault(request.getHeader(PROXY_CLIENT_IP), "");
String ip3 = StrUtil.emptyToDefault(request.getHeader(WL_PROXY_CLIENT_IP), "");
String ip4 = StrUtil.emptyToDefault(request.getRemoteAddr(), "");
String ip = StrUtil.format("{}{}{}{}", ip1, ip2, ip3, ip4);
String trackId = StrUtil.emptyToDefault(request.getHeader(Constants.TID), "");
String appCode = StrUtil.emptyToDefault(request.getHeader(Constants.APPCODE), Constants.DEFAULT_APP_NAME);
String agent = StrUtil.emptyToDefault(request.getHeader(Constants.USERAGENT), "");
String uri = request.getRequestURI();
if (StrUtil.isEmpty(trackId)){
trackId = UUIDUtil.trackId(System.nanoTime());
}
MDC.put(Constants.TID, trackId);
MDC.put(Constants.IP, ip);
MDC.put(Constants.INTIME, StrUtil.toString(inTime));
MDC.put(Constants.APPCODE, appCode);
MDC.put(Constants.USERAGENT, agent);
MDC.put(Constants.URI, uri);
HandlerMethod handlerMethod;
if (handler instanceof HandlerMethod) {
handlerMethod = (HandlerMethod)handler;
}else{
return true;
}
String method = handlerMethod.getBeanType().getName() + StrPool.DOT + handlerMethod.getMethod().getName();
String param = JSONUtil.toJsonStr(request.getParameterMap());
String url = new StringBuilder()
.append(StrUtil.SPACE).append(Constants.URI_TITLE).append("=").append(uri)
.append(StrUtil.SPACE).append(Constants.METHOD_TITLE).append("=").append(method)
.append(StrUtil.SPACE).append(Constants.PARAM_TITLE).append("=").append(param)
.toString();
MDC.put(Constants.URL, url);
StringBuilder accessLog = new StringBuilder()
.append(Constants.TID_TITLE).append("=").append(trackId)
.append(StrUtil.SPACE).append(Constants.APPCODE_TITLE).append("=").append(appCode)
.append(StrUtil.SPACE).append(Constants.IP_TITLE).append("=").append(ip)
.append(url)
.append(StrUtil.SPACE).append(Constants.INTIME_TITLE).append("=").append(inTime)
.append(StrUtil.SPACE);
accessLog(accessLog.toString());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// MDC.clear();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
StringBuilder processLog = new StringBuilder()
.append(Constants.TID_TITLE).append("=").append(MDC.get(Constants.TID))
.append(StrUtil.SPACE).append(Constants.URI_TITLE).append("=").append(request.getRequestURI())
.append(StrUtil.SPACE).append(Constants.EXEC_TITLE).append("=").append(System.currentTimeMillis() - Long.parseLong(MDC.get(Constants.INTIME)));
accessLog(processLog.toString());
MDC.clear();
}
private void accessLog(String accessLog){
log.info(accessLog);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本系列专题虽然是按教学的深度来定稿的,但在项目结构和代码组织方面是按生产系统的要求来书定的。在本章中主要介绍下基础开发框架的内容。后续所有章节的项目全是在本基础框架的基础上演进的。在此源码包中包含1个父工程和4个子module。 《springcloud专题》之《动手开发基于Springboot的基础开发框架-01》博文源码。
资源推荐
资源详情
资源评论
收起资源包目录
springbootSeries.zip (77个子文件)
springbootSeries
.DS_Store 8KB
pom.xml 10KB
springboot-base
.DS_Store 6KB
pom.xml 2KB
src
.DS_Store 6KB
test
java
main
.DS_Store 6KB
resources
application.properties 86B
application-dev.properties 272B
java
com
korgs
SpringbootBaseApplication.java 2KB
biz
HelloWorldController.java 517B
target
classes
application.properties 86B
application-dev.properties 272B
com
korgs
biz
HelloWorldController.class 972B
SpringbootBaseApplication.class 3KB
.DS_Store 6KB
generated-sources
annotations
springboot-web
.DS_Store 6KB
pom.xml 850B
src
.DS_Store 6KB
test
java
main
resources
application.properties 178B
log4j2.xml 3KB
application-dev.properties 778B
java
com
korgs
SpringbootWebApplication.java 1KB
OpenAPIConfig.java 2KB
target
classes
application.properties 178B
log4j2.xml 3KB
application-dev.properties 778B
com
korgs
OpenAPIConfig$SwaggerProperties.class 5KB
SpringbootWebApplication.class 2KB
OpenAPIConfig.class 3KB
.DS_Store 6KB
generated-sources
annotations
framework-persistence
.DS_Store 6KB
pom.xml 2KB
src
.DS_Store 6KB
test
java
main
resources
java
com
korgs
framework
persistence
DBEntity.java 1KB
DBMetaObjectHandler.java 995B
page
PageQueryBo.java 600B
PageBo.java 588B
PageUtil.java 4KB
PageParam.java 519B
MybatisPlusConfig.java 1KB
target
classes
com
korgs
framework
persistence
DBEntity.class 3KB
DBMetaObjectHandler.class 1KB
MybatisPlusConfig.class 2KB
page
PageBo.class 4KB
PageUtil.class 4KB
PageParam.class 4KB
PageQueryBo.class 4KB
.DS_Store 6KB
generated-sources
annotations
framework-commons
.DS_Store 6KB
pom.xml 2KB
src
.DS_Store 6KB
test
java
main
resources
java
com
korgs
framework
restful
ResponseConst.java 1KB
BaseResponse.java 1KB
ListResponse.java 1KB
PageResponse.java 1KB
FileResponse.java 2KB
UUIDUtil.java 1KB
TranslatorUtil.java 1KB
web
CorsConfig.java 1KB
logger
InterceptorRegister.java 715B
AccessLogInterceptor.java 5KB
LogGenerator.java 1KB
Constants.java 1KB
target
classes
com
korgs
framework
UUIDUtil.class 2KB
restful
PageResponse.class 5KB
FileResponse.class 4KB
BaseResponse.class 5KB
ResponseConst$Msg.class 1KB
ResponseConst.class 404B
ListResponse.class 4KB
web
CorsConfig.class 1KB
TranslatorUtil.class 1KB
logger
AccessLogInterceptor.class 5KB
LogGenerator.class 1KB
InterceptorRegister.class 2KB
Constants.class 1KB
.DS_Store 6KB
generated-sources
annotations
共 77 条
- 1
资源评论
korgs
- 粉丝: 7632
- 资源: 123
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功