public abstract class AbstractRequestLoggingFilter extends OncePerRequestFilter
Filter
s that perform logging operations before and after a request
is processed.
Subclasses should override the beforeRequest(HttpServletRequest, String)
and
afterRequest(HttpServletRequest, String)
methods to perform the actual logging
around the request.
Subclasses are passed the message to write to the log in the beforeRequest
and
afterRequest
methods. By default, only the URI of the request is logged. However,
setting the includeQueryString
property to true
will cause the query string of
the request to be included also; this can be further extended through includeClientInfo
and includeHeaders
. The payload (body content) of the request can be logged via the
includePayload
flag: Note that this will only log the part of the payload which has
actually been read, not necessarily the entire body of the request.
Prefixes and suffixes for the before and after messages can be configured using the
beforeMessagePrefix
, afterMessagePrefix
, beforeMessageSuffix
and
afterMessageSuffix
properties.
beforeRequest(javax.servlet.http.HttpServletRequest, java.lang.String)
,
afterRequest(javax.servlet.http.HttpServletRequest, java.lang.String)
Modifier and Type | Field and Description |
---|---|
static String |
DEFAULT_AFTER_MESSAGE_PREFIX
The default value prepended to the log message written after a request is
processed.
|
static String |
DEFAULT_AFTER_MESSAGE_SUFFIX
The default value appended to the log message written after a request is
processed.
|
static String |
DEFAULT_BEFORE_MESSAGE_PREFIX
The default value prepended to the log message written before a request is
processed.
|
static String |
DEFAULT_BEFORE_MESSAGE_SUFFIX
The default value appended to the log message written before a request is
processed.
|
ALREADY_FILTERED_SUFFIX
logger
Constructor and Description |
---|
AbstractRequestLoggingFilter() |
Modifier and Type | Method and Description |
---|---|
protected abstract void |
afterRequest(HttpServletRequest request,
String message)
Concrete subclasses should implement this method to write a log message
after the request is processed.
|
protected abstract void |
beforeRequest(HttpServletRequest request,
String message)
Concrete subclasses should implement this method to write a log message
before the request is processed.
|
protected String |
createMessage(HttpServletRequest request,
String prefix,
String suffix)
Create a log message for the given request, prefix and suffix.
|
protected void |
doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
Forwards the request to the next filter in the chain and delegates down to the subclasses
to perform the actual request logging both before and after the request is processed.
|
protected int |
getMaxPayloadLength()
Return the maximum length of the payload body to be included in the log message.
|
protected String |
getMessagePayload(HttpServletRequest request)
Extracts the message payload portion of the message created by
createMessage(HttpServletRequest, String, String) when
isIncludePayload() returns true. |
protected boolean |
isIncludeClientInfo()
Return whether the client address and session id should be included in the
log message.
|
protected boolean |
isIncludeHeaders()
Return whether the request headers should be included in the log message.
|
protected boolean |
isIncludePayload()
Return whether the request payload (body) should be included in the log message.
|
protected boolean |
isIncludeQueryString()
Return whether the query string should be included in the log message.
|
void |
setAfterMessagePrefix(String afterMessagePrefix)
Set the value that should be prepended to the log message written
after a request is processed.
|
void |
setAfterMessageSuffix(String afterMessageSuffix)
Set the value that should be appended to the log message written
after a request is processed.
|
void |
setBeforeMessagePrefix(String beforeMessagePrefix)
Set the value that should be prepended to the log message written
before a request is processed.
|
void |
setBeforeMessageSuffix(String beforeMessageSuffix)
Set the value that should be appended to the log message written
before a request is processed.
|
void |
setIncludeClientInfo(boolean includeClientInfo)
Set whether the client address and session id should be included in the
log message.
|
void |
setIncludeHeaders(boolean includeHeaders)
Set whether the request headers should be included in the log message.
|
void |
setIncludePayload(boolean includePayload)
Set whether the request payload (body) should be included in the log message.
|
void |
setIncludeQueryString(boolean includeQueryString)
Set whether the query string should be included in the log message.
|
void |
setMaxPayloadLength(int maxPayloadLength)
Set the maximum length of the payload body to be included in the log message.
|
protected boolean |
shouldLog(HttpServletRequest request)
Determine whether to call the
beforeRequest(javax.servlet.http.HttpServletRequest, java.lang.String) /afterRequest(javax.servlet.http.HttpServletRequest, java.lang.String)
methods for the current request, i.e. |
protected boolean |
shouldNotFilterAsyncDispatch()
The default value is "false" so that the filter may log a "before" message
at the start of request processing and an "after" message at the end from
when the last asynchronously dispatched thread is exiting.
|
doFilter, doFilterNestedErrorDispatch, getAlreadyFilteredAttributeName, isAsyncDispatch, isAsyncStarted, shouldNotFilter, shouldNotFilterErrorDispatch
addRequiredProperty, afterPropertiesSet, createEnvironment, destroy, getEnvironment, getFilterConfig, getFilterName, getServletContext, init, initBeanWrapper, initFilterBean, setBeanName, setEnvironment, setServletContext
public static final String DEFAULT_BEFORE_MESSAGE_PREFIX
public static final String DEFAULT_BEFORE_MESSAGE_SUFFIX
public static final String DEFAULT_AFTER_MESSAGE_PREFIX
public static final String DEFAULT_AFTER_MESSAGE_SUFFIX
public void setIncludeQueryString(boolean includeQueryString)
Should be configured using an <init-param>
for parameter name
"includeQueryString" in the filter definition in web.xml
.
protected boolean isIncludeQueryString()
public void setIncludeClientInfo(boolean includeClientInfo)
Should be configured using an <init-param>
for parameter name
"includeClientInfo" in the filter definition in web.xml
.
protected boolean isIncludeClientInfo()
public void setIncludeHeaders(boolean includeHeaders)
Should be configured using an <init-param>
for parameter name
"includeHeaders" in the filter definition in web.xml
.
protected boolean isIncludeHeaders()
public void setIncludePayload(boolean includePayload)
Should be configured using an <init-param>
for parameter name
"includePayload" in the filter definition in web.xml
.
protected boolean isIncludePayload()
public void setMaxPayloadLength(int maxPayloadLength)
protected int getMaxPayloadLength()
public void setBeforeMessagePrefix(String beforeMessagePrefix)
public void setBeforeMessageSuffix(String beforeMessageSuffix)
public void setAfterMessagePrefix(String afterMessagePrefix)
public void setAfterMessageSuffix(String afterMessageSuffix)
protected boolean shouldNotFilterAsyncDispatch()
shouldNotFilterAsyncDispatch
in class OncePerRequestFilter
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
protected String createMessage(HttpServletRequest request, String prefix, String suffix)
If includeQueryString
is true
, then the inner part
of the log message will take the form request_uri?query_string
;
otherwise the message will simply be of the form request_uri
.
The final message is composed of the inner part as described and the supplied prefix and suffix.
@Nullable protected String getMessagePayload(HttpServletRequest request)
createMessage(HttpServletRequest, String, String)
when
isIncludePayload()
returns true.protected boolean shouldLog(HttpServletRequest request)
beforeRequest(javax.servlet.http.HttpServletRequest, java.lang.String)
/afterRequest(javax.servlet.http.HttpServletRequest, java.lang.String)
methods for the current request, i.e. whether logging is currently active
(and the log message is worth building).
The default implementation always returns true
. Subclasses may
override this with a log level check.
request
- current HTTP requesttrue
if the before/after method should get called;
false
otherwiseprotected abstract void beforeRequest(HttpServletRequest request, String message)
request
- current HTTP requestmessage
- the message to logprotected abstract void afterRequest(HttpServletRequest request, String message)
request
- current HTTP requestmessage
- the message to log