Джерси 2.28 и LoggingFeature не работает - PullRequest
0 голосов
/ 01 марта 2019

Я надеюсь, что смогу найти какую-то помощь, чтобы понять, как я могу исправить мой пример журнала приложений.

Это сервер Джерси, и это его единственный ресурс:

package br.com.logplanning.jersey.resources;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("hello")
public class HelloResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String showMessage() {
        return "Hello from Brazil";
    }

}

Структурапримера проекта:

Пример структуры проекта

Это pom.xml со всеми зависимостями, которые, я думаю, Джерси требует для работы:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>br.com.logplanning.jersey</groupId>
    <artifactId>hello-jersey-logging</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <name>Jersey and LoggingFeatures</name>
    <url>http://wwww.logplanning.com.br</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <javax.servlet.version>3.1.0</javax.servlet.version>
        <jersey.version>2.28</jersey.version>
    </properties>

    <build>
        <finalName>hello-jersey-logging</finalName>
    </build>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${javax.servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>${jersey.version}</version>
        </dependency>

    </dependencies>
</project>

ServletContainer на Джерси инициализируется с помощью дескриптора развертывания (я не могу запустить его по коду):

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <display-name>Contact - REST Service</display-name>
    <servlet>
        <servlet-name>Jersey and LoggingFeatures</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>br.com.logplanning.jersey.resources</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey and LoggingFeatures</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Наконец, у проекта есть этот класс для настройки LoggingFeature:

package br.com.logplanning.jersey.resources;

import java.util.Enumeration;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.logging.LoggingFeature;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("resources")
public class AppResourceConfig extends ResourceConfig {

    private static final Logger LOG = Logger.getLogger(AppResourceConfig.class.getName());

    public AppResourceConfig() {
        // Registering a new LoggingFeature object
        register(new LoggingFeature(Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME), Level.ALL, LoggingFeature.Verbosity.PAYLOAD_ANY, Integer.MAX_VALUE));
        LOG.info("===========> " + LoggingFeature.DEFAULT_LOGGER_NAME);

        // Searching for all handlers and setting then to Level.ALL
        LogManager manager = LogManager.getLogManager();
        Enumeration<String> loggerNames = manager.getLoggerNames();
        while (loggerNames.hasMoreElements()) {
            String nextElement = loggerNames.nextElement();
            Logger logger = manager.getLogger(nextElement);
            if (logger.getHandlers().length > 0) {
                Handler[] handlers = logger.getHandlers();
                for (Handler h : handlers) {
                    Level oldLevel = h.getLevel();
                    if (!oldLevel.equals(Level.ALL))
                        h.setLevel(Level.ALL);
                        LOG.info("===========> " + nextElement + ": from " + oldLevel + " to " + h.getLevel());
                    }
                }
            }
        }
    }

}

Проблема в том, что запросы и ответы не регистрируются во время вызова конечной точки.

Я пытался, как вы можете видеть выше, убедиться, что регистратор будет установлен правильно, нетнесмотря ни на что.

Я думаю, что его обработчик на месте, но по какой-то причине Джерси ничего не отправляет.

Буду признателен за некоторые разъяснения, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Спасибо за вашу помощь, jmehrens, теперь все работает отлично!Сначала я избавился от инициализации DD (web.xml).Файл web.xml был уменьшен до минимального содержания, например:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <display-name>Contact - REST Service</display-name>
</web-app>

Вся инициализация была собрана в классе AppResourceConfig:

package br.com.logplanning.jersey.resources;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.logging.LoggingFeature;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("resources")
public class AppResourceConfig extends ResourceConfig {

    private static final Logger LOGGING_INTERCEPTOR = Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME);

    public AppResourceConfig() {
        //Registering the resources package (no DD needed)
        packages("br.com.logplanning.jersey.resources");

        // Registering a new LoggingFeature object
        //https://www.javaguides.net/2018/06/jersey-rest-logging-using-loggingfeature.html
        register(new LoggingFeature(LOGGING_INTERCEPTOR, Level.INFO,
                LoggingFeature.Verbosity.PAYLOAD_ANY, Integer.MAX_VALUE));

        // https://stackoverflow.com/questions/44882648/logging-not-showing/44888306#44888306
        Logger.getLogger("").setLevel(Level.INFO);
    }
}

Одна часть решенийдолжен был исправить настройки иерархии регистратора, а другая часть была посвящена инициализации перехвата журнала вместе с регистрацией пакета ресурса.

0 голосов
/ 02 марта 2019

Я думаю, что его обработчик на месте, но по какой-то причине Джерси ничего не отправляет.

Дерево регистратора является динамическим и присоединяет регистраторы к дереву, как того требует кодсоздание регистратора.Возможно, ваш код конфигурации запущен до того, как код создал регистратор.Попробуйте установить уровень корневого регистратора на ВСЕ, так как этот регистратор всегда создается.Это можно сделать, добавив в свой код следующее:

Logger.getLogger("").setLevel(Level.ALL);

Затем убедитесь, что изменения уровня логгера применены к вашему дереву логгера и обработчикам .Вы также можете использовать JConsole в большинстве случаев для проверки дерева регистратора во время выполнения.

Если вы знаете имя регистратора, который записывает запросы и ответы, вы можете создать 'private static final''ссылки на эти регистраторы путем вызова Logger :: getLogger с правильным аргументом.

...