记录器调用 Jersey 项目

logger calls Jersey Project

我使用 Jersey-1.19、Jackson-1.9.2、log4j-1.2、Java 和 Servlet 技术创建了一个 WS REST 项目。对于 运行 我使用的项目 tomcat-8.

我需要配置文件 log4j.properties 来显示 WS REST 中所有可用方法的所有请求。可能吗?

基本上,我需要为 logger all REQUEST 做什么?

我的 log4j.properties 是:

#### Use two appenders, one to log to console, another to log to a file
logFolder = D:/logs
log4j.rootCategory=debug

#### First appender writes to console
log4j.appender.myConsole=org.apache.log4j.ConsoleAppender
log4j.appender.myConsole.Threshold=debug
log4j.appender.myConsole.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.myConsole.layout.ConversionPattern=%d{DATE} %-5p: [%C{1}.%M(%L)] %m%n

我的答案在这里http://wpcertification.blogspot.pt/2012/06/enabling-request-and-response-logging.html .

基本上,我需要在 Jersey REST Servlet 的定义中添加 web.xml 以下参数:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>

如果您想自定义请求和响应的日志记录消息,您可以创建自定义日志记录过滤器。

public class CustomLoggingFilter extends LoggingFilter implements ContainerRequestFilter, ContainerResponseFilter {

    private static Logger logger = Logger.getLogger(CustomLoggingFilter.class.getName());

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        StringBuilder sb = new StringBuilder();
        sb.append("\nMethod : ").append(request.getMethod().toUpperCase())
                                .append("  Path : ").append(request.getRequestUri().getPath())
                                .append("\nHeaders : ").append(request.getRequestHeaders());

        logger.log(Level.INFO, "\nHTTP REQUEST" + sb.toString());

        return request;
    }

    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        ObjectMapper objectMapper = new ObjectMapper();
        StringBuilder sb = new StringBuilder();
        sb.append("\nHeaders : ").append(response.getHttpHeaders());
        sb.append("\nStatus : ").append(response.getStatus());

        try {
            sb.append("\nEntity : ").append(objectMapper.writeValueAsString(response.getEntity()));
        } catch (Exception e) {
            logger.log(Level.INFO, "\nEntity : ERROR in converting entity to JSON for logging. " + e.getMessage());
        }

        logger.log(Level.INFO, "\nHTTP RESPONSE" + sb.toString());

        return response;
    }
}

在 web.xml 中你应该使用“[packagename].CustomLoggingFilter” 而不是 "com.sun.jersey.api.container.filter.LoggingFilter"