AbstractRequestLoggingFilter类定义了两个方法beforeRequest和afterRequest分别用于设定过滤前后执行的操作,它有三个子类,分别是CommonsRequestLoggingFilter、ServletContextRequestLoggingFilter和Log4jNestedDiagnosticContextFilter,这三个子类分别实现了各自的beforeRequest和afterRequest。其中,CommonsRequestLoggingFilter在过滤前后分别打印出一段debug的信息;ServletContextRequestLoggingFilter在过滤前后分别向日志文件中写入一段日志信息,日志文件可由log4j.properties等指定;Log4jNestedDiagnosticContextFilter则将日志信息存储到NDC中,NDC采用了一个类似栈的机制来push和pot上下文信息,每一个线程都独立地储存上下文信息,比如说一个servlet就可以针对 每一个request创建对应的NDC,储存客户端地址等信息。
当然,在AbstractRequestLoggingFilter中,还包含很多其他方法:
setIncludeQueryString:查询语句是否包含在日志文件中,true或false;
setIncludeClientInfo:客户地址和session id是否包含在日志中,true或false;
setIncludePayload:负载信息是否包含在日志信息中,true或false;
setMaxPayloadLength:最大负载量,int值;
setBeforeMessagePrefix:日志信息前的信息的前缀;
setBeforeMessageSuffix:日志信息前的信息的后缀;
setAfterMessagePrefix:日志信息后的信息的前缀;
setAfterMessageSuffix:日志信息后的信息的后缀。
以上这些信息均可以在init-param中进行设置。
日志信息在getBeforeMessage和getAfterMessage方法中通过createMessage创建,然后被doFilterInternal调用,日志信息中至少包含uri信息,其他信息则根据init-param中所设定的值获取,例如,当includeQueryString的值为true时,日志信息中除uri信息外,还包含query string信息。
由此可以,在spring中已定义的AbstractRequestLoggingFiter的子类过滤器均是用于输入上下文信息,只不过承载的方式不同,其中CommonsRequestLoggingFilter将上下文信息直接打印;ServletContextRequestLoggingFilter将上下文信息写入日志文件;Log4jNestedDiagnosticContextFilter将上下文信息写入NDC中。