Jersey 2.28和LoggingFeature无效

问题描述 投票:0回答:2

我希望我能找到一些帮助,了解如何修复我的示例应用程序日志。

这是Jersey服务器,这是它唯一的资源:

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";
    }

}

示例项目的结构如下:

Sample Project Structure

这是pom.xml,我认为Jersey需要工作的所有依赖项:

<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>

Jersey的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());
                    }
                }
            }
        }
    }

}

问题是在调用端点时没有记录请求和响应。

正如您在上面所看到的,我尝试确保无论如何都能正确设置记录器。

我认为它的处理程序已经到位,但由于某些原因,泽西岛并没有发送任何东西。

请您澄清一些澄清。

jersey-2.0 java.util.logging
2个回答
0
投票

谢谢你的帮助,mehrens,现在一切正常!首先,我摆脱了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
投票

我认为它的处理程序已经到位,但由于某些原因,泽西岛并没有发送任何东西。

记录器树是动态的,并且会将记录器附加到树中,因为代码需要创建记录器。在代码创建记录器之前,您的配置代码可能正在运行。尝试将根记录器级别设置为ALL,因为始终会创建此记录器。这是通过在代码中添加以下内容来完成的:

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

接下来验证logger level changes have been applied to your logger tree and handlers。在大多数情况下,您还可以使用JConsole在运行时检查记录器树。

如果您知道记录请求和响应的记录器的名称,那么您可以通过使用正确的参数调用Logger::getLogger来创建对这些记录器的“private static final”引用。

© www.soinside.com 2019 - 2024. All rights reserved.