如何将HTTP GET和HTTP Post记录到单独的文件中

时间:2017-10-06 03:28:09

标签: logging logback slf4j embedded-jetty

如何将HTTP @GET@POST记录到单独的文件中。基本上我们只想要单独的日志文件进行读取(GET)和写入(PUT,POST,DELETE)。我将Slf4jlogback一起使用嵌入式码头。

一种解决方案是在课堂上使用两个记录器并相应地使用它们。即

private final static Logger log = LoggerFactory.getLogger(Controller.class);
private final static Logger writeLog = LoggerFactory.getLogger("WRITE");

现在根据要求使用上述记录器,定义AppenderLogger

<appender name="APPENDER_READ"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HOME}/logs/read.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>read.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>
        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern>
        </encoder>
    </appender>



 <appender name="APPENDER_WRITE"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${HOME}/logs/write.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>logs/write.%i.log.zip</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>3</maxIndex>
            </rollingPolicy>
            <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>5MB</maxFileSize>
            </triggeringPolicy>
            <encoder>
                <pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %X{TaskKey} %msg%n</pattern>
            </encoder>
        </appender>


    <logger name="WRITE" level="warn" additivity="false">
        <appender-ref ref="APPENDER_WRITE" />
    </logger>


    <root level="WARN">
        <appender-ref ref="APPENDER_READ" />
    </root>

但是我正在寻找一些更好的解决方案,它可以不是从控制器开始记录,而是从Handler级别开始记录(一旦请求进入)。

1 个答案:

答案 0 :(得分:2)

您应该将请求方法(GET,POST等)放入Logback的MDC(映射的诊断上下文)中。实际上,您应该尽早完成此操作,例如在过滤器中,如下所示:

import javax.servlet.Filter;

import org.slf4j.MDC;

public class MDCFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        MDC.put("METHOD", ((HttpServletRequest)req).getMethod());
        try {
            chain.doFilter(req, resp);
        } finally {
            MDC.remove("METHOD");
        }
    }
}

然后,您可以根据MDC密钥的值直接登录到不同的文件&#39; METHOD&#39;使用Logback的SiftingAppender。

非常好的例子:https://www.mkyong.com/logging/logback-different-log-file-for-each-thread/(只需使用&#39; METHOD&#39;而不是&#39; logFileName&#39;)