Introduce LogAccessor and LogMessage as convenient logging utilities

Closes gh-22726
This commit is contained in:
Juergen Hoeller 2019-04-02 19:13:05 +02:00
parent 208a1ae0ea
commit 3ac88bed23
3 changed files with 385 additions and 0 deletions

View File

@ -0,0 +1,280 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed 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
*
* https://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.springframework.core.log;
import java.util.function.Supplier;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* A convenient accessor for Commons Logging, providing not only
* {@code CharSequence} based log methods but also {@code Supplier}
* based variants for use with Java 8 lambda expressions.
*
* @author Juergen Hoeller
* @since 5.2
*/
public class LogAccessor {
private final Log log;
/**
* Create a new accessor for the given Commons Log.
* @see LogFactory#getLog(Class)
* @see LogFactory#getLog(String)
*/
public LogAccessor(Log log) {
this.log = log;
}
/**
* Create a new accessor for the specified Commons Log category.
* @see LogFactory#getLog(Class)
*/
public LogAccessor(Class<?> logCategory) {
this.log = LogFactory.getLog(logCategory);
}
/**
* Create a new accessor for the specified Commons Log category.
* @see LogFactory#getLog(String)
*/
public LogAccessor(String logCategory) {
this.log = LogFactory.getLog(logCategory);
}
/**
* Return the target Commons Log.
*/
public final Log getLog() {
return this.log;
}
// Plain log methods
/**
* Log a message with fatal log level.
* @param message the message to log
*/
public void fatal(CharSequence message) {
this.log.fatal(message);
}
/**
* Log an error with fatal log level.
* @param message the message to log
* @param t log this cause
*/
public void fatal(CharSequence message, Throwable t) {
this.log.fatal(message, t);
}
/**
* Log a message with error log level.
* @param message the message to log
*/
public void error(CharSequence message) {
this.log.error(message);
}
/**
* Log an error with error log level.
* @param message the message to log
* @param t log this cause
*/
public void error(CharSequence message, Throwable t) {
this.log.error(message, t);
}
/**
* Log a message with warn log level.
* @param message the message to log
*/
public void warn(CharSequence message) {
this.log.warn(message);
}
/**
* Log an error with warn log level.
* @param message the message to log
* @param t log this cause
*/
public void warn(CharSequence message, Throwable t) {
this.log.warn(message, t);
}
/**
* Log a message with info log level.
* @param message the message to log
*/
public void info(CharSequence message) {
this.log.info(message);
}
/**
* Log an error with info log level.
* @param message the message to log
* @param t log this cause
*/
public void info(CharSequence message, Throwable t) {
this.log.info(message, t);
}
/**
* Log a message with debug log level.
* @param message the message to log
*/
public void debug(CharSequence message) {
this.log.debug(message);
}
/**
* Log an error with debug log level.
* @param message the message to log
* @param t log this cause
*/
public void debug(CharSequence message, Throwable t) {
this.log.debug(message, t);
}
/**
* Log a message with trace log level.
* @param message the message to log
*/
public void trace(CharSequence message) {
this.log.trace(message);
}
/**
* Log an error with trace log level.
* @param message the message to log
* @param t log this cause
*/
public void trace(CharSequence message, Throwable t) {
this.log.trace(message, t);
}
// Supplier-based log methods
/**
* Log a message with fatal log level.
* @param messageSupplier a lazy supplier for the message to log
*/
public void fatal(Supplier<? extends CharSequence> messageSupplier) {
this.log.fatal(new LogMessage(messageSupplier));
}
/**
* Log an error with fatal log level.
* @param messageSupplier a lazy supplier for the message to log
* @param t log this cause
*/
public void fatal(Supplier<? extends CharSequence> messageSupplier, Throwable t) {
this.log.fatal(new LogMessage(messageSupplier), t);
}
/**
* Log a message with error log level.
* @param messageSupplier a lazy supplier for the message to log
*/
public void error(Supplier<? extends CharSequence> messageSupplier) {
this.log.error(new LogMessage(messageSupplier));
}
/**
* Log an error with error log level.
* @param messageSupplier a lazy supplier for the message to log
* @param t log this cause
*/
public void error(Supplier<? extends CharSequence> messageSupplier, Throwable t) {
this.log.error(new LogMessage(messageSupplier), t);
}
/**
* Log a message with warn log level.
* @param messageSupplier a lazy supplier for the message to log
*/
public void warn(Supplier<? extends CharSequence> messageSupplier) {
this.log.warn(new LogMessage(messageSupplier));
}
/**
* Log an error with warn log level.
* @param messageSupplier a lazy supplier for the message to log
* @param t log this cause
*/
public void warn(Supplier<? extends CharSequence> messageSupplier, Throwable t) {
this.log.warn(new LogMessage(messageSupplier), t);
}
/**
* Log a message with info log level.
* @param messageSupplier a lazy supplier for the message to log
*/
public void info(Supplier<? extends CharSequence> messageSupplier) {
this.log.info(new LogMessage(messageSupplier));
}
/**
* Log an error with info log level.
* @param messageSupplier a lazy supplier for the message to log
* @param t log this cause
*/
public void info(Supplier<? extends CharSequence> messageSupplier, Throwable t) {
this.log.info(new LogMessage(messageSupplier), t);
}
/**
* Log a message with debug log level.
* @param messageSupplier a lazy supplier for the message to log
*/
public void debug(Supplier<? extends CharSequence> messageSupplier) {
this.log.debug(new LogMessage(messageSupplier));
}
/**
* Log an error with debug log level.
* @param messageSupplier a lazy supplier for the message to log
* @param t log this cause
*/
public void debug(Supplier<? extends CharSequence> messageSupplier, Throwable t) {
this.log.debug(new LogMessage(messageSupplier), t);
}
/**
* Log a message with trace log level.
* @param messageSupplier a lazy supplier for the message to log
*/
public void trace(Supplier<? extends CharSequence> messageSupplier) {
this.log.trace(new LogMessage(messageSupplier));
}
/**
* Log an error with trace log level.
* @param messageSupplier a lazy supplier for the message to log
* @param t log this cause
*/
public void trace(Supplier<? extends CharSequence> messageSupplier, Throwable t) {
this.log.trace(new LogMessage(messageSupplier), t);
}
}

