首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java servlet -混合的log4j消息

Java servlet -混合的log4j消息
EN

Stack Overflow用户
提问于 2018-11-06 15:07:27
回答 1查看 72关注 0票数 0

我记录了所有传入我的servlet的请求参数。正在发生的情况是,请求参数是混合的。因为servlet在新线程中处理每个请求,所以我知道我的消息会被混淆。但是,我如何才能确保一个请求的所有参数都会打印出来,然后才会打印下一个请求的参数。

log4j.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

代码语言:javascript
复制
<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>

代码:

代码语言:javascript
复制
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-----");

注意:我不想单行打印消息。

EN

回答 1

Stack Overflow用户

发布于 2018-11-06 15:41:40

日志消息被不同的线程混合在一起是预期的行为。如果您不想记录一行,只需要记录包含一个文本行分隔符的块。你总是需要用一条日志语句来记录你的“事件”。如果记录器是同步的,则应用程序的性能将显著降低。您的servlet能够为多个线程提供服务是一件好事--没有什么可以搞乱的。如果您使用非阻塞技术,您的non服务器将能够并行处理数万个请求。猜猜如果同步了日志语句会发生什么。长话短说:添加自己的换行符。;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53167209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档