ジャージー:実際のリクエストを印刷する


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メソッドはJersey2.xには存在しません。これを今どのように使用していますか?
ダニエルカプラン

2
JAX-RS 2.xは、Jersey1.x独自のクライアントAPIと同等の機能を提供します。詳細: jersey.java.net/documentation/latest/…– ivan.cikic 2015
1

ログ出力のカスタマイズに興味がある人のために、彼らは自分の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、リクエスト「および/または」レスポンスがログに記録されると言っています。私のマシンでは、両方がログに記録されます。


これはJersey2.25でうまく機能しますが、私が使用している2.7では、「logging」パッケージはorg.glassfish.jersey.core:jersey-common内にありません。2.7でどのパッケージに移動されたか知っていますか?
ティム

これは、要求または応答の本文を印刷しません。ヘッダーのみが表示されます
DavidBrossard19年

2
@DavidBrossardこれを制御するコンストラクターパラメーターとしてorg.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANYを使用します。
AxelW

51

@ ivan.cikicの答えはJersey1.xに対するものです。Jersey2.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、それは、Java Utilのロギングを使用するためにあなたを強制するために本当に迷惑です。それが私にロガーの制御を与えてくれればもっと良いでしょう。デザインが一歩後退したようです。


3
これが古い答えであることは知っていますが、質問があります-リクエストに含まれるすべての情報をロガーに印刷させる方法を知っていますか?特に、クッキー。LoggingFilter(Logger logger, boolean PrintEntity)コンストラクターを使用しましたが、それでもCookieは出力されません。
bkaiser 2015年

2
LoggingFilterは非推奨になりました。LoggingFeatureのMartinの回答を使用する必要があります。これは、さまざまな量の詳細を印刷するためのVerbosity列挙型もサポートします。Cookieを含むヘッダーを出力する必要があります。
Dan Hardiker 2017年

何らかの理由でLoggingFeature何かを印刷していませんLoggingFilter...🤷♂️印刷を行います
フェランMaylinch

0

これらの回答はすべてかなり近いですが、要求と応答の本文をログに記録する設定がありません。少なくともJersey2.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.Allandの8192値はnull。簡潔にするために、ここでそれらを提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.