Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gogirl-miniapp-backend
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
huluobin
gogirl-miniapp-backend
Commits
85e48f87
Commit
85e48f87
authored
Jul 23, 2020
by
huluobin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
战术更新
parent
8f257ddc
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
60 additions
and
155 deletions
+60
-155
RRExceptionHandler.java
...l/infrastructure/common/exception/RRExceptionHandler.java
+43
-14
RequestLogFilter.java
...gogirl/infrastructure/common/filter/RequestLogFilter.java
+13
-0
LogHandlerInterceptor.java
...rastructure/common/interceptor/LogHandlerInterceptor.java
+0
-139
MvcInterceptorConfig.java
...frastructure/common/interceptor/MvcInterceptorConfig.java
+0
-2
RequestBakRequestWrapper.java
...frastructure/common/wrapper/RequestBakRequestWrapper.java
+4
-0
No files found.
src/main/java/com/gogirl/infrastructure/common/exception/RRExceptionHandler.java
View file @
85e48f87
...
...
@@ -2,7 +2,11 @@ package com.gogirl.infrastructure.common.exception;
import
com.gogirl.infrastructure.common.base.JsonResult
;
import
com.gogirl.infrastructure.common.util.JsonUtilByJackson
;
import
com.gogirl.infrastructure.common.wrapper.RequestBakRequestWrapper
;
import
com.gogirl.infrastructure.service.mail.MailService
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.web.bind.annotation.ControllerAdvice
;
...
...
@@ -50,32 +54,57 @@ public class RRExceptionHandler {
*/
@ExceptionHandler
(
Exception
.
class
)
public
JsonResult
<
String
>
handleException
(
HttpServletRequest
request
,
Exception
e
)
{
Exception
e
x
)
{
JsonResult
<
String
>
result
=
new
JsonResult
<>();
result
.
setSuccess
(
false
);
result
.
setCode
(
500
);
result
.
setMessage
(
e
.
getMessage
());
log
.
error
(
"************************异常开始*******************************"
);
log
.
error
(
"uri,{}"
,
request
.
getRequestURI
());
log
.
error
(
"params:{}"
,
request
.
getParameterMap
().
toString
());
//输出日志
this
.
log
(
e
,
request
);
result
.
setMessage
(
ex
.
getMessage
());
RequestBakRequestWrapper
bakRequestWrapper
=
(
RequestBakRequestWrapper
)
request
;
//错误邮件内容
StringWriter
sw
=
new
StringWriter
();
PrintWriter
pw
=
new
PrintWriter
(
sw
);
e
.
printStackTrace
(
pw
);
ex
.
printStackTrace
(
pw
);
ErrorLog
errorLog
=
ErrorLog
.
builder
()
.
uri
(
bakRequestWrapper
.
getRequestURI
())
.
param
(
JsonUtilByJackson
.
writeValueAsString
(
bakRequestWrapper
.
getParameterMap
()))
.
payload
(
bakRequestWrapper
.
getCachedContent
().
toString
())
.
errorMsg
(
ex
.
getMessage
())
.
StackTrace
(
sw
.
toString
())
.
build
()
//输出日志
log
.
error
(
"******异常开始*******"
);
log
.
info
(
"uri:{}"
,
errorLog
.
getUri
());
log
.
info
(
"param:{}"
,
errorLog
.
getParam
());
log
.
info
(
"payload:{}"
,
errorLog
.
getPayload
());
log
.
error
(
ex
.
getMessage
(),
ex
);
log
.
error
(
"******异常结束********"
);
//错误邮件内容
//发送邮件
if
(
profile
.
equals
(
"prod"
))
mailService
.
sendSimpleMail
(
"robbendev@qq.com"
,
profile
+
"异常"
,
sw
.
toString
());
// if (profile.equals("prod"))
mailService
.
sendSimpleMail
(
"robbendev@qq.com"
,
profile
+
"异常"
,
sw
.
toString
());
return
result
;
}
private
void
log
(
Exception
ex
,
HttpServletRequest
request
)
{
log
.
error
(
ex
.
getMessage
(),
ex
);
log
.
error
(
"************************异常结束*******************************"
);
@Data
@Builder
static
class
ErrorLog
{
private
String
uri
;
private
String
traceId
;
private
String
param
;
private
String
payload
;
private
String
errorMsg
;
private
String
StackTrace
;
}
}
src/main/java/com/gogirl/infrastructure/common/filter/RequestLogFilter.java
View file @
85e48f87
package
com
.
gogirl
.
infrastructure
.
common
.
filter
;
import
com.baomidou.mybatisplus.core.toolkit.IdWorker
;
import
com.gogirl.infrastructure.common.util.JsonUtilByJackson
;
import
com.gogirl.infrastructure.common.wrapper.RequestBakRequestWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.slf4j.MDC
;
import
org.springframework.boot.web.servlet.ServletComponentScan
;
import
org.springframework.stereotype.Component
;
import
javax.servlet.*
;
import
javax.servlet.annotation.WebFilter
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
/**
...
...
@@ -17,6 +22,7 @@ import java.io.IOException;
@Component
@ServletComponentScan
@WebFilter
(
urlPatterns
=
{
"/customer/*"
,
"/technician/*"
},
filterName
=
"requestLogFilter"
)
@Slf4j
public
class
RequestLogFilter
implements
Filter
{
@Override
...
...
@@ -29,6 +35,13 @@ public class RequestLogFilter implements Filter {
String
traceId
=
IdWorker
.
getIdStr
();
request
.
setAttribute
(
"traceId"
,
traceId
);
MDC
.
put
(
"traceId"
,
traceId
);
if
((
request
instanceof
HttpServletRequest
)
&&
(
response
instanceof
HttpServletResponse
))
{
RequestBakRequestWrapper
bakRequestWrapper
=
(
RequestBakRequestWrapper
)
request
;
log
.
info
(
"uri:{}"
,
bakRequestWrapper
.
getRequestURI
());
log
.
info
(
"param:{}"
,
JsonUtilByJackson
.
writeValueAsString
(
bakRequestWrapper
.
getParameterMap
()));
log
.
info
(
"payload:{}"
,
bakRequestWrapper
.
getCachedContent
().
toString
());
}
chain
.
doFilter
(
request
,
response
);
}
...
...
src/main/java/com/gogirl/infrastructure/common/interceptor/LogHandlerInterceptor.java
deleted
100644 → 0
View file @
8f257ddc
package
com
.
gogirl
.
infrastructure
.
common
.
interceptor
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.core.NamedThreadLocal
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.method.HandlerMethod
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.ModelAndView
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.PrintWriter
;
import
java.io.StringWriter
;
import
java.text.SimpleDateFormat
;
import
java.util.Arrays
;
import
java.util.Map
;
/**
* 统一日志拦截记录
*/
@Component
@AllArgsConstructor
@Slf4j
public
class
LogHandlerInterceptor
implements
HandlerInterceptor
{
private
static
final
ThreadLocal
<
Long
>
startTimeThreadLocal
=
new
NamedThreadLocal
<>(
"ThreadLocal StartTime"
);
/**
* 将ErrorStack转化为String.
*/
public
static
String
getStackTraceAsString
(
Throwable
e
)
{
if
(
e
==
null
)
{
return
""
;
}
StringWriter
stringWriter
=
new
StringWriter
();
e
.
printStackTrace
(
new
PrintWriter
(
stringWriter
));
return
stringWriter
.
toString
();
}
private
String
getParamString
(
Map
<
String
,
String
[]>
map
)
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
Map
.
Entry
<
String
,
String
[]>
e
:
map
.
entrySet
())
{
sb
.
append
(
e
.
getKey
()).
append
(
"="
);
String
[]
value
=
e
.
getValue
();
if
(
value
!=
null
&&
value
.
length
==
1
)
{
sb
.
append
(
value
[
0
]).
append
(
"\t"
);
}
else
{
sb
.
append
(
Arrays
.
toString
(
value
)).
append
(
"\t"
);
}
}
return
sb
.
toString
();
}
/**
* 该方法将在请求处理之前进行调用。
* 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
* Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
* 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
{
long
startTime
=
System
.
currentTimeMillis
();
request
.
setAttribute
(
"startTime"
,
startTime
);
startTimeThreadLocal
.
set
(
startTime
);
//线程绑定变量(该数据只有当前请求的线程可见)
if
(
handler
instanceof
HandlerMethod
)
{
StringBuilder
sb
=
new
StringBuilder
(
1000
);
sb
.
append
(
"-----------------------开始计时:"
).
append
(
new
SimpleDateFormat
(
"hh:mm:ss.SSS"
).
format
(
startTime
)).
append
(
"-------------------------------------\n"
);
HandlerMethod
h
=
(
HandlerMethod
)
handler
;
sb
.
append
(
"Controller: "
).
append
(
h
.
getBean
().
getClass
().
getName
()).
append
(
"\n"
);
sb
.
append
(
"Method : "
).
append
(
h
.
getMethod
().
getName
()).
append
(
"\n"
);
sb
.
append
(
"Params : "
).
append
(
getParamString
(
request
.
getParameterMap
())).
append
(
"\n"
);
sb
.
append
(
"URI : "
).
append
(
request
.
getRequestURI
()).
append
(
"\n"
);
log
.
info
(
sb
.
toString
());
}
return
true
;
}
/**
* 在当前请求进行处理之后,也就是Controller 方法调用之后执行,
* 但是它会在DispatcherServlet 进行视图返回渲染之前被调用,
* 所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
*
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public
void
postHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
ModelAndView
modelAndView
)
throws
Exception
{
long
startTime
=
(
Long
)
request
.
getAttribute
(
"startTime"
);
long
endTime
=
System
.
currentTimeMillis
();
long
executeTime
=
endTime
-
startTime
;
if
(
handler
instanceof
HandlerMethod
)
{
StringBuilder
sb
=
new
StringBuilder
(
1000
);
sb
.
append
(
"CostTime : "
).
append
(
executeTime
).
append
(
"ms"
).
append
(
"\n"
);
sb
.
append
(
"-------------------------------------------------------------------------------"
);
log
.
info
(
sb
.
toString
());
}
}
/**
* 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
Exception
ex
)
throws
Exception
{
// 打印JVM信息。
if
(
log
.
isDebugEnabled
())
{
long
beginTime
=
startTimeThreadLocal
.
get
();
//得到线程绑定的局部变量(开始时间)
long
endTime
=
System
.
currentTimeMillis
();
//2、结束时间
//如果controller报错,则记录异常错误
if
(
ex
!=
null
)
{
log
.
debug
(
"Controller异常: "
+
getStackTraceAsString
(
ex
));
}
log
.
debug
(
"计时结束:"
+
new
SimpleDateFormat
(
"hh:mm:ss.SSS"
).
format
(
endTime
)
+
" 耗时:"
+
(
endTime
-
beginTime
)
+
" URI:"
+
request
.
getRequestURI
()
+
" 最大内存: "
+
Runtime
.
getRuntime
().
maxMemory
()
/
1024
/
1024
+
"m 已分配内存: "
+
Runtime
.
getRuntime
().
totalMemory
()
/
1024
/
1024
+
"m 已分配内存中的剩余空间: "
+
Runtime
.
getRuntime
().
freeMemory
()
/
1024
/
1024
+
"m 最大可用内存: "
+
(
Runtime
.
getRuntime
().
maxMemory
()
-
Runtime
.
getRuntime
().
totalMemory
()
+
Runtime
.
getRuntime
().
freeMemory
())
/
1024
/
1024
+
"m"
);
startTimeThreadLocal
.
remove
();
}
}
}
src/main/java/com/gogirl/infrastructure/common/interceptor/MvcInterceptorConfig.java
View file @
85e48f87
...
...
@@ -18,7 +18,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp
public
class
MvcInterceptorConfig
extends
WebMvcConfigurationSupport
{
private
final
LoginHandlerInterceptor
loginHandlerInterceptor
;
private
final
LogHandlerInterceptor
logHandlerInterceptor
;
private
final
SessionHandlerInterceptor
sessionHandlerInterceptor
;
private
final
AuthHandlerInterceptor
authHandlerInterceptor
;
...
...
@@ -32,7 +31,6 @@ public class MvcInterceptorConfig extends WebMvcConfigurationSupport {
.
excludePathPatterns
(
"/csrf"
)
;
registry
.
addInterceptor
(
logHandlerInterceptor
);
registry
.
addInterceptor
(
sessionHandlerInterceptor
);
registry
.
addInterceptor
(
authHandlerInterceptor
)
.
addPathPatterns
(
"/**"
)
...
...
src/main/java/com/gogirl/infrastructure/common/wrapper/RequestBakRequestWrapper.java
View file @
85e48f87
...
...
@@ -74,6 +74,10 @@ public class RequestBakRequestWrapper extends HttpServletRequestWrapper {
return
this
.
cachedContent
.
toByteArray
();
}
public
ByteArrayOutputStream
getCachedContent
()
{
return
this
.
cachedContent
;
}
@Override
public
String
getParameter
(
String
name
)
{
if
(
this
.
parameterMap
!=
null
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment