Java – Jersey LoggingFilter with log4j

jakarta-eejavajerseylog4jlogging

I have a rest service developed with jersey, I have a ContainerRequestFilters for print the request, as follows:

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

and I have logger in the post methods using log4j. But the LoggingFilter print in the log different log4j. Is there any way that LogginFilter use the log4j's configuration?

I tried this in the log4j.xml file:

<logger name="com.sun.jersey.api.container.filter.LoggingFilter">
    <level value="info" />
    <appender-ref ref="ROOT" />
    <appender-ref ref="CONSOLE" />
</logger>

but it don't work 🙁

Best Answer

One way to handle this is to write a filter for the java logger where you simply log to message with the log4j logger, or which ever you prefer and you sink the java logging by always returning false.

Logger javaLogger = Logger.getLogger(YourClass.class.getName());
            javaLogger.setFilter(new Filter() {
                @Override
                public boolean isLoggable(LogRecord record) {
                    log4jLogger.info(new Date(record.getMillis()) + " " + record.getLevel() + " " + record.getMessage());
                    return false;
                }
            });
            this.jerseyClient.register(new LoggingFilter(javaLogger, true));
Related Topic