Jersey : 실제 요청 인쇄


88

Jersey가 생성하여 서버로 보내는 실제 요청을 보려면 어떻게해야합니까? 특정 요청에 문제가 있으며 웹 서버를 실행하는 동료가 전체 요청을 보도록 요청했습니다 (헤더 등).


3
서버 측에서 로깅하려면 다음 게시물을 참조하십시오. [서버에서 저지 로그를 얻는 방법?] [1] [1] : stackoverflow.com/questions/2332515/…
eeezyy

답변:


100

Jersey Client API를 사용하는 경우 LoggingFilter (클라이언트 필터)가 도움이 될 것입니다.

Client client = Client.create();
client.addFilter(new LoggingFilter(System.out));
WebResource webResource = client.resource("http://localhost:9998/");
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON)
                                         .get(ClientResponse.class);

그렇지 않으면 다른 LoggingFilter (컨테이너 필터)를 사용하여 서버에서 요청과 응답을 다시 기록 할 수 있습니다 .


5
addFilter방법은 Jersey 2.x에 없습니다. 지금 어떻게 사용합니까?
Daniel Kaplan

2
JAX-RS 2.x는 Jersey 1.x 독점 클라이언트 API와 동등한 기능을 제공합니다. 자세한 내용 : jersey.java.net/documentation/latest/…
ivan.cikic

로그 출력을 사용자 정의에 관심이있는 사람들을 위해, 그들은 자신의 LoggingFilter를 만들 수 있습니다 stackoverflow.com/questions/30187514/...
nacho4d

55

이후 뉴저지 2.23 하는 거기 LoggingFeature당신이 사용할 수 있습니다. 다음은 약간 단순화 된 예 WebTarget입니다. 또한 기능을 등록 할 수 있습니다.

Logger logger = Logger.getLogger(getClass().getName());

Feature feature = new LoggingFeature(logger, Level.INFO, null, null);

Client client = ClientBuilder.newBuilder()
        .register(feature)
        .build();

Response response = client.target("https://www.google.com")
        .queryParam("q", "Hello, World!")
        .request().get();

JavaDoc은 LoggingFeature요청 "및 / 또는"응답이 lol로 기록된다고 말합니다. 내 컴퓨터에는 둘 다 기록됩니다.


이것은 Jersey 2.25에서 잘 작동하지만, 내가 사용하고있는 2.7에서는 "logging"패키지가 더 이상 org.glassfish.jersey.core : jersey-common 내에 위치하지 않습니다. 2.7에서 어떤 패키지로 이동되었는지 알고 있습니까?
Tim

이것은 요청 또는 응답의 본문을 인쇄하지 않습니다. 그것은 단지 헤더를 보여줍니다
데이비드 브로사드에게

2
@DavidBrossard org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY를 생성자 매개 변수로 사용하여이를 제어합니다.
AxelW

51

@ ivan.cikic의 대답은 Jersey 1.x입니다. Jersey 2.x에서 수행하는 방법은 다음과 같습니다.

import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.filter.LoggingFilter;
import org.json.JSONException;
import org.json.JSONObject;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;

...

        ClientConfig config = new ClientConfig();

        Client client = ClientBuilder.newClient(config);
        client.register(new LoggingFilter());

이것은 관련이 있지만, 난 그냥 불평 : 새로운는 LoggingFilter이 자바 백분율 로깅을 사용하도록 강제하기 때문에 정말 짜증나입니다. 로거를 제어 할 수 있다면 더 좋을 것입니다. 디자인에서 한 걸음 뒤로 물러 난 것 같습니다.


3
이것이 오래된 답변이라는 것을 알고 있지만 질문이 있습니다. 로거가 요청에 포함 된 모든 정보를 인쇄하도록하는 방법을 알고 있습니까? 특히 쿠키. LoggingFilter(Logger logger, boolean PrintEntity)생성자를 사용 했지만 쿠키를 인쇄하지 않습니다.
bkaiser 2015

2
LoggingFilter는 이제 더 이상 사용되지 않습니다. LoggingFeature에 대한 Martin의 답변을 사용해야합니다. 또한 다양한 세부 사항을 인쇄하기 위해 Verbosity 열거 형을 지원합니다. 쿠키를 포함해야하는 헤더를 인쇄해야합니다.
Dan Hardiker

어떤 이유로 LoggingFeature아무것도 인쇄하지 않고 인쇄합니다 LoggingFilter... 🤷‍♂️
Ferran Maylinch

0

이 모든 답변은 매우 비슷하지만 요청 및 응답 본문을 기록하는 설정이 없습니다. 적어도 Jersey 2.30.1에서는 이것이 각각의 본문을 포함하여 요청 및 응답을 로깅하는 방법입니다.

import javax.ws.rs.client.ClientBuilder;
import org.glassfish.jersey.logging.LoggingFeature;
import java.util.logging.Level;
import java.util.logging.Logger;

Logger logger = Logger.getLogger("LoggingFeature");
logger.setLevel(Level.ALL);
ClientBuilder.newClient()
  .target("https://www.example.com")
  .register(new LoggingFeature(
    logger,
    Level.ALL,
    LoggingFeature.Verbosity.PAYLOAD_ANY,
    8192))
  .request()
  .get();

기술적으로 Level.All8192값은 null. 간결하게 여기에 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.