如何记录 HTTP GET 和 HTTP Post 来分隔文件

How to Log HTTP GET and HTTP Post to separate files

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

一个解决方案是在 class 中有两个记录器并相应地使用它们。即

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>

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

您应该将请求方法(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 key的值'METHOD'用Logback的SiftingAppender直接登录不同的文件

很好的例子:https://www.mkyong.com/logging/logback-different-log-file-for-each-thread/(只需使用 'METHOD' 而不是 'logFileName')