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);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Redis(Remote Dictionary Server),即远程字典服务,是一个开源的、使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。详细操作可参考:https://korgs.blog.csdn.net/article/details/138491959
资源推荐
资源详情
资源评论
收起资源包目录
springboot+redis.zip (63个子文件)
pom.xml 9KB
springboot-redis
pom.xml 1KB
src
test
java
main
resources
application.properties 312B
log4j2.xml 2KB
application-dev.properties 778B
java
com
korgs
SpringbootRedisApplication.java 1KB
biz
RedisController.java 3KB
framework
RedisConfig.java 1KB
OpenAPIConfig.java 2KB
target
classes
application.properties 312B
log4j2.xml 2KB
application-dev.properties 778B
com
korgs
OpenAPIConfig$SwaggerProperties.class 5KB
SpringbootRedisApplication.class 2KB
biz
RedisController$1.class 1KB
RedisController.class 4KB
framework
RedisConfig.class 2KB
OpenAPIConfig.class 3KB
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
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
generated-sources
annotations
共 63 条
- 1
资源评论
korgs
- 粉丝: 7657
- 资源: 123
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功