View File

@ -0,0 +1,69 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed 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
*
* https://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.springframework.core.log;
import java.util.function.Supplier;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
* A simple log message type for use with Commons Logging, allowing
* for convenient late resolution of a given {@link Supplier} instance
* (typically bound to a Java 8 lambda expression) in {@link #toString()}.
*
* @author Juergen Hoeller
* @since 5.2
* @see org.apache.commons.logging.Log#fatal(Object)
* @see org.apache.commons.logging.Log#error(Object)
* @see org.apache.commons.logging.Log#warn(Object)
* @see org.apache.commons.logging.Log#info(Object)
* @see org.apache.commons.logging.Log#debug(Object)
* @see org.apache.commons.logging.Log#trace(Object)
*/
public class LogMessage {
private final Supplier<? extends CharSequence> supplier;
@Nullable
private String result;
/**
* Construct a new {@code LogMessage} for the given supplier.
* @param supplier the lazily resolving supplier
* (typically bound to a Java 8 lambda expression)
*/
public LogMessage(Supplier<? extends CharSequence> supplier) {
Assert.notNull(supplier, "Supplier must not be null");
this.supplier = supplier;
}
/**
* This will be called by the logging provider, potentially once
* per log target (therefore locally caching the result here).
*/
@Override
public String toString() {
if (this.result == null) {
this.result = this.supplier.get().toString();
}
return this.result;
}
}

View File

@ -0,0 +1,36 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed 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
*
* https://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.springframework.core.log;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @author Juergen Hoeller
* @since 5.2
*/
public class LogSupportTests {
@Test
public void testLogMessage() {
LogMessage msg = new LogMessage(() -> new StringBuilder("a"));
assertEquals("a", msg.toString());
assertSame(msg.toString(), msg.toString());
}
}