Java servlet-log4j消息混杂

时间:2018-11-06 07:07:27

标签: java servlets log4j log4j2

我记录了所有到达我的servlet的请求参数。发生的事情是请求参数混杂在一起。由于Servlet处理新线程中的每个请求,因此我知道我的消息会变得混乱。 但是如何确保仅打印请求中的所有参数,然后才打印下一个请求中的参数。

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 :(得分:0)

预计日志消息会被不同的线程混淆。如果您不想记录一行,只需记录一个文本块-包括换行符。您始终必须用一个log语句记录“事件”。如果记录器将被同步,则应用程序的性能将急剧下降。 Servlet的服务多个线程的能力是一件好事-没什么可麻烦的。如果您使用非阻塞技术,则您的Web服务器将能够并行处理成千上万的请求。猜测一下如果同步日志语句会发生什么。 长话短说:添加行打破了自己。 ;)