Я регистрирую все параметры запроса, поступающие в мой сервлет. То, что происходит, - то, что параметры запроса смешиваются. Поскольку сервлет обрабатывает каждый запрос в новом потоке, я понимаю, что мои сообщения будут перепутаны.
Но как я могу гарантировать, что все параметры запроса будут напечатаны только тогда, когда будут напечатаны параметры следующего запроса.
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-----");
Примечание. Я не хочу печатать сообщения в одну строку.