This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 64c04c0d6 Improvements to CallLogger API.
64c04c0d6 is described below

commit 64c04c0d6b8e8757c4b74d93c0f41cfc6d082671
Author: JamesBognar <[email protected]>
AuthorDate: Mon Jul 4 09:13:55 2022 -0400

    Improvements to CallLogger API.
---
 .../java/org/apache/juneau/cp/BeanCreator.java     |   2 -
 .../java/org/apache/juneau/rest/RestContext.java   | 127 ++----
 .../java/org/apache/juneau/rest/RestOpContext.java |   2 +-
 .../java/org/apache/juneau/rest/RestOpSession.java |   2 +-
 .../java/org/apache/juneau/rest/RestRequest.java   |   6 +-
 .../java/org/apache/juneau/rest/RestResponse.java  |   6 +-
 .../java/org/apache/juneau/rest/RestSession.java   |  12 +-
 .../org/apache/juneau/rest/annotation/Rest.java    |  12 +-
 .../juneau/rest/annotation/RestAnnotation.java     |   8 +-
 .../apache/juneau/rest/arg/RestContextArgs.java    |   4 +-
 .../apache/juneau/rest/config/DefaultConfig.java   |   2 +-
 ...sicTestCallLogger.java => BasicCallLogger.java} |  70 +--
 .../rest/logger/BasicDisabledCallLogger.java       |  15 +-
 .../juneau/rest/logger/BasicTestCallLogger.java    |  20 +-
 .../rest/logger/BasicTestCaptureCallLogger.java    |  22 +-
 .../org/apache/juneau/rest/logger/CallLogger.java  | 458 ++++++++++++++++++-
 .../apache/juneau/rest/logger/CallLoggerRule.java  |   2 +-
 .../org/apache/juneau/rest/logger/RestLogger.java  | 490 ---------------------
 .../rest/annotation/RestAnnotation_Test.java       |  10 +-
 .../juneau/rest/annotation/Rest_Debug_Test.java    |   2 +-
 .../rest/client/RestClient_Headers_Test.java       |   2 +-
 21 files changed, 583 insertions(+), 691 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
