MDC не регистрирует имя пользователя в журналах - PullRequest
0 голосов
/ 28 апреля 2018

В моем spring-boot проекте я пытаюсь реализовать MDC для logback. В одном из моих двух spring-security filters я помещаю значение ключа в MDC. Но в логах значение внутри MDC не печатается.

public class JWTAuthorizationFilter extends BasicAuthenticationFilter {

private static final Logger LOGGER = LoggerFactory.getLogger(JWTAuthorizationFilter.class);

private AuthTokenModelRepository authTokenModelRepository;

public JWTAuthorizationFilter( AuthenticationManager authManager,
        AuthTokenModelRepository authTokenModelRepository )
{
    super(authManager);
    this.authTokenModelRepository = authTokenModelRepository;
}

@Override
protected void doFilterInternal( HttpServletRequest req, HttpServletResponse res, FilterChain chain )
        throws IOException, ServletException
{

    String header = req.getHeader(TokenConstant.HEADER_STRING);

    if( NullEmptyUtils.isNullorEmpty(header) || !header.startsWith(TokenConstant.TOKEN_PREFIX) )
    {
        LOGGER.info("****************JWT not present in the HttpRequest header************************");
        chain.doFilter(req, res);
        return;
    }

    // Check if the user is still active
    Optional<AuthTokenModel> authTokenModelOptional = authTokenModelRepository
            .findByJwtAndIsActiveTrue(header.replace(TokenConstant.TOKEN_PREFIX, ""));
    if( !authTokenModelOptional.isPresent() )
    {
        LOGGER.info("********************User is not logged in*******************************");
        chain.doFilter(req, res);
        return;
    }

    UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

    SecurityContextHolder.getContext().setAuthentication(authentication);

    String userName = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    MDC.put("user", userName);

    chain.doFilter(req, res);
}

И в моем logback.xml я определяю шаблон, который должен добавлять MDC содержимое в журналы.

<property name="LOG_FILE" value="${user.home}/my_logs/logs"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger | refId=%X{user} | %msg%n
        </Pattern>
    </layout>
</appender>

Но в журналах, присутствующих в консоли, я не вижу содержимого MDC.

2018-04-28 15:36:15 [http-nio-8090-exec-2] ИНФОРМАЦИЯ com.highpeak.tlp.webservices.services.impl.InvitationServiceImpl | refId = | Входные данные для приглашения пользователя проверены

...