Playframework 将api调用日志写入文件
这就是我试过的 ApiLogWriter.javaPlayframework 将api调用日志写入文件,playframework,sbt,Playframework,Sbt,这就是我试过的 ApiLogWriter.java package utils; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class ApiLogWriter { FileWriter fw; BufferedWriter bw; PrintWriter out;
package utils;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class ApiLogWriter {
FileWriter fw;
BufferedWriter bw;
PrintWriter out;
public ApiLogWriter() {
try {
fw = new FileWriter("apiCallLog.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void writeToFile(String apiString) {
out.println(apiString);
out.flush();
}
@Override
protected void finalize() throws Throwable {
if (out != null)
out.close();
if (bw != null)
bw.close();
if (fw != null)
fw.close();
super.finalize();
}
}
ExampleFilter.java
package filters;
import akka.stream.Materializer;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.Executor;
import java.util.function.Function;
import javax.inject.*;
import play.mvc.*;
import play.mvc.Http.RequestHeader;
import utils.ApiLogWriter;
/**
* This is a simple filter that adds a header to all requests. It's
* added to the application's list of filters by the
* {@link ExampleFilters} class.
*/
@Singleton
public class ExampleFilter extends Filter {
private final Executor exec;
/**
* @param mat This object is needed to handle streaming of requests
* and responses.
* @param exec This class is needed to execute code asynchronously.
* It is used below by the <code>thenAsyncApply</code> method.
*/
@Inject
public ExampleFilter(Materializer mat, Executor exec) {
super(mat);
this.exec = exec;
}
@Inject
private ApiLogWriter apiLogWriter;
@Override
public CompletionStage<Result> apply(
Function<RequestHeader, CompletionStage<Result>> next,
RequestHeader requestHeader) {
apiLogWriter.writeToFile(requestHeader.path());
return next.apply(requestHeader).thenApplyAsync(
result -> result.withHeader("X-ExampleFilter", "foo"),
exec
);
}
}
当我使用sbt Run运行该代码时,该代码工作正常,但在项目根/target/universal/stage/bin目录中的sbt stage
之后启动时,该文件为空
请注意,我在dev模式下运行它时,for
fork in run:=false
,但在stage build中它是true您确定查看了正确的文件吗?在服务器的当前工作目录中创建文件。。。因此,它可能在Project\u Root/target/universal/stage/
文件夹中。是的,正在创建文件,但实际上它在Project\u Root/target/universal/stage/bin目录中是空的。您是否在配置中启用了过滤器?例如play.filters.enabled+=filters.ExampleFilter
。不,这是在application.conf
中使用的HOCON语法。看见