Сервлет Java - сообщения log4j смешиваются - PullRequest
0 голосов
/ 06 ноября 2018

Я регистрирую все параметры запроса, поступающие в мой сервлет. То, что происходит, - то, что параметры запроса смешиваются. Поскольку сервлет обрабатывает каждый запрос в новом потоке, я понимаю, что мои сообщения будут перепутаны. Но как я могу гарантировать, что все параметры запроса будут напечатаны только тогда, когда будут напечатаны параметры следующего запроса.

log4j.xml:

<?xml version="1.0" encoding="UTF-8"?>

<Properties>
    <Property name="log-path">../</Property>
</Properties>

<Appenders>
    <RollingFile name="LogFile"
        fileName="${log-path}/standalone/log/myApp/app.log"
        filePattern="${log-path}/standalone/log/myApp/%d{yyyy}/%d{MM}/%d{yyyy-MM-dd}/app-%d{yyyy-MM-dd-HH}.log.gz">

        <PatternLayout>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1} - %msg%n
            </pattern>
        </PatternLayout>

        <Policies>
            <TimeBasedTriggeringPolicy interval="1"
                modulate="true" />
        </Policies>

    </RollingFile>

    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout
            pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
    </Console>

</Appenders>

<Loggers>
    <Root level="debug">
        <AppenderRef ref="Console" />
        <AppenderRef ref="LogFile" />
    </Root>
</Loggers>

Код:

logger.info("-----Request Details Begins-----");
        logger.info("Client IP Address------> " + ipAddress);
        logger.info("Requested Service------> " + url);

        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String paramName = parameterNames.nextElement();
            String[] paramValues = request.getParameterValues(paramName);
            for (int i = 0; i < paramValues.length; i++) {
                String paramValue = paramValues[i];
                if (dontLog(paramName)) {
                    paramValue = "XXXXXX";
                } else if ("requestParams".equalsIgnoreCase(paramName)) {
                    //TODO dont log sensitive data
                }
                logger.info("Request " + paramName + " ------> " + paramValue);
            }
        }
        logger.info("-----Request Details Ends-----");

Примечание. Я не хочу печатать сообщения в одну строку.

1 Ответ

0 голосов
/ 06 ноября 2018

Журнал сообщений, перепутанных различными потоками, является ожидаемым поведением. Если вы не хотите регистрировать одну строку, просто зарегистрируйте один блок текстовых строк, включая разрывы строк. Вы всегда должны регистрировать свое «событие» с одним оператором журнала. Если регистратор будет синхронизирован, производительность вашего приложения резко снизится. Способность вашего сервлета обслуживать несколько потоков - это хорошо, и с этим не нужно ничего путаться. Если бы вы использовали неблокирующие технологии, ваш веб-сервер мог бы обслуживать десятки тысяч запросов параллельно. Подумайте, что произойдет, если вы синхронизируете свои записи в журнале. Короче говоря: добавьте разрывы строк самостоятельно. ;)

...