index 67833f611..7178d1720 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
@@ -157,8 +157,6 @@ public class BeanCreator<T> {
         * @return This object.
         */
        public BeanCreator<T> type(Class<?> value) {
-               if (value != null && ! type.inner().isAssignableFrom(value))
-                       throw new ExecutableException("Could not instantiate 
class of type {0} because it was not a subtype of the class: {1}.", type, 
value);
                type = ClassInfo.of(value);
                return this;
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index f96314c79..e5629fb6f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -23,10 +23,8 @@ import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.rest.HttpRuntimeException.*;
 import static org.apache.juneau.rest.processor.ResponseProcessor.*;
 import static java.util.Collections.*;
-import static java.util.logging.Level.*;
 import static java.util.Optional.*;
 import static org.apache.juneau.rest.annotation.RestOpAnnotation.*;
-import static org.apache.juneau.rest.logger.CallLoggingDetail.*;
 
 import java.io.*;
 import java.lang.annotation.*;
@@ -231,7 +229,7 @@ public class RestContext extends Context {
                private MethodExecStore.Builder methodExecStore;
                private Messages.Builder messages;
                private ResponseProcessorList.Builder responseProcessors;
-               private RestLogger.Builder callLogger;
+               private BeanCreator<CallLogger> callLogger;
                private HttpPartSerializer.Creator partSerializer;
                private HttpPartParser.Creator partParser;
                private JsonSchemaGenerator.Builder jsonSchemaGenerator;
@@ -1781,7 +1779,7 @@ public class RestContext extends Context {
                
//-----------------------------------------------------------------------------------------------------------------
 
                /**
-                * Returns the call logger sub-builder.
+                * Returns the call logger bean creator.
                 *
                 * <p>
                 * Specifies the logger to use for logging of HTTP requests and 
responses.
@@ -1789,7 +1787,11 @@ public class RestContext extends Context {
                 * <h5 class='section'>Example:</h5>
                 * <p class='bjava'>
                 *      <jc>// Our customized logger.</jc>
-                *      <jk>public class</jk> MyLogger <jk>extends</jk> 
RestLogger {
+                *      <jk>public class</jk> MyLogger <jk>extends</jk> 
BasicCallLogger {
+                * 
+                *              <jk>public</jk> MyLogger(BeanStore 
<jv>beanStore</jv>) {
+                *                      <jk>super</jk>(<jv>beanStore</jv>);
+                *              }
                 *
                 *              <ja>@Override</ja>
                 *                      <jk>protected void</jk> log(Level 
<jv>level</jv>, String <jv>msg</jv>, Throwable <jv>e</jv>) {
@@ -1818,17 +1820,14 @@ public class RestContext extends Context {
                 *
                 * <ul class='notes'>
                 *      <li class='note'>
-                *              The default call logger if not specified is 
{@link RestLogger}.
+                *              The default call logger if not specified is 
{@link BasicCallLogger}.
                 *      <li class='note'>
-                *              The resource class itself will be used if it 
implements the {@link RestLogger} interface and not
+                *              The resource class itself will be used if it 
implements the {@link CallLogger} interface and not
                 *              explicitly overridden via this annotation.
                 *      <li class='note'>
-                *              When defined as a class, the implementation 
must have one of the following constructors:
+                *              When defined as a class, the implementation 
must have one of the following constructor:
                 *              <ul>
-                *                      <li><code><jk>public</jk> 
T(RestContext)</code>
-                *                      <li><code><jk>public</jk> T()</code>
-                *                      <li><code><jk>public static</jk> T 
<jsm>create</jsm>(RestContext)</code>
-                *                      <li><code><jk>public static</jk> T 
<jsm>create</jsm>()</code>
+                *                      <li><code><jk>public</jk> 
T(BeanStore)</code>
                 *              </ul>
                 *      <li class='note'>
                 *              Inner classes of the REST resource class are 
allowed.
@@ -1842,31 +1841,31 @@ public class RestContext extends Context {
                 * @return The call logger sub-builder.
                 * @throws RuntimeException If {@link #init(Supplier)} has not 
been called.
                 */
-               public RestLogger.Builder callLogger() {
+               public BeanCreator<CallLogger> callLogger() {
                        if (callLogger == null)
-                               callLogger = createCallLogger(beanStore(), 
resource());
+                               callLogger = createCallLogger();
                        return callLogger;
                }
 
                /**
-                * Applies an operation to the call logger sub-builder.
+                * Specifies the call logger class to use for this REST context.
                 *
-                * <p>
-                * Typically used to allow you to execute operations without 
breaking the fluent flow of the context builder.
-                *
-                * <h5 class='section'>Example:</h5>
-                * <p class='bjava'>
-                *      RestContext <jv>context</jv> = RestContext
-                *              .<jsm>create</jsm>(<jv>resourceClass</jv>, 
<jv>parentContext</jv>, <jv>servletConfig</jv>)
-                *              .callLogger(<jv>x</jv> -&gt; 
<jv>x</jv>.disabled())
-                *              .build();
-                * </p>
+                * @param value The new value for this setting.
+                * @return This object.
+                */
+               public Builder callLogger(Class<? extends CallLogger> value) {
+                       callLogger().type(value);
+                       return this;
+               }
+
+               /**
+                * Specifies the call logger class to use for this REST context.
                 *
-                * @param operation The operation to apply.
+                * @param value The new value for this setting.
                 * @return This object.
                 */
-               public Builder callLogger(Consumer<RestLogger.Builder> 
operation) {
-                       operation.accept(callLogger());
+               public Builder callLogger(CallLogger value) {
+                       callLogger().impl(value);
                        return this;
                }
 
@@ -1882,7 +1881,7 @@ public class RestContext extends Context {
                 *                      <li>{@link 
RestContext.Builder#callLogger()}
                 *                      <li>{@link Rest#callLogger()}.
                 *              </ul>
-                *      <li>Looks for a static or non-static 
<c>createCallLogger()</c> method that returns {@link RestLogger} on the
+                *      <li>Looks for a static or non-static 
<c>createCallLogger()</c> method that returns {@link CallLogger} on the
                 *              resource class with any of the following 
arguments:
                 *              <ul>
                 *                      <li>{@link RestContext}
@@ -1898,70 +1897,28 @@ public class RestContext extends Context {
                 *      <li class='jm'>{@link RestContext.Builder#callLogger()}
                 * </ul>
                 *
-                * @param beanStore
-                *      The factory used for creating beans and retrieving 
injected beans.
-                * @param resource
-                *      The REST servlet/bean instance that this context is 
defined against.
                 * @return A new call logger sub-builder.
                 */
-               protected RestLogger.Builder createCallLogger(BeanStore 
beanStore, Supplier<?> resource) {
+               protected BeanCreator<CallLogger> createCallLogger() {
 
-                       // Default value.
-                       Value<RestLogger.Builder> v = Value.of(
-                               RestLogger
-                                       .create(beanStore)
-                                       .normalRules(  // Rules when debugging 
is not enabled.
-                                               
CallLoggerRule.create(beanStore)  // Log 500+ errors with status-line and 
header information.
-                                                       .statusFilter(a -> a >= 
500)
-                                                       .level(SEVERE)
-                                                       .requestDetail(HEADER)
-                                                       .responseDetail(HEADER)
-                                                       .build(),
-                                               
CallLoggerRule.create(beanStore)  // Log 400-500 errors with just status-line 
information.
-                                                       .statusFilter(a -> a >= 
400)
-                                                       .level(WARNING)
-                                                       
.requestDetail(STATUS_LINE)
-                                                       
.responseDetail(STATUS_LINE)
-                                                       .build()
-                                       )
-                                       .debugRules(  // Rules when debugging 
is enabled.
-                                               
CallLoggerRule.create(beanStore)  // Log everything with full details.
-                                                       .level(SEVERE)
-                                                       .requestDetail(ENTITY)
-                                                       .responseDetail(ENTITY)
-                                                       .build()
-                                       )
-                       );
-
-                       // Replace with bean from bean store.
-                       rootBeanStore
-                               .getBean(RestLogger.class)
-                               .ifPresent(x-> v.get().impl(x));
-
-                       // Replace with this bean.
-                       resourceAs(RestLogger.class)
-                               .ifPresent(x -> v.get().impl(x));
+                       BeanCreator<CallLogger> creator = 
beanStore.createBean(CallLogger.class).type(BasicCallLogger.class);
 
                        // Specify the bean type if its set as a default.
                        defaultClasses()
-                               .get(RestLogger.class)
-                               .ifPresent(x -> v.get().type(x));
+                               .get(CallLogger.class)
+                               .ifPresent(x -> creator.type(x));
 
-                       // Replace with builder from:  public [static] 
RestLogger.Builder createCallLogger(<args>)
-                       beanStore
-                               .createMethodFinder(RestLogger.Builder.class)
-                               .addBean(RestLogger.Builder.class, v.get())
-                               .find("createCallLogger")
-                               .run(x -> v.set(x));
+                       rootBeanStore
+                               .getBean(CallLogger.class)
+                               .ifPresent(x -> creator.impl(x));
 
-                       // Replace with bean from:  public [static] RestLogger 
createCallLogger(<args>)
+                       // Replace with bean from:  public [static] CallLogger 
createCallLogger(<args>)
                        beanStore
-                               .createMethodFinder(RestLogger.class)
-                               .addBean(RestLogger.Builder.class, v.get())
+                               .createMethodFinder(CallLogger.class)
                                .find("createCallLogger")
-                               .run(x -> v.get().impl(x));
+                               .run(x -> creator.impl(x));
 
-                       return v.get();
+                       return creator;
                }
 
                
//-----------------------------------------------------------------------------------------------------------------
@@ -5872,7 +5829,7 @@ public class RestContext extends Context {
 
        private final FileFinder fileFinder;
        private final StaticFiles staticFiles;
-       private final RestLogger callLogger;
+       private final CallLogger callLogger;
        private final DebugEnablement debugEnablement;
 
        private final ThreadLocal<RestSession> localSession = new 
ThreadLocal<>();
@@ -5944,7 +5901,7 @@ public class RestContext extends Context {
                        varResolver = bs.add(VarResolver.class, 
builder.varResolver().bean(Messages.class, messages).build());
                        config = bs.add(Config.class, 
builder.config().resolving(varResolver.createSession()));
                        responseProcessors = bs.add(ResponseProcessor[].class, 
builder.responseProcessors().build().toArray());
-                       callLogger = bs.add(RestLogger.class, 
builder.callLogger().loggerOnce(logger).thrownStoreOnce(thrownStore).build());
+                       callLogger = bs.add(CallLogger.class, 
builder.callLogger().orElse(null));
                        partSerializer = bs.add(HttpPartSerializer.class, 
builder.partSerializer().create());
                        partParser = bs.add(HttpPartParser.class, 
builder.partParser().create());
                        jsonSchemaGenerator = bs.add(JsonSchemaGenerator.class, 
builder.jsonSchemaGenerator().build());
@@ -6192,7 +6149,7 @@ public class RestContext extends Context {
         *      The call logger to use for this resource.
         *      <br>Never <jk>null</jk>.
         */
-       public RestLogger getCallLogger() {
+       public CallLogger getCallLogger() {
                return callLogger;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
index d6db9ba64..8875054ed 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
@@ -2214,7 +2214,7 @@ public class RestOpContext extends Context implements 
Comparable<RestOpContext>
        private final List<MediaType>
                supportedAcceptTypes,
                supportedContentTypes;
-       private final RestLogger callLogger;
+       private final CallLogger callLogger;
 
        private final Map<Class<?>,ResponseBeanMeta> responseBeanMetas = new 
ConcurrentHashMap<>();
        private final Map<Class<?>,ResponsePartMeta> headerPartMetas = new 
ConcurrentHashMap<>();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
index b84c5ab8f..6c34b0513 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
@@ -84,7 +84,7 @@ public class RestOpSession extends ContextSession {
                 * @param value The new value for this setting.  Can be 
<jk>null</jk>.
                 * @return This object.
                 */
-               public Builder logger(RestLogger value) {
+               public Builder logger(CallLogger value) {
                        session.logger(value);
                        return this;
                }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 2348b0f2a..837820a5b 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -1376,7 +1376,7 @@ public final class RestRequest {
         * Sets the <js>"Exception"</js> attribute to the specified throwable.
         *
         * <p>
-        * This exception is used by {@link RestLogger} for logging purposes.
+        * This exception is used by {@link CallLogger} for logging purposes.
         *
         * @param t The attribute value.
         * @return This object.
@@ -1390,7 +1390,7 @@ public final class RestRequest {
         * Sets the <js>"NoTrace"</js> attribute to the specified boolean.
         *
         * <p>
-        * This flag is used by {@link RestLogger} and tells it not to log the 
current request.
+        * This flag is used by {@link CallLogger} and tells it not to log the 
current request.
         *
         * @param b The attribute value.
         * @return This object.
@@ -1413,7 +1413,7 @@ public final class RestRequest {
         * Sets the <js>"Debug"</js> attribute to the specified boolean.
         *
         * <p>
-        * This flag is used by {@link RestLogger} to help determine how a 
request should be logged.
+        * This flag is used by {@link CallLogger} to help determine how a 
request should be logged.
         *
         * @param b The attribute value.
         * @return This object.
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
index 2f8b6f746..68b316921 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -634,7 +634,7 @@ public final class RestResponse {
         * Sets the <js>"Exception"</js> attribute to the specified throwable.
         *
         * <p>
-        * This exception is used by {@link RestLogger} for logging purposes.
+        * This exception is used by {@link CallLogger} for logging purposes.
         *
         * @param t The attribute value.
         * @return This object.
@@ -648,7 +648,7 @@ public final class RestResponse {
         * Sets the <js>"NoTrace"</js> attribute to the specified boolean.
         *
         * <p>
-        * This flag is used by {@link RestLogger} and tells it not to log the 
current request.
+        * This flag is used by {@link CallLogger} and tells it not to log the 
current request.
         *
         * @param b The attribute value.
         * @return This object.
@@ -671,7 +671,7 @@ public final class RestResponse {
         * Sets the <js>"Debug"</js> attribute to the specified boolean.
         *
         * <p>
-        * This flag is used by {@link RestLogger} to help determine how a 
request should be logged.
+        * This flag is used by {@link CallLogger} to help determine how a 
request should be logged.
         *
         * @param b The attribute value.
         * @return This object.
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestSession.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestSession.java
index 05f7dabd5..9806b536a 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestSession.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestSession.java
@@ -72,7 +72,7 @@ public class RestSession extends ContextSession {
                Object resource;
                HttpServletRequest req;
                HttpServletResponse res;
-               RestLogger logger;
+               CallLogger logger;
                String pathInfoUndecoded;
                UrlPath urlPath;
 
@@ -145,7 +145,7 @@ public class RestSession extends ContextSession {
                 * @param value The value for this setting.
                 * @return This object.
                 */
-               public Builder logger(RestLogger value) {
+               public Builder logger(CallLogger value) {
                        logger = value;
                        return this;
                }
@@ -206,7 +206,7 @@ public class RestSession extends ContextSession {
        private HttpServletRequest req;
        private HttpServletResponse res;
 
-       private RestLogger logger;
+       private CallLogger logger;
        private UrlPath urlPath;
        private String pathInfoUndecoded;
        private long startTime = System.currentTimeMillis();
@@ -230,7 +230,7 @@ public class RestSession extends ContextSession {
 
                req = beanStore.add(HttpServletRequest.class, builder.req);
                res = beanStore.add(HttpServletResponse.class, builder.res);
-               logger = beanStore.add(RestLogger.class, builder.logger);
+               logger = beanStore.add(CallLogger.class, builder.logger);
                urlPath = beanStore.add(UrlPath.class, builder.urlPath);
                pathInfoUndecoded = builder.pathInfoUndecoded;
        }
@@ -245,8 +245,8 @@ public class RestSession extends ContextSession {
         * @param value The new value for this setting.  Can be <jk>null</jk>.
         * @return This object.
         */
-       public RestSession logger(RestLogger value) {
-               logger = beanStore.add(RestLogger.class, value);
+       public RestSession logger(CallLogger value) {
+               logger = beanStore.add(CallLogger.class, value);
                return this;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
index df60d2c7b..2d4216476 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
@@ -199,9 +199,9 @@ public @interface Rest {
         *
         * <ul class='notes'>
         *      <li class='note'>
-        *              The default call logger if not specified is {@link 
RestLogger}.
+        *              The default call logger if not specified is {@link 
CallLogger}.
         *      <li class='note'>
-        *              The resource class itself will be used if it implements 
the {@link RestLogger} interface and not
+        *              The resource class itself will be used if it implements 
the {@link CallLogger} interface and not
         *              explicitly overridden via this annotation.
         *      <li class='note'>
         *              The implementation must have one of the following 
constructors:
@@ -222,12 +222,12 @@ public @interface Rest {
         *
         * @return The annotation value.
         */
-       Class<? extends RestLogger> callLogger() default RestLogger.Void.class;
+       Class<? extends CallLogger> callLogger() default CallLogger.Void.class;
 
        /**
         * The resolver used for resolving instances of child resources and 
various other beans including:
         * <ul>
-        *      <li>{@link RestLogger}
+        *      <li>{@link CallLogger}
         *      <li>{@link SwaggerProvider}
         *      <li>{@link FileFinder}
         *      <li>{@link StaticFiles}
@@ -373,7 +373,7 @@ public @interface Rest {
         *      <li>
         *              HTTP request/response bodies are cached in memory for 
logging purposes.
         *      <li>
-        *              HTTP requests/responses are logged to the registered 
{@link RestLogger}.
+        *              HTTP requests/responses are logged to the registered 
{@link CallLogger}.
         * </ul>
         *
         * <ul class='values'>
@@ -421,7 +421,7 @@ public @interface Rest {
         *      <li>
         *              HTTP request/response bodies are cached in memory for 
logging purposes on matching classes and methods.
         *      <li>
-        *              HTTP requests/responses are logged to the registered 
{@link RestLogger}.
+        *              HTTP requests/responses are logged to the registered 
{@link CallLogger}.
         * </ul>
         *
         * <p>
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
index 54fd38218..f02087f22 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
@@ -103,7 +103,7 @@ public class RestAnnotation {
                Class<? extends FileFinder> fileFinder = FileFinder.Void.class;
                Class<? extends StaticFiles> staticFiles = 
StaticFiles.Void.class;
                Class<? extends ResponseProcessor>[] responseProcessors = new 
Class[0];
-               Class<? extends RestLogger> callLogger = RestLogger.Void.class;
+               Class<? extends CallLogger> callLogger = CallLogger.Void.class;
                Class<? extends RestContext> contextClass = 
RestContext.Void.class;
                Class<? extends RestConverter>[] converters = new Class[0];
                Class<? extends RestGuard>[] guards = new Class[0];
@@ -197,7 +197,7 @@ public class RestAnnotation {
                 * @param value The new value for this property.
                 * @return This object.
                 */
-               public Builder callLogger(Class<? extends RestLogger> value) {
+               public Builder callLogger(Class<? extends CallLogger> value) {
                        this.callLogger = value;
                        return this;
                }
@@ -722,7 +722,7 @@ public class RestAnnotation {
                private final Class<? extends FileFinder> fileFinder;
                private final Class<? extends StaticFiles> staticFiles;
                private final Class<? extends ResponseProcessor>[] 
responseProcessors;
-               private final Class<? extends RestLogger> callLogger;
+               private final Class<? extends CallLogger> callLogger;
                private final Class<? extends RestContext> contextClass;
                private final Class<? extends RestConverter>[] converters;
                private final Class<? extends RestGuard>[] guards;
@@ -826,7 +826,7 @@ public class RestAnnotation {
                }
 
                @Override /* Rest */
-               public Class<? extends RestLogger> callLogger() {
+               public Class<? extends CallLogger> callLogger() {
                        return callLogger;
                }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/RestContextArgs.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/RestContextArgs.java
index 5a594874f..8cd6f8c19 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/RestContextArgs.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/RestContextArgs.java
@@ -41,7 +41,7 @@ import org.apache.juneau.utils.*;
  *     <li class='jc'>{@link RestChildren}
  *     <li class='jc'>{@link RestContext}
  *     <li class='jc'>{@link RestContextStats}
- *     <li class='jc'>{@link RestLogger}
+ *     <li class='jc'>{@link CallLogger}
  *     <li class='jc'>{@link RestOperations}
  *     <li class='jc'>{@link StaticFiles}
  *     <li class='jc'>{@link ThrownStore}
@@ -81,7 +81,7 @@ public class RestContextArgs extends SimpleRestOperationArg {
                        return new RestContextArgs(x->x);
                if (paramInfo.isType(RestContextStats.class))
                        return new RestContextArgs(x->x.getStats());
-               if (paramInfo.isType(RestLogger.class))
+               if (paramInfo.isType(CallLogger.class))
                        return new RestContextArgs(x->x.getCallLogger());
                if (paramInfo.isType(RestOperations.class))
                        return new RestContextArgs(x->x.getRestOperations());
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/config/DefaultConfig.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/config/DefaultConfig.java
index 93b0c5151..43bd356ea 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/config/DefaultConfig.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/config/DefaultConfig.java
@@ -34,7 +34,7 @@ import org.apache.juneau.oapi.*;
        
allowedMethodHeaders="$S{j.allowedMethodHeaders,$E{J_ALLOWED_METHOD_HEADERS,}}",
        
allowedMethodParams="$S{j.allowedMethodParams,$E{J_ALLOWED_METHOD_PARAMS,HEAD,OPTIONS}}",
        beanStore=BeanStore.class,
-       callLogger=CallLogger.class,
+       callLogger=BasicCallLogger.class,
        
clientVersionHeader="$S{j.clientVersionHeader,$E{J_CLIENT_VERSION_HEADER,Client-Version}}",
        config="$S{j.configFile,$E{J_CONFIG_FILE,SYSTEM_DEFAULT}}",
        consumes={},
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicCallLogger.java
similarity index 55%
copy from 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java
copy to 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicCallLogger.java
index 23c55d54d..e92c2c99f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicCallLogger.java
@@ -12,30 +12,14 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.logger;
 
-import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.rest.logger.CallLoggingDetail.*;
-import static org.apache.juneau.Enablement.*;
 import static java.util.logging.Level.*;
-
-import javax.servlet.http.*;
+import static org.apache.juneau.rest.logger.CallLoggingDetail.*;
 
 import org.apache.juneau.cp.*;
 import org.apache.juneau.rest.*;
 
 /**
- * Default implementation of a {@link RestLogger} that only logs REST call 
errors unless no-log is enabled on the request.
- *
- * <p>
- * Useful for REST tests where you know that a particular call is going to 
produce an error response and you don't want that
- * response to be logged producing noisy test output.
- *
- * <p>
- * Requests can be tagged as no-log (meaning don't log if there's an error) in 
any of the following ways:
- * <ul>
- *     <li>A <js>"No-Trace: true"</js> header.
- *     <li>A <js>"noTrace=true"</js> query parameter.
- *     <li>A <js>"NoTrace"</js> request attribute with a string value of 
<js>"true"</js>.
- * </ul>
+ * Basic implementation of a call logger.
  *
  * <h5 class='section'>Configured Settings:</h5>
  * <ul>
@@ -49,58 +33,50 @@ import org.apache.juneau.rest.*;
  *     <li class='extlink'>{@source}
  * </ul>
  */
-public class BasicTestCallLogger extends CallLogger {
+public class BasicCallLogger extends CallLogger {
 
        /**
-        * Constructor.
+        * Constructor using specific settings.
         *
-        * @param context The context of the resource object.
+        * @param beanStore The bean store containing injectable beans for this 
logger.
         */
-       public BasicTestCallLogger(RestContext context) {
-               
super(builder().logger(context.getLogger()).thrownStore(context.getThrownStore()));
+       public BasicCallLogger(BeanStore beanStore) {
+               super(beanStore);
        }
 
-       private static RestLogger.Builder builder() {
-               BeanStore bs = BeanStore.INSTANCE;
-               return RestLogger.create(bs)
+       /**
+        * Constructor using default settings.
+        * <p>
+        * Uses the same settings as {@link CallLogger}.
+        */
+       public BasicCallLogger() {
+               super(BeanStore.INSTANCE);
+       }
+
+       @Override
+       protected Builder init(BeanStore beanStore) {
+               return super.init(beanStore)
                        .normalRules(  // Rules when debugging is not enabled.
-                               CallLoggerRule.create(bs)  // Log 500+ errors 
with status-line and header information.
-                                       .statusFilter(x -> x >= 400)
+                               CallLoggerRule.create(beanStore)  // Log 500+ 
errors with status-line and header information.
+                                       .statusFilter(x -> x >= 500)
                                        .level(SEVERE)
                                        .requestDetail(HEADER)
                                        .responseDetail(HEADER)
-                                       .enabled(CONDITIONAL)
-                                       .enabledPredicate(x -> ! isNoTrace(x))  
// Only log if it's not a no-trace request.
-                                       .logStackTrace()
                                        .build(),
-                               CallLoggerRule.create(bs)  // Log 400-500 
errors with just status-line information.
+                               CallLoggerRule.create(beanStore)  // Log 
400-500 errors with just status-line information.
                                        .statusFilter(x -> x >= 400)
                                        .level(WARNING)
                                        .requestDetail(STATUS_LINE)
                                        .responseDetail(STATUS_LINE)
-                                       .enabled(CONDITIONAL)
-                                       .enabledPredicate(x -> ! isNoTrace(x))  
// Only log if it's not a no-trace request.
-                                       .logStackTrace()
                                        .build()
                        )
                        .debugRules(  // Rules when debugging is enabled.
-                               CallLoggerRule.create(bs)  // Log everything 
with full details.
+                               CallLoggerRule.create(beanStore)  // Log 
everything with full details.
                                        .level(SEVERE)
                                        .requestDetail(ENTITY)
                                        .responseDetail(ENTITY)
-                                       .logStackTrace()
                                        .build()
                        )
                ;
        }
-
-       private static boolean isNoTrace(HttpServletRequest req) {
-               Object o = req.getAttribute("NoTrace");
-               if (o != null)
-                       return "true".equalsIgnoreCase(o.toString());
-               String s = req.getHeader("No-Trace");
-               if (s != null)
-                       return "true".equalsIgnoreCase(s);
-               return 
emptyIfNull(req.getQueryString()).contains("noTrace=true");
-       }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java
index 22e35946e..bd32ff5b7 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicDisabledCallLogger.java
@@ -12,10 +12,10 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.logger;
 
-import org.apache.juneau.rest.*;
+import org.apache.juneau.cp.*;
 
 /**
- * Default implementation of a {@link RestLogger} that never logs REST calls.
+ * Default implementation of a {@link CallLogger} that never logs REST calls.
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jrs.LoggingAndDebugging}
@@ -27,9 +27,14 @@ public class BasicDisabledCallLogger extends CallLogger {
        /**
         * Constructor.
         *
-        * @param context The context of the resource object.
+        * @param beanStore The bean store containing injectable beans for this 
logger.
         */
-       public BasicDisabledCallLogger(RestContext context) {
-               super(RestLogger.create(context.getBeanStore()).disabled());
+       public BasicDisabledCallLogger(BeanStore beanStore) {
+               super(beanStore);
+       }
+
+       @Override
+       protected Builder init(BeanStore beanStore) {
+               return super.init(beanStore).disabled();
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java
index 23c55d54d..cdc214e96 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCallLogger.java
@@ -23,7 +23,7 @@ import org.apache.juneau.cp.*;
 import org.apache.juneau.rest.*;
 
 /**
- * Default implementation of a {@link RestLogger} that only logs REST call 
errors unless no-log is enabled on the request.
+ * Default implementation of a {@link CallLogger} that only logs REST call 
errors unless no-log is enabled on the request.
  *
  * <p>
  * Useful for REST tests where you know that a particular call is going to 
produce an error response and you don't want that
@@ -54,17 +54,17 @@ public class BasicTestCallLogger extends CallLogger {
        /**
         * Constructor.
         *
-        * @param context The context of the resource object.
+        * @param beanStore The bean store containing injectable beans for this 
logger.
         */
-       public BasicTestCallLogger(RestContext context) {
-               
super(builder().logger(context.getLogger()).thrownStore(context.getThrownStore()));
+       public BasicTestCallLogger(BeanStore beanStore) {
+               super(beanStore);
        }
 
-       private static RestLogger.Builder builder() {
-               BeanStore bs = BeanStore.INSTANCE;
-               return RestLogger.create(bs)
+       @Override
+       protected Builder init(BeanStore beanStore) {
+               return super.init(beanStore)
                        .normalRules(  // Rules when debugging is not enabled.
-                               CallLoggerRule.create(bs)  // Log 500+ errors 
with status-line and header information.
+                               CallLoggerRule.create(beanStore)  // Log 500+ 
errors with status-line and header information.
                                        .statusFilter(x -> x >= 400)
                                        .level(SEVERE)
                                        .requestDetail(HEADER)
@@ -73,7 +73,7 @@ public class BasicTestCallLogger extends CallLogger {
                                        .enabledPredicate(x -> ! isNoTrace(x))  
// Only log if it's not a no-trace request.
                                        .logStackTrace()
                                        .build(),
-                               CallLoggerRule.create(bs)  // Log 400-500 
errors with just status-line information.
+                               CallLoggerRule.create(beanStore)  // Log 
400-500 errors with just status-line information.
                                        .statusFilter(x -> x >= 400)
                                        .level(WARNING)
                                        .requestDetail(STATUS_LINE)
@@ -84,7 +84,7 @@ public class BasicTestCallLogger extends CallLogger {
                                        .build()
                        )
                        .debugRules(  // Rules when debugging is enabled.
-                               CallLoggerRule.create(bs)  // Log everything 
with full details.
+                               CallLoggerRule.create(beanStore)  // Log 
everything with full details.
                                        .level(SEVERE)
                                        .requestDetail(ENTITY)
                                        .responseDetail(ENTITY)
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java
index 92aa7cf15..bf0524f37 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/BasicTestCaptureCallLogger.java
@@ -23,7 +23,7 @@ import org.apache.juneau.cp.*;
 
 /**
  *
- * Implementation of a {@link RestLogger} that captures log entries for 
testing logging itself.
+ * Implementation of a {@link CallLogger} that captures log entries for 
testing logging itself.
  *
  * <p>
  * Instead of logging messages to a log file, messages are simply kept in an 
internal atomic string reference.
@@ -78,10 +78,10 @@ public class BasicTestCaptureCallLogger extends CallLogger {
        /**
         * Constructor using specific settings.
         *
-        * @param builder The settings to use for this logger.
+        * @param beanStore The bean store containing injectable beans for this 
logger.
         */
-       public BasicTestCaptureCallLogger(RestLogger.Builder builder) {
-               super(builder);
+       public BasicTestCaptureCallLogger(BeanStore beanStore) {
+               super(beanStore);
        }
 
        /**
@@ -90,20 +90,20 @@ public class BasicTestCaptureCallLogger extends CallLogger {
         * Uses the same settings as {@link CallLogger}.
         */
        public BasicTestCaptureCallLogger() {
-               super(builder());
+               super(BeanStore.INSTANCE);
        }
 
-       private static RestLogger.Builder builder() {
-               BeanStore bs = BeanStore.INSTANCE;
-               return RestLogger.create(bs)
+       @Override
+       protected Builder init(BeanStore beanStore) {
+               return super.init(beanStore)
                        .normalRules(  // Rules when debugging is not enabled.
-                               CallLoggerRule.create(bs)  // Log 500+ errors 
with status-line and header information.
+                               CallLoggerRule.create(beanStore)  // Log 500+ 
errors with status-line and header information.
                                        .statusFilter(x -> x >= 500)
                                        .level(SEVERE)
                                        .requestDetail(HEADER)
                                        .responseDetail(HEADER)
                                        .build(),
-                               CallLoggerRule.create(bs)  // Log 400-500 
errors with just status-line information.
+                               CallLoggerRule.create(beanStore)  // Log 
400-500 errors with just status-line information.
                                        .statusFilter(x -> x >= 400)
                                        .level(WARNING)
                                        .requestDetail(STATUS_LINE)
@@ -111,7 +111,7 @@ public class BasicTestCaptureCallLogger extends CallLogger {
                                        .build()
                        )
                        .debugRules(  // Rules when debugging is enabled.
-                               CallLoggerRule.create(bs)  // Log everything 
with full details.
+                               CallLoggerRule.create(beanStore)  // Log 
everything with full details.
                                        .level(SEVERE)
                                        .requestDetail(ENTITY)
                                        .responseDetail(ENTITY)
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java
index 4d6fb7c2e..ffe38a9f8 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLogger.java
@@ -12,9 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.logger;
 
+import static java.util.logging.Level.*;
+import static org.apache.juneau.Enablement.*;
 import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
+import static org.apache.juneau.internal.SystemEnv.*;
 import static org.apache.juneau.rest.logger.CallLoggingDetail.*;
 
 import java.util.*;
@@ -31,7 +35,7 @@ import org.apache.juneau.rest.stats.*;
 import org.apache.juneau.rest.util.*;
 
 /**
- * Basic implementation of a {@link RestLogger} for logging HTTP requests.
+ * Basic implementation of a {@link CallLogger} for logging HTTP requests.
  *
  * <p>
  * Provides the following capabilities:
@@ -49,7 +53,7 @@ import org.apache.juneau.rest.util.*;
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bjava'>
- *             RestLogger <jv>logger</jv> = RestLogger
+ *             CallLogger <jv>logger</jv> = CallLogger
  *                     .<jsm>create</jsm>()
  *                     .logger(<js>"MyLogger"</js>)  <jc>// Use MyLogger Java 
logger.</jc>
  *                     .normalRules(  <jc>// Rules when debugging is not 
enabled.</jc>
@@ -87,10 +91,419 @@ import org.apache.juneau.rest.util.*;
  *     <li class='extlink'>{@source}
  * </ul>
  */
-public class CallLogger implements RestLogger {
+public class CallLogger {
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Static
+       
//-----------------------------------------------------------------------------------------------------------------
 
        private static final CallLoggerRule DEFAULT_RULE = 
CallLoggerRule.create(BeanStore.INSTANCE).build();
 
+       /** Represents no logger */
+       public abstract class Void extends CallLogger {
+               Void(BeanStore beanStore) {
+                       super(beanStore);
+               }
+       }
+
+       /**
+        * System property name for the default logger name to use for {@link 
CallLogger} objects.
+        * <p>
+        * Can also use a <c>JUNEAU_RESTLOGGER_LOGGER</c> environment variable.
+        * <p>
+        * If not specified, the default is <js>"global"</js>.
+        */
+       public static final String SP_logger = "juneau.restLogger.logger";
+
+       /**
+        * System property name for the default enablement setting for {@link 
CallLogger} objects.
+        * <p>
+        * Can also use a <c>JUNEAU_RESTLOGGER_ENABLED</c> environment variable.
+        * <p>
+        * The possible values are:
+        * <ul>
+        *      <li>{@link Enablement#ALWAYS "ALWAYS"} (default) - Logging is 
enabled.
+        *      <li>{@link Enablement#NEVER "NEVER"} - Logging is disabled.
+        *      <li>{@link Enablement#CONDITIONAL "CONDITIONALLY"} - Logging is 
enabled if it passes the {@link Builder#enabledTest(Predicate)} test.
+        * </ul>
+        */
+       public static final String SP_enabled = "juneau.restLogger.enabled";
+
+       /**
+        * System property name for the default request detail setting for 
{@link CallLogger} objects.
+        * <p>
+        * Can also use a <c>JUNEAU_RESTLOGGER_REQUESTDETAIL</c> environment 
variable.
+        *
+        * <ul class='values'>
+        *      <li>{@link CallLoggingDetail#STATUS_LINE "STATUS_LINE"} 
(default) - Log only the status line.
+        *      <li>{@link CallLoggingDetail#HEADER "HEADER"} - Log the status 
line and headers.
+        *      <li>{@link CallLoggingDetail#ENTITY "ENTITY"} - Log the status 
line and headers and content if available.
+        * </ul>
+        */
+       public static final String SP_requestDetail = 
"juneau.restLogger.requestDetail";
+
+       /**
+        * System property name for the default response detail setting for 
{@link CallLogger} objects.
+        * <p>
+        * Can also use a <c>JUNEAU_RESTLOGGER_RESPONSEDETAIL</c> environment 
variable.
+        *
+        * <ul class='values'>
+        *      <li>{@link CallLoggingDetail#STATUS_LINE "STATUS_LINE"} 
(default) - Log only the status line.
+        *      <li>{@link CallLoggingDetail#HEADER "HEADER"} - Log the status 
line and headers.
+        *      <li>{@link CallLoggingDetail#ENTITY "ENTITY"} - Log the status 
line and headers and content if available.
+        * </ul>
+        */
+       public static final String SP_responseDetail = 
"juneau.restLogger.responseDetail";
+
+       /**
+        * System property name for the logging level setting for {@link 
CallLogger} objects.
+        * <p>
+        * Can also use a <c>JUNEAU_RESTLOGGER_LEVEL</c> environment variable.
+        *
+        * <ul class='values'>
+        *      <li>{@link Level#OFF "OFF"} (default)
+        *      <li>{@link Level#SEVERE "SEVERE"}
+        *      <li>{@link Level#WARNING "WARNING"}
+        *      <li>{@link Level#INFO "INFO"}
+        *      <li>{@link Level#CONFIG "CONFIG"}
+        *      <li>{@link Level#FINE "FINE"}
+        *      <li>{@link Level#FINER "FINER"}
+        *      <li>{@link Level#FINEST "FINEST"}
+        * </ul>
+        */
+       public static final String SP_level = "juneau.restLogger.level";
+
+       /**
+        * Static creator.
+        *
+        * @param beanStore The bean store to use for creating beans.
+        * @return A new builder for this object.
+        */
+       public static Builder create(BeanStore beanStore) {
+               return new Builder(beanStore);
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Builder
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Builder class.
+        */
+       @FluentSetters
+       public static class Builder {
+
+               Logger logger;
+               ThrownStore thrownStore;
+               List<CallLoggerRule> normalRules = list(), debugRules = list();
+               Enablement enabled;
+               Predicate<HttpServletRequest> enabledTest;
+               CallLoggingDetail requestDetail, responseDetail;
+               Level level;
+
+               /**
+                * Constructor.
+                *
+                * @param beanStore The bean store to use for creating beans.
+                */
+               protected Builder(BeanStore beanStore) {
+                       logger = Logger.getLogger(env(SP_logger, "global"));
+                       enabled = env(SP_enabled, ALWAYS);
+                       enabledTest = x -> false;
+                       requestDetail = env(SP_requestDetail, STATUS_LINE);
+                       responseDetail = env(SP_responseDetail, STATUS_LINE);
+                       level = env(SP_level).map(Level::parse).orElse(OFF);
+               }
+
+               
//-------------------------------------------------------------------------------------------------------------
+               // Properties
+               
//-------------------------------------------------------------------------------------------------------------
+
+               /**
+                * Specifies the logger to use for logging the request.
+                *
+                * <p>
+                * If not specified, the logger name is determined in the 
following order:
+                * <ol>
+                *      <li><js>{@link CallLogger#SP_logger 
"juneau.restLogger.logger"} system property.
+                *      <li><js>{@link CallLogger#SP_logger 
"JUNEAU_RESTLOGGER_LOGGER"} environment variable.
+                *      <li><js>"global"</js>.
+                * </ol>
+                *
+                * <p>
+                * The {@link CallLogger#getLogger()} method can also be 
overridden to provide different logic.
+                *
+                * @param value
+                *      The logger to use for logging the request.
+                * @return This object.
+                */
+               public Builder logger(Logger value) {
+                       logger = value;
+                       return this;
+               }
+
+               /**
+                * Specifies the logger to use for logging the request.
+                *
+                * <p>
+                * Shortcut for calling 
<c>logger(Logger.<jsm>getLogger</jsm>(value))</c>.
+                *
+                * <p>
+                * If not specified, the logger name is determined in the 
following order:
+                * <ol>
+                *      <li><js>{@link CallLogger#SP_logger 
"juneau.restLogger.logger"} system property.
+                *      <li><js>{@link CallLogger#SP_logger 
"JUNEAU_RESTLOGGER_LOGGER"} environment variable.
+                *      <li><js>"global"</js>.
+                * </ol>
+                *
+                * <p>
+                * The {@link CallLogger#getLogger()} method can also be 
overridden to provide different logic.
+                *
+                * @param value
+                *      The logger to use for logging the request.
+                * @return This object.
+                */
+               public Builder logger(String value) {
+                       logger = value == null ? null :Logger.getLogger(value);
+                       return this;
+               }
+
+               /**
+                * Same as {@link #logger(Logger)} but only sets the value if 
it's currently <jk>null</jk>.
+                *
+                * @param value The logger to use for logging the request.
+                * @return This object.
+                */
+               public Builder loggerOnce(Logger value) {
+                       if (logger == null)
+                               logger = value;
+                       return this;
+               }
+
+               /**
+                * Specifies the thrown exception store to use for getting 
stack trace information (hash IDs and occurrence counts).
+                *
+                * @param value
+                *      The stack trace store.
+                *      <br>If <jk>null</jk>, stack trace information will not 
be logged.
+                * @return This object.
+                */
+               public Builder thrownStore(ThrownStore value) {
+                       thrownStore = value;
+                       return this;
+               }
+
+               /**
+                * Same as {@link #thrownStore(ThrownStore)} but only sets the 
value if it's currently <jk>null</jk>.
+                *
+                * @param value
+                *      The stack trace store.
+                *      <br>If <jk>null</jk>, stack trace information will not 
be logged.
+                * @return This object.
+                */
+               public Builder thrownStoreOnce(ThrownStore value) {
+                       if (thrownStore == null)
+                               thrownStore = value;
+                       return this;
+               }
+               /**
+                * Specifies the default logging enablement setting.
+                *
+                * <p>
+                * This specifies the default logging enablement value if not 
set on the first matched rule or if no rules match.
+                *
+                * <p>
+                * If not specified, the setting is determined via the 
following:
+                * <ul>
+                *      <li><js>{@link CallLogger#SP_enabled 
"juneau.restLogger.enabled"} system property.
+                *      <li><js>{@link CallLogger#SP_enabled 
"JUNEAU_RESTLOGGER_ENABLED"} environment variable.
+                *      <li><js>"ALWAYS"</js>.
+                * </ul>
+                *
+                * <ul class='values'>
+                *      <li>{@link Enablement#ALWAYS ALWAYS} (default) - 
Logging is enabled.
+                *      <li>{@link Enablement#NEVER NEVER} - Logging is 
disabled.
+                *      <li>{@link Enablement#CONDITIONAL CONDITIONALLY} - 
Logging is enabled if it passes the {@link #enabledTest(Predicate)} test.
+                * </ul>
+                *
+                * <p>
+                * @param value
+                *      The default enablement flag value.  Can be 
<jk>null</jk> to use the default.
+                * @return This object.
+                */
+               public Builder enabled(Enablement value) {
+                       enabled = value;
+                       return this;
+               }
+
+               /**
+                * Specifies the default logging enablement test predicate.
+                *
+                * <p>
+                * This specifies the default logging enablement test if not 
set on the first matched rule or if no rules match.
+                *
+                * <p>
+                * This setting has no effect if the enablement setting is not 
{@link Enablement#CONDITIONAL CONDITIONALLY}.
+                *
+                * <p>
+                * The default if not specified is <c><jv>x</jv> -&gt; 
<jk>false</jk></c> (never log).
+                *
+                * @param value
+                *      The default enablement flag value.  Can be 
<jk>null</jk> to use the default.
+                * @return This object.
+                */
+               public Builder enabledTest(Predicate<HttpServletRequest> value) 
{
+                       enabledTest = value;
+                       return this;
+               }
+
+               /**
+                * Shortcut for calling <c>enabled(<jsf>NEVER</jsf>)</c>.
+                *
+                * @return This object.
+                */
+               public Builder disabled() {
+                       return enabled(NEVER);
+               }
+
+               /**
+                * The default level of detail to log on a request.
+                *
+                * <p>
+                * This specifies the default level of request detail if not 
set on the first matched rule or if no rules match.
+                *
+                * <p>
+                * If not specified, the setting is determined via the 
following:
+                * <ul>
+                *      <li><js>{@link CallLogger#SP_requestDetail 
"juneau.restLogger.requestDetail"} system property.
+                *      <li><js>{@link CallLogger#SP_requestDetail 
"JUNEAU_RESTLOGGER_requestDetail"} environment variable.
+                *      <li><js>"STATUS_LINE"</js>.
+                * </ul>
+                *
+                * <ul class='values'>
+                *      <li>{@link CallLoggingDetail#STATUS_LINE STATUS_LINE} - 
Log only the status line.
+                *      <li>{@link CallLoggingDetail#HEADER HEADER} - Log the 
status line and headers.
+                *      <li>{@link CallLoggingDetail#ENTITY ENTITY} - Log the 
status line and headers and content if available.
+                * </ul>
+                *
+                * @param value
+                *      The new value for this property, or <jk>null</jk> to 
use the default.
+                * @return This object.
+                */
+               public Builder requestDetail(CallLoggingDetail value) {
+                       requestDetail = value;
+                       return this;
+               }
+
+               /**
+                * The default level of detail to log on a response.
+                *
+                * <p>
+                * This specifies the default level of response detail if not 
set on the first matched rule or if no rules match.
+                *
+                * <p>
+                * If not specified, the setting is determined via the 
following:
+                * <ul>
+                *      <li><js>{@link CallLogger#SP_responseDetail 
"juneau.restLogger.responseDetail"} system property.
+                *      <li><js>{@link CallLogger#SP_responseDetail 
"JUNEAU_RESTLOGGER_responseDetail"} environment variable.
+                *      <li><js>"STATUS_LINE"</js>.
+                * </ul>
+                *
+                * <ul class='values'>
+                *      <li>{@link CallLoggingDetail#STATUS_LINE STATUS_LINE} - 
Log only the status line.
+                *      <li>{@link CallLoggingDetail#HEADER HEADER} - Log the 
status line and headers.
+                *      <li>{@link CallLoggingDetail#ENTITY ENTITY} - Log the 
status line and headers and content if available.
+                * </ul>
+                *
+                * @param value
+                *      The new value for this property, or <jk>null</jk> to 
use the default.
+                * @return This object.
+                */
+               public Builder responseDetail(CallLoggingDetail value) {
+                       responseDetail = value;
+                       return this;
+               }
+
+               /**
+                * The default logging level to use for logging the 
request/response.
+                *
+                * <p>
+                * This specifies the default logging level if not set on the 
first matched rule or if no rules match.
+                *
+                * <p>
+                * If not specified, the setting is determined via the 
following:
+                * <ul>
+                *      <li><js>{@link CallLogger#SP_level 
"juneau.restLogger.level"} system property.
+                *      <li><js>{@link CallLogger#SP_level 
"JUNEAU_RESTLOGGER_level"} environment variable.
+                *      <li><js>"OFF"</js>.
+                * </ul>
+                *
+                * @param value
+                *      The new value for this property, or <jk>null</jk> to 
use the default value.
+                * @return This object.
+                */
+               public Builder level(Level value) {
+                       level = value;
+                       return this;
+               }
+
+               /**
+                * Adds logging rules to use when debug mode is not enabled.
+                *
+                * <p>
+                * Logging rules are matched in the order they are added.  The 
first to match wins.
+                *
+                * @param values The logging rules to add to the list of rules.
+                * @return This object.
+                */
+               public Builder normalRules(CallLoggerRule...values) {
+                       for (CallLoggerRule rule : values)
+                               normalRules.add(rule);
+                       return this;
+               }
+
+               /**
+                * Adds logging rules to use when debug mode is enabled.
+                *
+                * <p>
+                * Logging rules are matched in the order they are added.  The 
first to match wins.
+                *
+                * @param values The logging rules to add to the list of rules.
+                * @return This object.
+                */
+               public Builder debugRules(CallLoggerRule...values) {
+                       for (CallLoggerRule rule : values)
+                               debugRules.add(rule);
+                       return this;
+               }
+
+               /**
+                * Shortcut for adding the same rules as normal and debug rules.
+                *
+                * <p>
+                * Logging rules are matched in the order they are added.  The 
first to match wins.
+                *
+                * @param values The logging rules to add to the list of rules.
+                * @return This object.
+                */
+               public Builder rules(CallLoggerRule...values) {
+                       return normalRules(values).debugRules(values);
+               }
+
+               /**
+                * Instantiates a new call logger based on the settings in this 
builder.
+                *
+                * @return A new call logger.
+                */
+               public CallLogger build() {
+                       return new CallLogger(this);
+               }
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Instance
+       
//-----------------------------------------------------------------------------------------------------------------
+
        private final Logger logger;
        private final ThrownStore thrownStore;
        private final CallLoggerRule[] normalRules, debugRules;
@@ -99,12 +512,32 @@ public class CallLogger implements RestLogger {
        private final Level level;
        private final CallLoggingDetail requestDetail, responseDetail;
 
+       /**
+        * Constructor.
+        * <p>
+        * Subclasses typically override the {@link #init(BeanStore)} method 
when using this constructor.
+        *
+        * @param beanStore The bean store containing injectable beans for this 
logger.
+        */
+       public CallLogger(BeanStore beanStore) {
+               Builder builder = init(beanStore);
+               this.logger = builder.logger;
+               this.thrownStore = builder.thrownStore;
+               this.normalRules = builder.normalRules.toArray(new 
CallLoggerRule[builder.normalRules.size()]);
+               this.debugRules = builder.debugRules.toArray(new 
CallLoggerRule[builder.debugRules.size()]);
+               this.enabled = builder.enabled;
+               this.enabledTest = builder.enabledTest;
+               this.requestDetail = builder.requestDetail;
+               this.responseDetail = builder.responseDetail;
+               this.level = builder.level;
+       }
+
        /**
         * Constructor.
         *
-        * @param builder The builder object.
+        * @param builder The builder for this logger.
         */
-       public CallLogger(RestLogger.Builder builder) {
+       public CallLogger(Builder builder) {
                this.logger = builder.logger;
                this.thrownStore = builder.thrownStore;
                this.normalRules = builder.normalRules.toArray(new 
CallLoggerRule[builder.normalRules.size()]);
@@ -116,13 +549,26 @@ public class CallLogger implements RestLogger {
                this.level = builder.level;
        }
 
+       /**
+        * Initializer.
+        * <p>
+        * Subclasses should override this method to make modifications to the 
builder used to create this logger.
+        *
+        * @param beanStore The bean store containing injectable beans for this 
logger.
+        * @return A new builder object.
+        */
+       protected Builder init(BeanStore beanStore) {
+               return new Builder(beanStore)
+                       .logger(beanStore.getBean(Logger.class).orElse(null))
+                       
.thrownStore(beanStore.getBean(ThrownStore.class).orElse(null));
+       }
+
        /**
         * Called at the end of a servlet request to log the request.
         *
         * @param req The servlet request.
         * @param res The servlet response.
         */
-       @Override /* RestLogger */
        public void log(HttpServletRequest req, HttpServletResponse res) {
 
                CallLoggerRule rule = getRule(req, res);
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java
index b4a5336d2..f4cc59e96 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/CallLoggerRule.java
@@ -24,7 +24,7 @@ import org.apache.juneau.cp.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Represents a logging rule used by {@link RestLogger}.
+ * Represents a logging rule used by {@link CallLogger}.
  *
  * <ul class='seealso'>
  *     <li class='link'>{@doc jrs.LoggingAndDebugging}
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/RestLogger.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/RestLogger.java
deleted file mode 100644
index 0d6fbaf9d..000000000
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logger/RestLogger.java
+++ /dev/null
@@ -1,490 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.rest.logger;
-
-import static java.util.logging.Level.*;
-import static org.apache.juneau.Enablement.*;
-import static org.apache.juneau.internal.CollectionUtils.*;
-import static org.apache.juneau.internal.SystemEnv.*;
-import static org.apache.juneau.rest.logger.CallLoggingDetail.*;
-
-import java.util.*;
-import java.util.function.*;
-import java.util.logging.*;
-
-import javax.servlet.http.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.cp.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.stats.*;
-
-/**
- * Interface class used for logging HTTP requests.
- *
- * <p>
- * The {@link Builder#type(Class)} method has been provided for easy extension 
of this class.
- *
- * <p>
- * The following default implementations are also provided:
- * <ul class='javatree'>
- *     <li class='jc'>{@link CallLogger} - The default logger typically used.
- *     <li class='jc'>{@link BasicDisabledCallLogger} - A no-op logger if you 
want to turn off logging entirely.
- *     <li class='jc'>{@link BasicTestCallLogger} - A logger useful for 
testcases.
- *     <li class='jc'>{@link BasicTestCaptureCallLogger} - Useful for 
capturing log messages for testing logging itself.
- * </ul>
- *
- * <ul class='seealso'>
- *     <li class='jm'>{@link 
org.apache.juneau.rest.RestContext.Builder#callLogger()}
- *     <li class='jm'>{@link 
org.apache.juneau.rest.RestContext.Builder#debugEnablement()}
- *     <li class='jm'>{@link 
org.apache.juneau.rest.RestContext.Builder#debugOn(String)}
- *     <li class='ja'>{@link Rest#debug}
- *     <li class='ja'>{@link RestOp#debug}
- *     <li class='link'>{@doc jrs.LoggingAndDebugging}
- *     <li class='extlink'>{@source}
- * </ul>
- */
-public interface RestLogger {
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Static
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       /** Represents no logger */
-       public abstract class Void implements RestLogger {}
-
-       /**
-        * System property name for the default logger name to use for {@link 
RestLogger} objects.
-        * <p>
-        * Can also use a <c>JUNEAU_RESTLOGGER_LOGGER</c> environment variable.
-        * <p>
-        * If not specified, the default is <js>"global"</js>.
-        */
-       public static final String SP_logger = "juneau.restLogger.logger";
-
-       /**
-        * System property name for the default enablement setting for {@link 
RestLogger} objects.
-        * <p>
-        * Can also use a <c>JUNEAU_RESTLOGGER_ENABLED</c> environment variable.
-        * <p>
-        * The possible values are:
-        * <ul>
-        *      <li>{@link Enablement#ALWAYS "ALWAYS"} (default) - Logging is 
enabled.
-        *      <li>{@link Enablement#NEVER "NEVER"} - Logging is disabled.
-        *      <li>{@link Enablement#CONDITIONAL "CONDITIONALLY"} - Logging is 
enabled if it passes the {@link Builder#enabledTest(Predicate)} test.
-        * </ul>
-        */
-       public static final String SP_enabled = "juneau.restLogger.enabled";
-
-       /**
-        * System property name for the default request detail setting for 
{@link RestLogger} objects.
-        * <p>
-        * Can also use a <c>JUNEAU_RESTLOGGER_REQUESTDETAIL</c> environment 
variable.
-        *
-        * <ul class='values'>
-        *      <li>{@link CallLoggingDetail#STATUS_LINE "STATUS_LINE"} 
(default) - Log only the status line.
-        *      <li>{@link CallLoggingDetail#HEADER "HEADER"} - Log the status 
line and headers.
-        *      <li>{@link CallLoggingDetail#ENTITY "ENTITY"} - Log the status 
line and headers and content if available.
-        * </ul>
-        */
-       public static final String SP_requestDetail = 
"juneau.restLogger.requestDetail";
-
-       /**
-        * System property name for the default response detail setting for 
{@link RestLogger} objects.
-        * <p>
-        * Can also use a <c>JUNEAU_RESTLOGGER_RESPONSEDETAIL</c> environment 
variable.
-        *
-        * <ul class='values'>
-        *      <li>{@link CallLoggingDetail#STATUS_LINE "STATUS_LINE"} 
(default) - Log only the status line.
-        *      <li>{@link CallLoggingDetail#HEADER "HEADER"} - Log the status 
line and headers.
-        *      <li>{@link CallLoggingDetail#ENTITY "ENTITY"} - Log the status 
line and headers and content if available.
-        * </ul>
-        */
-       public static final String SP_responseDetail = 
"juneau.restLogger.responseDetail";
-
-       /**
-        * System property name for the logging level setting for {@link 
RestLogger} objects.
-        * <p>
-        * Can also use a <c>JUNEAU_RESTLOGGER_LEVEL</c> environment variable.
-        *
-        * <ul class='values'>
-        *      <li>{@link Level#OFF "OFF"} (default)
-        *      <li>{@link Level#SEVERE "SEVERE"}
-        *      <li>{@link Level#WARNING "WARNING"}
-        *      <li>{@link Level#INFO "INFO"}
-        *      <li>{@link Level#CONFIG "CONFIG"}
-        *      <li>{@link Level#FINE "FINE"}
-        *      <li>{@link Level#FINER "FINER"}
-        *      <li>{@link Level#FINEST "FINEST"}
-        * </ul>
-        */
-       public static final String SP_level = "juneau.restLogger.level";
-
-       /**
-        * Static creator.
-        *
-        * @param beanStore The bean store to use for creating beans.
-        * @return A new builder for this object.
-        */
-       public static Builder create(BeanStore beanStore) {
-               return new Builder(beanStore);
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Builder
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       /**
-        * Builder class.
-        */
-       @FluentSetters
-       public static class Builder extends BeanBuilder<RestLogger> {
-
-               Logger logger;
-               ThrownStore thrownStore;
-               List<CallLoggerRule> normalRules = list(), debugRules = list();
-               Enablement enabled;
-               Predicate<HttpServletRequest> enabledTest;
-               CallLoggingDetail requestDetail, responseDetail;
-               Level level;
-
-               /**
-                * Constructor.
-                *
-                * @param beanStore The bean store to use for creating beans.
-                */
-               protected Builder(BeanStore beanStore) {
-                       super(CallLogger.class, beanStore);
-                       logger = Logger.getLogger(env(SP_logger, "global"));
-                       enabled = env(SP_enabled, ALWAYS);
-                       enabledTest = x -> false;
-                       requestDetail = env(SP_requestDetail, STATUS_LINE);
-                       responseDetail = env(SP_responseDetail, STATUS_LINE);
-                       level = env(SP_level).map(Level::parse).orElse(OFF);
-               }
-
-               @Override /* BeanBuilder */
-               protected RestLogger buildDefault() {
-                       return new CallLogger(this);
-               }
-
-               @Override /* BeanBuilder */
-               protected BeanCreator<? extends RestLogger> creator() {
-                       return super.creator();
-               }
-
-               
//-------------------------------------------------------------------------------------------------------------
-               // Properties
-               
//-------------------------------------------------------------------------------------------------------------
-
-               /**
-                * Specifies the logger to use for logging the request.
-                *
-                * <p>
-                * If not specified, the logger name is determined in the 
following order:
-                * <ol>
-                *      <li><js>{@link RestLogger#SP_logger 
"juneau.restLogger.logger"} system property.
-                *      <li><js>{@link RestLogger#SP_logger 
"JUNEAU_RESTLOGGER_LOGGER"} environment variable.
-                *      <li><js>"global"</js>.
-                * </ol>
-                *
-                * <p>
-                * The {@link CallLogger#getLogger()} method can also be 
overridden to provide different logic.
-                *
-                * @param value
-                *      The logger to use for logging the request.
-                * @return This object.
-                */
-               public Builder logger(Logger value) {
-                       logger = value;
-                       return this;
-               }
-
-               /**
-                * Specifies the logger to use for logging the request.
-                *
-                * <p>
-                * Shortcut for calling 
<c>logger(Logger.<jsm>getLogger</jsm>(value))</c>.
-                *
-                * <p>
-                * If not specified, the logger name is determined in the 
following order:
-                * <ol>
-                *      <li><js>{@link RestLogger#SP_logger 
"juneau.restLogger.logger"} system property.
-                *      <li><js>{@link RestLogger#SP_logger 
"JUNEAU_RESTLOGGER_LOGGER"} environment variable.
-                *      <li><js>"global"</js>.
-                * </ol>
-                *
-                * <p>
-                * The {@link CallLogger#getLogger()} method can also be 
overridden to provide different logic.
-                *
-                * @param value
-                *      The logger to use for logging the request.
-                * @return This object.
-                */
-               public Builder logger(String value) {
-                       logger = value == null ? null :Logger.getLogger(value);
-                       return this;
-               }
-
-               /**
-                * Same as {@link #logger(Logger)} but only sets the value if 
it's currently <jk>null</jk>.
-                *
-                * @param value The logger to use for logging the request.
-                * @return This object.
-                */
-               public Builder loggerOnce(Logger value) {
-                       if (logger == null)
-                               logger = value;
-                       return this;
-               }
-
-               /**
-                * Specifies the thrown exception store to use for getting 
stack trace information (hash IDs and occurrence counts).
-                *
-                * @param value
-                *      The stack trace store.
-                *      <br>If <jk>null</jk>, stack trace information will not 
be logged.
-                * @return This object.
-                */
-               public Builder thrownStore(ThrownStore value) {
-                       thrownStore = value;
-                       return this;
-               }
-
-               /**
-                * Same as {@link #thrownStore(ThrownStore)} but only sets the 
value if it's currently <jk>null</jk>.
-                *
-                * @param value
-                *      The stack trace store.
-                *      <br>If <jk>null</jk>, stack trace information will not 
be logged.
-                * @return This object.
-                */
-               public Builder thrownStoreOnce(ThrownStore value) {
-                       if (thrownStore == null)
-                               thrownStore = value;
-                       return this;
-               }
-               /**
-                * Specifies the default logging enablement setting.
-                *
-                * <p>
-                * This specifies the default logging enablement value if not 
set on the first matched rule or if no rules match.
-                *
-                * <p>
-                * If not specified, the setting is determined via the 
following:
-                * <ul>
-                *      <li><js>{@link RestLogger#SP_enabled 
"juneau.restLogger.enabled"} system property.
-                *      <li><js>{@link RestLogger#SP_enabled 
"JUNEAU_RESTLOGGER_ENABLED"} environment variable.
-                *      <li><js>"ALWAYS"</js>.
-                * </ul>
-                *
-                * <ul class='values'>
-                *      <li>{@link Enablement#ALWAYS ALWAYS} (default) - 
Logging is enabled.
-                *      <li>{@link Enablement#NEVER NEVER} - Logging is 
disabled.
-                *      <li>{@link Enablement#CONDITIONAL CONDITIONALLY} - 
Logging is enabled if it passes the {@link #enabledTest(Predicate)} test.
-                * </ul>
-                *
-                * <p>
-                * @param value
-                *      The default enablement flag value.  Can be 
<jk>null</jk> to use the default.
-                * @return This object.
-                */
-               public Builder enabled(Enablement value) {
-                       enabled = value;
-                       return this;
-               }
-
-               /**
-                * Specifies the default logging enablement test predicate.
-                *
-                * <p>
-                * This specifies the default logging enablement test if not 
set on the first matched rule or if no rules match.
-                *
-                * <p>
-                * This setting has no effect if the enablement setting is not 
{@link Enablement#CONDITIONAL CONDITIONALLY}.
-                *
-                * <p>
-                * The default if not specified is <c><jv>x</jv> -&gt; 
<jk>false</jk></c> (never log).
-                *
-                * @param value
-                *      The default enablement flag value.  Can be 
<jk>null</jk> to use the default.
-                * @return This object.
-                */
-               public Builder enabledTest(Predicate<HttpServletRequest> value) 
{
-                       enabledTest = value;
-                       return this;
-               }
-
-               /**
-                * Shortcut for calling <c>enabled(<jsf>NEVER</jsf>)</c>.
-                *
-                * @return This object.
-                */
-               public Builder disabled() {
-                       return enabled(NEVER);
-               }
-
-               /**
-                * The default level of detail to log on a request.
-                *
-                * <p>
-                * This specifies the default level of request detail if not 
set on the first matched rule or if no rules match.
-                *
-                * <p>
-                * If not specified, the setting is determined via the 
following:
-                * <ul>
-                *      <li><js>{@link RestLogger#SP_requestDetail 
"juneau.restLogger.requestDetail"} system property.
-                *      <li><js>{@link RestLogger#SP_requestDetail 
"JUNEAU_RESTLOGGER_requestDetail"} environment variable.
-                *      <li><js>"STATUS_LINE"</js>.
-                * </ul>
-                *
-                * <ul class='values'>
-                *      <li>{@link CallLoggingDetail#STATUS_LINE STATUS_LINE} - 
Log only the status line.
-                *      <li>{@link CallLoggingDetail#HEADER HEADER} - Log the 
status line and headers.
-                *      <li>{@link CallLoggingDetail#ENTITY ENTITY} - Log the 
status line and headers and content if available.
-                * </ul>
-                *
-                * @param value
-                *      The new value for this property, or <jk>null</jk> to 
use the default.
-                * @return This object.
-                */
-               public Builder requestDetail(CallLoggingDetail value) {
-                       requestDetail = value;
-                       return this;
-               }
-
-               /**
-                * The default level of detail to log on a response.
-                *
-                * <p>
-                * This specifies the default level of response detail if not 
set on the first matched rule or if no rules match.
-                *
-                * <p>
-                * If not specified, the setting is determined via the 
following:
-                * <ul>
-                *      <li><js>{@link RestLogger#SP_responseDetail 
"juneau.restLogger.responseDetail"} system property.
-                *      <li><js>{@link RestLogger#SP_responseDetail 
"JUNEAU_RESTLOGGER_responseDetail"} environment variable.
-                *      <li><js>"STATUS_LINE"</js>.
-                * </ul>
-                *
-                * <ul class='values'>
-                *      <li>{@link CallLoggingDetail#STATUS_LINE STATUS_LINE} - 
Log only the status line.
-                *      <li>{@link CallLoggingDetail#HEADER HEADER} - Log the 
status line and headers.
-                *      <li>{@link CallLoggingDetail#ENTITY ENTITY} - Log the 
status line and headers and content if available.
-                * </ul>
-                *
-                * @param value
-                *      The new value for this property, or <jk>null</jk> to 
use the default.
-                * @return This object.
-                */
-               public Builder responseDetail(CallLoggingDetail value) {
-                       responseDetail = value;
-                       return this;
-               }
-
-               /**
-                * The default logging level to use for logging the 
request/response.
-                *
-                * <p>
-                * This specifies the default logging level if not set on the 
first matched rule or if no rules match.
-                *
-                * <p>
-                * If not specified, the setting is determined via the 
following:
-                * <ul>
-                *      <li><js>{@link RestLogger#SP_level 
"juneau.restLogger.level"} system property.
-                *      <li><js>{@link RestLogger#SP_level 
"JUNEAU_RESTLOGGER_level"} environment variable.
-                *      <li><js>"OFF"</js>.
-                * </ul>
-                *
-                * @param value
-                *      The new value for this property, or <jk>null</jk> to 
use the default value.
-                * @return This object.
-                */
-               public Builder level(Level value) {
-                       level = value;
-                       return this;
-               }
-
-               /**
-                * Adds logging rules to use when debug mode is not enabled.
-                *
-                * <p>
-                * Logging rules are matched in the order they are added.  The 
first to match wins.
-                *
-                * @param values The logging rules to add to the list of rules.
-                * @return This object.
-                */
-               public Builder normalRules(CallLoggerRule...values) {
-                       for (CallLoggerRule rule : values)
-                               normalRules.add(rule);
-                       return this;
-               }
-
-               /**
-                * Adds logging rules to use when debug mode is enabled.
-                *
-                * <p>
-                * Logging rules are matched in the order they are added.  The 
first to match wins.
-                *
-                * @param values The logging rules to add to the list of rules.
-                * @return This object.
-                */
-               public Builder debugRules(CallLoggerRule...values) {
-                       for (CallLoggerRule rule : values)
-                               debugRules.add(rule);
-                       return this;
-               }
-
-               /**
-                * Shortcut for adding the same rules as normal and debug rules.
-                *
-                * <p>
-                * Logging rules are matched in the order they are added.  The 
first to match wins.
-                *
-                * @param values The logging rules to add to the list of rules.
-                * @return This object.
-                */
-               public Builder rules(CallLoggerRule...values) {
-                       return normalRules(values).debugRules(values);
-               }
-
-               // <FluentSetters>
-
-               @Override /* GENERATED - org.apache.juneau.BeanBuilder */
-               public Builder impl(Object value) {
-                       super.impl(value);
-                       return this;
-               }
-
-               @Override /* GENERATED - org.apache.juneau.BeanBuilder */
-               public Builder type(Class<?> value) {
-                       super.type(value);
-                       return this;
-               }
-
-               // </FluentSetters>
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Instance
-       
//-----------------------------------------------------------------------------------------------------------------
-
-       /**
-        * Called at the end of a servlet request to log the request.
-        *
-        * @param req The servlet request.
-        * @param res The servlet response.
-        */
-       public void log(HttpServletRequest req, HttpServletResponse res);
-}
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
index 4076ff63c..7acc2b1e0 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
@@ -49,7 +49,7 @@ public class RestAnnotation_Test {
                .allowedMethodHeaders("allowedMethodHeaders")
                .allowedMethodParams("allowedMethodParams")
                .beanStore(BeanStore.class)
-               .callLogger(RestLogger.class)
+               .callLogger(CallLogger.class)
                .children(RestAnnotation_Test.class)
                .clientVersionHeader("clientVersionHeader")
                .config("config")
@@ -104,7 +104,7 @@ public class RestAnnotation_Test {
                .allowedMethodHeaders("allowedMethodHeaders")
                .allowedMethodParams("allowedMethodParams")
                .beanStore(BeanStore.class)
-               .callLogger(RestLogger.class)
+               .callLogger(CallLogger.class)
                .children(RestAnnotation_Test.class)
                .clientVersionHeader("clientVersionHeader")
                .config("config")
@@ -162,7 +162,7 @@ public class RestAnnotation_Test {
                                + "allowedMethodParams:'allowedMethodParams',"
                                + "beanStore:'org.apache.juneau.cp.BeanStore',"
                                + 
"builder:'org.apache.juneau.rest.RestContext$Builder$Void',"
-                               + 
"callLogger:'org.apache.juneau.rest.logger.RestLogger',"
+                               + 
"callLogger:'org.apache.juneau.rest.logger.CallLogger',"
                                + "children:['"+CNAME+"'],"
                                + "clientVersionHeader:'clientVersionHeader',"
                                + "config:'config',"
@@ -263,7 +263,7 @@ public class RestAnnotation_Test {
                allowedMethodHeaders="allowedMethodHeaders",
                allowedMethodParams="allowedMethodParams",
                beanStore=BeanStore.class,
-               callLogger=RestLogger.class,
+               callLogger=CallLogger.class,
                children=RestAnnotation_Test.class,
                clientVersionHeader="clientVersionHeader",
                config="config",
@@ -320,7 +320,7 @@ public class RestAnnotation_Test {
                allowedMethodHeaders="allowedMethodHeaders",
                allowedMethodParams="allowedMethodParams",
                beanStore=BeanStore.class,
-               callLogger=RestLogger.class,
+               callLogger=CallLogger.class,
                children=RestAnnotation_Test.class,
                clientVersionHeader="clientVersionHeader",
                config="config",
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Debug_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Debug_Test.java
index 264d0d7c7..e408575c4 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Debug_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Debug_Test.java
@@ -28,7 +28,7 @@ public class Rest_Debug_Test {
        public static final CaptureLogger LOGGER = new CaptureLogger();
 
        public static class CaptureLogger extends BasicTestCaptureCallLogger {
-               public static CaptureLogger getInstance(RestLogger.Builder x) {
+               public static CaptureLogger getInstance() {
                        return LOGGER;
                }
        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
index 46c87a684..d8785ddd5 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
@@ -41,7 +41,7 @@ public class RestClient_Headers_Test {
        public static final CaptureLogger LOGGER = new CaptureLogger();
 
        public static class CaptureLogger extends BasicTestCaptureCallLogger {
-               public static CaptureLogger getInstance(RestLogger.Builder x) {
+               public static CaptureLogger getInstance() {
                        return LOGGER;
                }
        }

Reply via email to