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