spring-security日志级别调试不一致行为

时间:2016-01-20 17:26:09

标签: spring logging spring-security log4j slf4j

为Spring Security 4.x设置logging level == debug的正确方法是什么?我正在使用slf4j/log4j

这是我尝试过的,log4j.properties:

...
log4j.logger.org.springframework.security=DEBUG

还试过:

log4j.category.org.springframework.security=DEBUG

以下内容在AbstractAuthenticationProcessingFilter.successfulAuthentication中返回false:

if (logger.isDebugEnabled()) {
        logger.debug("Authentication success. Updating SecurityContextHolder to contain: "
                + authResult);
    }

但是在SecurityContextPersistenceFilter中,debug的测试返回true,我可以看到调试输出:

if (debug) {
    logger.debug("SecurityContextHolder now cleared, as request processing completed");
}

控制台中填充了以下语句,表明日志级别确实是debug

2016-01-20 12:10:34,849 DEBUG org.springframework.security.web.savedrequest.DefaultSavedRequest.propertyEquals(321):  - pathInfo: both null (property equals)
2016-01-20 12:10:34,849 DEBUG org.springframework.security.web.savedrequest.DefaultSavedRequest.propertyEquals(321):  - queryString: both null (property equals)

1 个答案:

答案 0 :(得分:0)

我假设您使用自定义AbstractAuthenticationProcessingFilter,可能是自定义的UsernamePasswordAuthenticationFilter?如果这是真的,那么我想我可以解释一下这种行为。

logger(以及AbstractAuthenticationProcessingFilter的每个子类)中使用的记录器GenericFilterBean由{{1}的受保护的最终logger字段提供}}。它由以下代码初始化:

GenericFilterBean

如您所见,记录器名称是"已定义"按/** Logger available to subclasses */ protected final Log logger = LogFactory.getLog(getClass()); 。因此,Object.getClass()中的每个logger.debug(...)语句都由具体子类的记录器发布!

因此,当您有一个自定义的AuthenticationProcessingFilter(可能在AbstractAuthenticationProcessingFilter包中没有抵制)时,您需要配置日志框架以打印此类/包的调试语句!