如何在Play框架中添加请求过滤器?

时间:2016-12-12 10:41:54

标签: java logging playframework

我想在我的日志中显示每次请求或操作所需的时间..

我将这个类添加到我的控制器中,但我的日志中没有任何变化! 我该怎么做才能在我的日志中显示请求时间?

提前谢谢你。 Reference of Class

import java.util.concurrent.CompletionStage;
import java.util.function.Function;
import javax.inject.Inject;
import akka.stream.Materializer;
import play.Logger;
import play.mvc.*;

public class LoggingFilter extends Filter {

    @Inject
    public LoggingFilter(Materializer mat) {
        super(mat);
    }

    @Override
    public CompletionStage<Result> apply(
            Function<Http.RequestHeader, CompletionStage<Result>> nextFilter,
            Http.RequestHeader requestHeader) {
        long startTime = System.currentTimeMillis();
        return nextFilter.apply(requestHeader).thenApply(result -> {
            long endTime = System.currentTimeMillis();
            long requestTime = endTime - startTime;

            Logger.info("{} {} took {}ms and returned {}",
                requestHeader.method(), requestHeader.uri(), requestTime, result.status());

            return result.withHeader("Request-Time", "" + requestTime);
        });
    }
}

1 个答案:

答案 0 :(得分:3)

您需要定义过滤器链 - 有关官方指南,请参阅this section of documentation

import filters.LoggingFilter;
import play.http.DefaultHttpFilters;
import javax.inject.Inject;

public class Filters extends DefaultHttpFilters {
  @Inject
  public Filters(LoggingFilter logging) {
    super(logging);
  }
}

如果您的Filters课程位于根目录中,则无需更改application.conf中的任何内容。对于标准Play包结构,根包与controllersviews处于同一级别,Filters类本身不会将package作为第一行源文件。

+- controllers
| \ App.java
+- filters
| \ LoggingFilter.java
- Filters.java

如果你有其他地方,比如com.example.filters,你需要在application.conf声明它。

play.http.filters=com.example.Filters