web-dev-qa-db-ja.com

Jersey 2.2(JAX-RS)でJsonリクエストボディを含むログ出力を生成するにはどうすればよいですか

REST=リクエストを処理するために、Jetty 9.0.4内でJersey 2.2サーブレットを実行しています。

ほとんどすべてが良好で、リクエストは処理されますが、[〜#〜] any [〜#〜]ジャージークラスからのログを見たことはありません。そして、それをジャージー2.2で実現するために犠牲にする必要がある鶏を示すドコを見つけることができません。

だから私の最初の質問は-ジャージーにログを生成させるために何をする必要があるかです。

リクエストが正しく実行されない場合(Jsonリクエストの本文を解析できないなど)、ジャージーはContainerExceptionをスローし、「START_OBJECTトークンからJava.util.ArrayListのインスタンスをデシリアライズできません」などのメッセージを表示します。この時点で、 be really着信リクエストの本文をログに記録して、Jsonを検査できるようにしてください。繰り返しますが、現在のdocoには、そのような獣の概要を示すものは何もありません。そして、いずれにせよ、私が質問1を上に解決するまでは、それは無意味です。

したがって、2番目の質問は、(要求を中断することなく)受信した要求の本文をどのようにログに記録するかです。

Web.xmlのJerseyサーブレット構成は次のようになります。

<servlet >
    <servlet-name>Jersey Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>au.com.xandar.wirelesstiming.recorder.web.rest.JerseyApplication</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

私のジャージーアプリケーションは:

public final class JerseyApplication extends ResourceConfig {

    public JerseyApplication() {
        super(
            //JacksonFeature.class   // Switching on Jackson
            // (My) JerseyLoggingFilter.class       // Log requests using Jersey ContainerRequestFilter 
            MyApplicationEventListener.class        // Log Requests using Jersey RequestEventListener
        );
        packages("au.com.xandar.wirelesstiming.recorder");

        // Enable LoggingFilter & output entity.
        // NB This does NOT generate any log.
        registerInstances(new LoggingFilter(Logger.getLogger(JerseyApplication.class.getName()), true));
    }
}
11
William

ジャージーはそれだけではあまりログに記録しません。 2.xでは、開発モードに取り組んでいます。これには、トレースサポートが含まれます( Jerseyでのトレース を参照)、デフォルト着信要求/発信応答のログ(エンティティ本体とトレースメッセージを含む)。この機能はまもなくリリースされる予定です。

2番目の質問については、 LoggingFilter を登録できます。これにより、受信リクエスト/送信応答(メソッド、ヘッダーなど)とエンティティ本体(構成されている場合)をログに記録できます。次の方法で構成できます(3番目のオプションは、エンティティロギングをオンにする方法を示しています)。

web.xml(JAX-RSサーブレット定義に追加):

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>

Application拡張子:

public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        return new HashSet<Class<?>>() {{
            // Add your resources.
            add(HelloWorldResource.class);

            // Add LoggingFilter.
            add(LoggingFilter.class);
        }};
    }
}

ResourceConfigインスタンス(エンティティの出力もここで示します):

public class MyApplication extends ResourceConfig {

    public MyApplication() {
        // Resources - add your package name here to enable package scanning.
        packages(...);

        // Enable LoggingFilter & output entity.     
        registerInstances(new LoggingFilter(Logger.getLogger(MyApplication.class.getName()), true));
    }
}
12
Michal Gajdos