服务端打印jersey restful请求的request/response

hance 2018-01-11

环境:

jersey.version:2.26
log4j.version:2.10.0
tomcat.version:8.5.2

在项目中,我们一般都用log4j2来做业务日志的输出,只要通过配置log4j2.xml,就能很方便的控制业务日志的输出级别,和内容了。

但是,jersey内部是用JUL来做日志输出的,当需要打印jersey的requst/response时,就不是这么好办了,因为JUL不受log4j2.xml的配置影响。

方法一,jersey继续用JUL,而业务日志用log4j2

1.在extendsResourceConfig的类中:

引用
register(LoggingFeature.class);

这样写表示用LoggingFeature中缺省的JUL的日志级别FINE

2.在tomcat/conf/logging.properties的最后增加一行

引用
org.glassfish.jersey.logging.level = FINE

这个修改后,jersey的requst/response日志只能输出catalina.xxx.log中,并且tomcat控制台并没有显示。

然后再修改下tomcat/conf/logging.properties,把

引用
java.util.logging.ConsoleHandler.level = INFO

改成

引用
java.util.logging.ConsoleHandler.level = FINE

这样,控制台就能看到jersey的request/response的日志输出了。

方法二,把jersey日志输出有log4j2来接管,把日志文件输出到统一的业务日志文件中,并通过log4j2.xml的配置来控制jersey日志的输出。

1.在extendsResourceConfig的类中:

引用
register(LoggingFeature.class);

2.把log4j2的相关类copy到tomcat/libs目录下

copy log4j-api-2.10.0.jar tomcat/libs/
copy log4j-core-2.10.0.jar tomcat/libs/
copy log4j-jul-2.10.0.jar tomcat/libs/

3.创建tomcat/conf/log4j2.xml,内容自己配置:

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="off" monitorInterval="30">
    <Properties>
        <Property name="log-path">${sys:user.dir}/logs</Property>
    </Properties>
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="LOG4J2 %d [%t] %p %C.%M()/%L - %msg%xEx%n"/>
        </Console>
        <File name="file_log" fileName="${log-path}/test.log">
           <PatternLayout pattern="LOG4J2 %d [%t] %p %C.%M()/%L - %msg%xEx%n"/>
        </File>
    </Appenders>

    <Loggers>
        <Logger name="com.joey" level="DEBUG" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="file_log"/>
        </Logger>
         <!-- LoggingFeature的缺省级别是JUL的FINE,和log4j2中的DEBUG对应,
              因此,
              这里写DEBUG,相当于打开了jersey的request/response日志;
              这里写INFO,相当于关闭了jersey的request/response日志 -->
         <Logger name="org.glassfish.jersey.logging" level="DEBUG" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="file_log"/>
        </Logger>

        <Root level="INFO">
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</configuration>

4.创建或者编辑tomcat/bin/setenv.bat

set CLASSPATH=../libs/log4j-api-2.10.0.jar;../libs/log4j-core-2.10.0.jar;../libs/log4j-jul-2.10.0.jar
set JAVA_OPTS=-Dlog4j.configurationFile=../conf/log4j2.xml
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager

这样,所有的日志都统一输出到test.log中了。并且通过修改log4j2.xml的配置,能动态控制日志的输出级别。

相关推荐