问题描述
我正在尝试使用log4j.
这是一个Junit项目,方法最终可以呼吁使用类似的方法.
private ResponseSpecification responseSpecification(RequestSpecification requestSpecification, Matcher matcher, int statusCode) { ResponseSpecification responseSpecification = requestSpecification.expect().statusCode(StatusCode).body(".", is(matcher)); if (log) { responseSpecification = responseSpecification.log().all(); } return responseSpecification; }
跟随官方doc ,我已经更改了这样的方法:
private ResponseSpecification responseSpecification(RequestSpecification requestSpecification, Matcher matcher, int statusCode) { final StringWriter writer = new StringWriter(); final PrintStream captor = new PrintStream(new WriterOutputStream(writer), true); ResponseSpecification responseSpecification = requestSpecification.filter(logResponseTo(captor)).expect().statusCode(statusCode).body(".", is(matcher)); System.out.println("writer = " + writer.toString() + " <-"); return responseSpecification; }
但writer.toString()打印总是一个void String(旧实现效果很好).也许我做错了什么,但是什么? :(
我需要以这种或其他方式获得可以通过log4j管理的可打印的东西.
任何人可以帮我吗?
推荐答案
我刚刚解决了将其写入RestSuite.setUp()方法
的问题RestAssured.config = config().logConfig(new LogConfig(defaultPrintStream));
并保持完整的旧代码.
private ResponseSpecification responseSpecification(RequestSpecification requestSpecification, Matcher matcher, int statusCode) { ResponseSpecification responseSpecification = requestSpecification.expect().statusCode(StatusCode).body(".", is(matcher)); if (log) { responseSpecification = responseSpecification.log().all(); } return responseSpecification; }
我希望它能在将来为某人提供帮助.
其他推荐答案
也可能很有用:在这里,将重新安装的log()调用重定向到提供的记录器:
import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import org.slf4j.Logger; /** * A wrapper class which takes a logger as constructor argument and offers a PrintStream whose flush * method writes the written content to the supplied logger (debug level). * <p> * Usage:<br> * initializing in @BeforeClass of the unit test: * <pre> * ToLoggerPrintStream loggerPrintStream = new ToLoggerPrintStream( myLog ); * RestAssured.config = RestAssured.config().logConfig( * new LogConfig( loggerPrintStream.getPrintStream(), true ) ); * </pre> * will redirect all log outputs of a ValidatableResponse to the supplied logger: * <pre> * resp.then().log().all( true ); * </pre> * * @version 1.0 (28.10.2015) * @author Heri Bender */ public class ToLoggerPrintStream { /** Logger for this class */ private Logger myLog; private PrintStream myPrintStream; /** * @return printStream */ public PrintStream getPrintStream() { if ( myPrintStream == null ) { OutputStream output = new OutputStream() { private StringBuilder myStringBuilder = new StringBuilder(); @Override public void write(int b) throws IOException { this.myStringBuilder.append((char) b ); } /** * @see java.io.OutputStream#flush() */ @Override public void flush() { myLog.debug( this.myStringBuilder.toString() ); myStringBuilder = new StringBuilder(); } }; myPrintStream = new PrintStream( output, true ); // true: autoflush must be set! } return myPrintStream; } /** * Constructor * * @param aLogger */ public ToLoggerPrintStream( Logger aLogger ) { super(); myLog = aLogger; }
其他推荐答案
PrintStream fileOutPutStream = new PrintStream(new File("somefile.txt")); RestAssured.config = config().logConfig(new LogConfig().defaultStream(fileOutPutStream));
使用printstream指向文件并给出要打印日志的文件名. 将上述代码放在测试的设置方法中,然后只需在下面的请求应用程序上拨打log
requestSpecification.log().all();
问题描述
I'm working into a method trying to change the default rest-assured log (which goes to the console) to a file using log4j.
It's a JUnit project which methods finally call to a REST facade, which have methods like this one.
private ResponseSpecification responseSpecification(RequestSpecification requestSpecification, Matcher matcher, int statusCode) { ResponseSpecification responseSpecification = requestSpecification.expect().statusCode(StatusCode).body(".", is(matcher)); if (log) { responseSpecification = responseSpecification.log().all(); } return responseSpecification; }
Following the official doc, I've changed the method like this:
private ResponseSpecification responseSpecification(RequestSpecification requestSpecification, Matcher matcher, int statusCode) { final StringWriter writer = new StringWriter(); final PrintStream captor = new PrintStream(new WriterOutputStream(writer), true); ResponseSpecification responseSpecification = requestSpecification.filter(logResponseTo(captor)).expect().statusCode(statusCode).body(".", is(matcher)); System.out.println("writer = " + writer.toString() + " <-"); return responseSpecification; }
But writer.toString() prints always a void string (the old implementation works fine). Maybe I'm doing something wrong, but what? :(
I need to get something printable which can be managed by log4j, in this or other way.
Can anyone help me?
推荐答案
I've just solved the problem writing this into the RestSuite.setUp() method
RestAssured.config = config().logConfig(new LogConfig(defaultPrintStream));
and keeping intact the old code.
private ResponseSpecification responseSpecification(RequestSpecification requestSpecification, Matcher matcher, int statusCode) { ResponseSpecification responseSpecification = requestSpecification.expect().statusCode(StatusCode).body(".", is(matcher)); if (log) { responseSpecification = responseSpecification.log().all(); } return responseSpecification; }
I hope it can help to someone in a future.
其他推荐答案
Might be useful too: Here a class which redirects the restAssured log() calls to a supplied logger:
import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import org.slf4j.Logger; /** * A wrapper class which takes a logger as constructor argument and offers a PrintStream whose flush * method writes the written content to the supplied logger (debug level). * <p> * Usage:<br> * initializing in @BeforeClass of the unit test: * <pre> * ToLoggerPrintStream loggerPrintStream = new ToLoggerPrintStream( myLog ); * RestAssured.config = RestAssured.config().logConfig( * new LogConfig( loggerPrintStream.getPrintStream(), true ) ); * </pre> * will redirect all log outputs of a ValidatableResponse to the supplied logger: * <pre> * resp.then().log().all( true ); * </pre> * * @version 1.0 (28.10.2015) * @author Heri Bender */ public class ToLoggerPrintStream { /** Logger for this class */ private Logger myLog; private PrintStream myPrintStream; /** * @return printStream */ public PrintStream getPrintStream() { if ( myPrintStream == null ) { OutputStream output = new OutputStream() { private StringBuilder myStringBuilder = new StringBuilder(); @Override public void write(int b) throws IOException { this.myStringBuilder.append((char) b ); } /** * @see java.io.OutputStream#flush() */ @Override public void flush() { myLog.debug( this.myStringBuilder.toString() ); myStringBuilder = new StringBuilder(); } }; myPrintStream = new PrintStream( output, true ); // true: autoflush must be set! } return myPrintStream; } /** * Constructor * * @param aLogger */ public ToLoggerPrintStream( Logger aLogger ) { super(); myLog = aLogger; }
其他推荐答案
PrintStream fileOutPutStream = new PrintStream(new File("somefile.txt")); RestAssured.config = config().logConfig(new LogConfig().defaultStream(fileOutPutStream));
Use a printStream to point to a file & give a filename you want to print the log. Put the above code in your setup method for the tests & then just call log on your RequestSpecification instance as below
requestSpecification.log().all();