【问题标题】:spring-security logging level debug inconsistent behaviorspring-security 日志记录级别调试不一致的行为
【发布时间】:2016-01-20 17:26:08
【问题描述】:

为 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 中,调试测试返回 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)

【问题讨论】:

    标签: spring logging spring-security log4j slf4j


    【解决方案1】:

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

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

    /** Logger available to subclasses */
    protected final Log logger = LogFactory.getLog(getClass());
    

    如您所见,记录器名称由Object.getClass()“定义”。因此AbstractAuthenticationProcessingFilter 中的每一个logger.debug(...) 语句都是由具体子类的记录器发布的!

    所以当你有一个定制的 AuthenticationProcessingFilter(在org.springframework.security 包中可能没有抵抗),你需要配置日志框架来打印这个类/包的调试语句!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 2017-01-03
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多