Repository: logging-log4j2 Updated Branches: refs/heads/master 299d46aa0 -> 6def026b7
LOG4J2-1255 extract FlowMessageFactory; LOG4J2-1284 Made default MessageFactory configurable. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6def026b Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6def026b Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6def026b Branch: refs/heads/master Commit: 6def026b7763cda74bb1a22a58c351a2f24ce1e9 Parents: 299d46a Author: rpopma <rpo...@apache.org> Authored: Sat Feb 20 02:14:02 2016 +0900 Committer: rpopma <rpo...@apache.org> Committed: Sat Feb 20 02:14:02 2016 +0900 ---------------------------------------------------------------------- .../log4j/message/AbstractMessageFactory.java | 190 +---------------- .../message/DefaultFlowMessageFactory.java | 202 +++++++++++++++++++ .../log4j/message/FlowMessageFactory.java | 57 ++++++ .../log4j/message/FormattedMessageFactory.java | 10 - .../log4j/message/LocalizedMessageFactory.java | 31 +-- .../logging/log4j/message/MessageFactory.java | 38 ---- .../message/MessageFormatMessageFactory.java | 13 +- .../message/ParameterizedMessageFactory.java | 17 +- .../ParameterizedNoReferenceMessageFactory.java | 15 +- .../log4j/message/SimpleMessageFactory.java | 3 +- .../message/StringFormatterMessageFactory.java | 23 +-- .../logging/log4j/spi/AbstractLogger.java | 72 +++++-- .../org/apache/logging/log4j/LoggerTest.java | 13 -- src/changes/changes.xml | 3 + src/site/xdoc/manual/configuration.xml.vm | 10 + 15 files changed, 350 insertions(+), 347 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessageFactory.java index 5e2c357..d54a225 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessageFactory.java @@ -25,193 +25,13 @@ import java.io.Serializable; * </p> */ public abstract class AbstractMessageFactory implements MessageFactory, Serializable { - - /** - * Constructs a message factory with {@code "entry"} and {@code "exit"} as the default flow strings. - */ - public AbstractMessageFactory() { - this("entry", "exit"); - } - - /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 - */ - public AbstractMessageFactory(final String entryText, final String exitText) { - super(); - this.entryText = entryText; - this.exitText = exitText; - } - - private final String entryText; - private final String exitText; - - private static class AbstractFlowMessage implements FlowMessage { - - private static final long serialVersionUID = 1L; - private final Message message; - private final String text; - - AbstractFlowMessage(final String text, final Message message) { - this.message = message; - this.text = text; - } - - @Override - public String getFormattedMessage() { - if (message != null) { - return text + " " + message.getFormattedMessage(); - } - return text; - } - - @Override - public String getFormat() { - if (message != null) { - return text + ": " + message.getFormat(); - } - return text; - } - - @Override - public Object[] getParameters() { - if (message != null) { - return message.getParameters(); - } - return null; - } - - @Override - public Throwable getThrowable() { - if (message != null) { - return message.getThrowable(); - } - return null; - } - - @Override - public Message getMessage() { - return message; - } - - @Override - public String getText() { - return text; - } - } - - private static final class SimpleEntryMessage extends AbstractFlowMessage implements EntryMessage { - - private static final long serialVersionUID = 1L; - - SimpleEntryMessage(final String entryText, final Message message) { - super(entryText, message); - } - - } - - private static final class SimpleExitMessage extends AbstractFlowMessage implements ExitMessage { - - private static final long serialVersionUID = 1L; - - private final Object result; - private final boolean isVoid; - - SimpleExitMessage(final String exitText, final EntryMessage message) { - super(exitText, message.getMessage()); - this.result = null; - isVoid = true; - } - - SimpleExitMessage(final String exitText, final Object result, final EntryMessage message) { - super(exitText, message.getMessage()); - this.result = result; - isVoid = false; - } - - SimpleExitMessage(final String exitText, final Object result, final Message message) { - super(exitText, message); - this.result = result; - isVoid = false; - } - - @Override - public String getFormattedMessage() { - final String formattedMessage = super.getFormattedMessage(); - if (isVoid) { - return formattedMessage; - } - return formattedMessage + ": " + result; - } - } - - private static final long serialVersionUID = 1L; - - /** - * Gets the entry text. - * @return the entry text. - * @since 2.6 - */ - public String getEntryText() { - return entryText; - } - - /** - * Gets the exit text. - * @return the exit text. - * @since 2.6 - */ - public String getExitText() { - return exitText; - } - - /* - * (non-Javadoc) - * - * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(org.apache.logging.log4j.message.Message) - */ - @Override - public EntryMessage newEntryMessage(final Message message) { - return new SimpleEntryMessage(entryText, message); - } - - /* - * (non-Javadoc) - * - * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(org.apache.logging.log4j.message.EntryMessage) - */ - @Override - public ExitMessage newExitMessage(final EntryMessage message) { - return new SimpleExitMessage(exitText, message); - } + private static final long serialVersionUID = -1307891137684031187L; /* - * (non-Javadoc) - * - * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(java.lang.Object, org.apache.logging.log4j.message.EntryMessage) - */ - @Override - public ExitMessage newExitMessage(final Object object, final EntryMessage message) { - return new SimpleExitMessage(exitText, object, message); - } - - /* - * (non-Javadoc) - * - * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(java.lang.Object, org.apache.logging.log4j.message.Message) - */ - @Override - public ExitMessage newExitMessage(final Object object, final Message message) { - return new SimpleExitMessage(exitText, object, message); - } - - /* - * (non-Javadoc) - * - * @see org.apache.logging.log4j.message.MessageFactory#newMessage(java.lang.Object) - */ + * (non-Javadoc) + * + * @see org.apache.logging.log4j.message.MessageFactory#newMessage(java.lang.Object) + */ @Override public Message newMessage(final Object message) { return new ObjectMessage(message); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/DefaultFlowMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/DefaultFlowMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/DefaultFlowMessageFactory.java new file mode 100644 index 0000000..86b7491 --- /dev/null +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/DefaultFlowMessageFactory.java @@ -0,0 +1,202 @@ +/* + * 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.logging.log4j.message; + +import java.io.Serializable; + +/** + * Default factory for flow messages. + * @since 2.6 + */ +public class DefaultFlowMessageFactory implements FlowMessageFactory, Serializable { + private static final long serialVersionUID = 8578655591131397576L; + private final String entryText; + private final String exitText; + + /** + * Constructs a message factory with {@code "entry"} and {@code "exit"} as the default flow strings. + */ + public DefaultFlowMessageFactory() { + this("entry", "exit"); + } + + /** + * Constructs a message factory with the given entry and exit strings. + * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. + * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. + */ + public DefaultFlowMessageFactory(final String entryText, final String exitText) { + super(); + this.entryText = entryText; + this.exitText = exitText; + } + + private static class AbstractFlowMessage implements FlowMessage { + + private static final long serialVersionUID = 1L; + private final Message message; + private final String text; + + AbstractFlowMessage(final String text, final Message message) { + this.message = message; + this.text = text; + } + + @Override + public String getFormattedMessage() { + if (message != null) { + return text + " " + message.getFormattedMessage(); + } + return text; + } + + @Override + public String getFormat() { + if (message != null) { + return text + ": " + message.getFormat(); + } + return text; + } + + @Override + public Object[] getParameters() { + if (message != null) { + return message.getParameters(); + } + return null; + } + + @Override + public Throwable getThrowable() { + if (message != null) { + return message.getThrowable(); + } + return null; + } + + @Override + public Message getMessage() { + return message; + } + + @Override + public String getText() { + return text; + } + } + + private static final class SimpleEntryMessage extends AbstractFlowMessage implements EntryMessage { + + private static final long serialVersionUID = 1L; + + SimpleEntryMessage(final String entryText, final Message message) { + super(entryText, message); + } + + } + + private static final class SimpleExitMessage extends AbstractFlowMessage implements ExitMessage { + + private static final long serialVersionUID = 1L; + + private final Object result; + private final boolean isVoid; + + SimpleExitMessage(final String exitText, final EntryMessage message) { + super(exitText, message.getMessage()); + this.result = null; + isVoid = true; + } + + SimpleExitMessage(final String exitText, final Object result, final EntryMessage message) { + super(exitText, message.getMessage()); + this.result = result; + isVoid = false; + } + + SimpleExitMessage(final String exitText, final Object result, final Message message) { + super(exitText, message); + this.result = result; + isVoid = false; + } + + @Override + public String getFormattedMessage() { + final String formattedMessage = super.getFormattedMessage(); + if (isVoid) { + return formattedMessage; + } + return formattedMessage + ": " + result; + } + } + + /** + * Gets the entry text. + * @return the entry text. + */ + public String getEntryText() { + return entryText; + } + + /** + * Gets the exit text. + * @return the exit text. + */ + public String getExitText() { + return exitText; + } + + /* + * (non-Javadoc) + * + * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(org.apache.logging.log4j.message.Message) + */ + @Override + public EntryMessage newEntryMessage(final Message message) { + return new SimpleEntryMessage(entryText, message); + } + + /* + * (non-Javadoc) + * + * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(org.apache.logging.log4j.message.EntryMessage) + */ + @Override + public ExitMessage newExitMessage(final EntryMessage message) { + return new SimpleExitMessage(exitText, message); + } + + /* + * (non-Javadoc) + * + * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(java.lang.Object, org.apache.logging.log4j.message.EntryMessage) + */ + @Override + public ExitMessage newExitMessage(final Object object, final EntryMessage message) { + return new SimpleExitMessage(exitText, object, message); + } + + /* + * (non-Javadoc) + * + * @see org.apache.logging.log4j.message.MessageFactory#newEntryMessage(java.lang.Object, org.apache.logging.log4j.message.Message) + */ + @Override + public ExitMessage newExitMessage(final Object object, final Message message) { + return new SimpleExitMessage(exitText, object, message); + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/FlowMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/FlowMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/FlowMessageFactory.java new file mode 100644 index 0000000..b623098 --- /dev/null +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/FlowMessageFactory.java @@ -0,0 +1,57 @@ +/* + * 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.logging.log4j.message; + +/** + * Creates flow messages. Implementations can provide different message format syntaxes. + * @since 2.6 + */ +public interface FlowMessageFactory { + /** + * Creates a new entry message based on an existing message. + * + * @param message the original message + * @return the new entry message + */ + EntryMessage newEntryMessage(Message message); + + /** + * Creates a new exit message based on a return value and an existing message. + * + * @param object the return value. + * @param message the original message + * @return the new exit message + */ + ExitMessage newExitMessage(Object object, Message message); + + /** + * Creates a new exit message based on no return value and an existing entry message. + * + * @param message the original entry message + * @return the new exit message + */ + ExitMessage newExitMessage(EntryMessage message); + + /** + * Creates a new exit message based on a return value and an existing entry message. + * + * @param object the return value. + * @param message the original entry message + * @return the new exit message + */ + ExitMessage newExitMessage(Object object, EntryMessage message); +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessageFactory.java index 48f75d2..2e36269 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessageFactory.java @@ -29,16 +29,6 @@ public class FormattedMessageFactory extends AbstractMessageFactory { super(); } - /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 - */ - public FormattedMessageFactory(final String entryText, final String exitText) { - super(entryText, exitText); - } - private static final long serialVersionUID = 1L; /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessageFactory.java index 47fa516..55871ab 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessageFactory.java @@ -23,8 +23,7 @@ import java.util.ResourceBundle; * {@link #newMessage(String, Object...)}. */ public class LocalizedMessageFactory extends AbstractMessageFactory { - - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -1996295808703146741L; // FIXME: cannot use ResourceBundle name for serialization until Java 8 private transient final ResourceBundle resourceBundle; @@ -35,38 +34,14 @@ public class LocalizedMessageFactory extends AbstractMessageFactory { this.baseName = null; } - /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 - */ - public LocalizedMessageFactory(final ResourceBundle resourceBundle, final String entryText, final String exitText) { - super(entryText, exitText); - this.resourceBundle = resourceBundle; - this.baseName = null; - } - public LocalizedMessageFactory(final String baseName) { this.resourceBundle = null; this.baseName = baseName; } /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 - */ - public LocalizedMessageFactory(final String baseName, final String entryText, final String exitText) { - super(entryText, exitText); - this.resourceBundle = null; - this.baseName = baseName; - } - - /** * Gets the resource bundle base name if set. - * + * * @return the resource bundle base name if set. May be null. */ public String getBaseName() { @@ -75,7 +50,7 @@ public class LocalizedMessageFactory extends AbstractMessageFactory { /** * Gets the resource bundle if set. - * + * * @return the resource bundle if set. May be null. */ public ResourceBundle getResourceBundle() { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java index 3382deb..009d5a6 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java @@ -54,42 +54,4 @@ public interface MessageFactory { * @see StringFormatterMessageFactory */ Message newMessage(String message, Object... params); - - /** - * Creates a new entry message based on an existing message. - * - * @param message the original message - * @return the new entry message - * @since 2.6 - */ - EntryMessage newEntryMessage(Message message); - - /** - * Creates a new exit message based on a return value and an existing message. - * - * @param object the return value. - * @param message the original message - * @return the new exit message - * @since 2.6 - */ - ExitMessage newExitMessage(Object object, Message message); - - /** - * Creates a new exit message based on no return value and an existing entry message. - * - * @param message the original entry message - * @return the new exit message - * @since 2.6 - */ - ExitMessage newExitMessage(EntryMessage message); - - /** - * Creates a new exit message based on a return value and an existing entry message. - * - * @param object the return value. - * @param message the original entry message - * @return the new exit message - * @since 2.6 - */ - ExitMessage newExitMessage(Object object, EntryMessage message); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessageFactory.java index bf13113..a13543a 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessageFactory.java @@ -21,6 +21,7 @@ package org.apache.logging.log4j.message; * {@link #newMessage(String, Object...)}. */ public class MessageFormatMessageFactory extends AbstractMessageFactory { + private static final long serialVersionUID = 3584821740584192453L; /** * Constructs a message factory with default flow strings. @@ -30,18 +31,6 @@ public class MessageFormatMessageFactory extends AbstractMessageFactory { } /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 - */ - public MessageFormatMessageFactory(final String entryText, final String exitText) { - super(entryText, exitText); - } - - private static final long serialVersionUID = 1L; - - /** * Creates {@link org.apache.logging.log4j.message.StringFormattedMessage} instances. * @param message The message pattern. * @param params Parameters to the message. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessageFactory.java index 186554d..216e4ea 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessageFactory.java @@ -26,34 +26,23 @@ package org.apache.logging.log4j.message; * </p> */ public final class ParameterizedMessageFactory extends AbstractMessageFactory { + private static final long serialVersionUID = -8970940216592525651L; /** - * Constructs a message factory with default flow strings. + * Constructs a message factory. */ public ParameterizedMessageFactory() { super(); } /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 - */ - public ParameterizedMessageFactory(final String entryText, final String exitText) { - super(entryText, exitText); - } - - /** * Instance of StringFormatterMessageFactory. */ public static final ParameterizedMessageFactory INSTANCE = new ParameterizedMessageFactory(); - private static final long serialVersionUID = 1L; - /** * Creates {@link ParameterizedMessage} instances. - * + * * @param message The message pattern. * @param params The message parameters. * @return The Message. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedNoReferenceMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedNoReferenceMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedNoReferenceMessageFactory.java index 9d03ef8..80349ed 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedNoReferenceMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedNoReferenceMessageFactory.java @@ -30,6 +30,7 @@ import org.apache.logging.log4j.status.StatusLogger; * </p> */ public final class ParameterizedNoReferenceMessageFactory extends AbstractMessageFactory { + private static final long serialVersionUID = 5027639245636870500L; /** * Constructs a message factory with default flow strings. @@ -39,25 +40,13 @@ public final class ParameterizedNoReferenceMessageFactory extends AbstractMessag } /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 - */ - public ParameterizedNoReferenceMessageFactory(final String entryText, final String exitText) { - super(entryText, exitText); - } - - /** * Instance of ParameterizedStatusMessageFactory. */ public static final ParameterizedNoReferenceMessageFactory INSTANCE = new ParameterizedNoReferenceMessageFactory(); - private static final long serialVersionUID = 1L; - /** * Creates {@link SimpleMessage} instances containing the formatted parameterized message string. - * + * * @param message The message pattern. * @param params The message parameters. * @return The Message. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessageFactory.java index d32b2c4..9020538 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessageFactory.java @@ -33,8 +33,7 @@ public final class SimpleMessageFactory extends AbstractMessageFactory { * Instance of StringFormatterMessageFactory. */ public static final SimpleMessageFactory INSTANCE = new SimpleMessageFactory(); - - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 4418995198790088516L; /** * Creates {@link StringFormattedMessage} instances. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormatterMessageFactory.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormatterMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormatterMessageFactory.java index cb9b6ed..b4d6bf2 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormatterMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormatterMessageFactory.java @@ -28,30 +28,19 @@ package org.apache.logging.log4j.message; public final class StringFormatterMessageFactory extends AbstractMessageFactory { /** - * Constructs a message factory with default flow strings. + * Instance of StringFormatterMessageFactory. */ - public StringFormatterMessageFactory() { - super(); - } + public static final StringFormatterMessageFactory INSTANCE = new StringFormatterMessageFactory(); + private static final long serialVersionUID = -1626332412176965642L; /** - * Constructs a message factory with the given entry and exit strings. - * @param entryText the text to use for trace entry, like {@code "entry"} or {@code "Enter"}. - * @param exitText the text to use for trace exit, like {@code "exit"} or {@code "Exit"}. - * @since 2.6 + * Constructs a message factory with default flow strings. */ - public StringFormatterMessageFactory(final String entryText, final String exitText) { - super(entryText, exitText); + public StringFormatterMessageFactory() { + super(); } /** - * Instance of StringFormatterMessageFactory. - */ - public static final StringFormatterMessageFactory INSTANCE = new StringFormatterMessageFactory(); - - private static final long serialVersionUID = 1L; - - /** * Creates {@link StringFormattedMessage} instances. * * @param message The message pattern. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java index 3d3f57d..4fac04d 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java @@ -16,12 +16,12 @@ */ package org.apache.logging.log4j.spi; -import java.io.Serializable; - import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; +import org.apache.logging.log4j.message.DefaultFlowMessageFactory; import org.apache.logging.log4j.message.EntryMessage; +import org.apache.logging.log4j.message.FlowMessageFactory; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.MessageFactory; import org.apache.logging.log4j.message.ParameterizedMessageFactory; @@ -29,9 +29,12 @@ import org.apache.logging.log4j.message.StringFormattedMessage; import org.apache.logging.log4j.status.StatusLogger; import org.apache.logging.log4j.util.LambdaUtil; import org.apache.logging.log4j.util.MessageSupplier; +import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Supplier; +import java.io.Serializable; + /** * Base implementation of a Logger. It is highly recommended that any Logger implementation extend this class. */ @@ -71,7 +74,13 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { * The default MessageFactory class. */ public static final Class<? extends MessageFactory> DEFAULT_MESSAGE_FACTORY_CLASS = - ParameterizedMessageFactory.class; + createClassForProperty("log4j2.messageFactory", ParameterizedMessageFactory.class); + + /** + * The default FlowMessageFactory class. + */ + public static final Class<? extends FlowMessageFactory> DEFAULT_FLOW_MESSAGE_FACTORY_CLASS = + createFlowClassForProperty("log4j2.flowMessageFactory", DefaultFlowMessageFactory.class); private static final long serialVersionUID = 2L; @@ -81,6 +90,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { private final String name; private final MessageFactory messageFactory; + private final FlowMessageFactory flowMessageFactory; /** * Creates a new logger named after this class (or subclass). @@ -88,6 +98,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { public AbstractLogger() { this.name = getClass().getName(); this.messageFactory = createDefaultMessageFactory(); + this.flowMessageFactory = createDefaultFlowMessageFactory(); } /** @@ -96,8 +107,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { * @param name the logger name */ public AbstractLogger(final String name) { - this.name = name; - this.messageFactory = createDefaultMessageFactory(); + this(name, createDefaultMessageFactory()); } /** @@ -109,6 +119,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { public AbstractLogger(final String name, final MessageFactory messageFactory) { this.name = name; this.messageFactory = messageFactory == null ? createDefaultMessageFactory() : messageFactory; + this.flowMessageFactory = createDefaultFlowMessageFactory(); } /** @@ -166,7 +177,27 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { return messageFactory.newMessage(CATCHING); } - private MessageFactory createDefaultMessageFactory() { + private static Class<? extends MessageFactory> createClassForProperty(final String property, + final Class<ParameterizedMessageFactory> defaultMessageFactoryClass) { + try { + final String clsName = System.getProperty(property, defaultMessageFactoryClass.getName()); + return Class.forName(clsName).asSubclass(ParameterizedMessageFactory.class); + } catch (final Throwable t) { + return defaultMessageFactoryClass; + } + } + + private static Class<? extends FlowMessageFactory> createFlowClassForProperty(final String property, + final Class<DefaultFlowMessageFactory> defaultFlowMessageFactoryClass) { + try { + final String clsName = System.getProperty(property, defaultFlowMessageFactoryClass.getName()); + return Class.forName(clsName).asSubclass(FlowMessageFactory.class); + } catch (final Throwable t) { + return defaultFlowMessageFactoryClass; + } + } + + private static MessageFactory createDefaultMessageFactory() { try { return DEFAULT_MESSAGE_FACTORY_CLASS.newInstance(); } catch (final InstantiationException e) { @@ -176,6 +207,16 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { } } + private static FlowMessageFactory createDefaultFlowMessageFactory() { + try { + return DEFAULT_FLOW_MESSAGE_FACTORY_CLASS.newInstance(); + } catch (final InstantiationException e) { + throw new IllegalStateException(e); + } catch (final IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + @Override public void debug(final Marker marker, final Message msg) { logIfEnabled(FQCN, Level.DEBUG, marker, msg, null); @@ -350,7 +391,8 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { protected EntryMessage enter(final String fqcn, final MessageSupplier msgSupplier) { EntryMessage message = null; if (isEnabled(Level.TRACE, ENTRY_MARKER, (Object) null, null)) { - logMessage(fqcn, Level.TRACE, ENTRY_MARKER, message = messageFactory.newEntryMessage(msgSupplier.get()), null); + logMessage(fqcn, Level.TRACE, ENTRY_MARKER, message = flowMessageFactory.newEntryMessage( + msgSupplier.get()), null); } return message; } @@ -385,12 +427,12 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { final int count = params == null ? 0 : params.length; if (count == 0) { if (Strings.isEmpty(format)) { - return messageFactory.newEntryMessage(null); + return flowMessageFactory.newEntryMessage(null); } - return messageFactory.newEntryMessage(messageFactory.newMessage(format)); + return flowMessageFactory.newEntryMessage(messageFactory.newMessage(format)); } if (format != null) { - return messageFactory.newEntryMessage(messageFactory.newMessage(format, params)); + return flowMessageFactory.newEntryMessage(messageFactory.newMessage(format, params)); } final StringBuilder sb = new StringBuilder(); sb.append("params("); @@ -402,7 +444,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { sb.append(parm instanceof Message ? ((Message) parm).getFormattedMessage() : String.valueOf(parm)); } sb.append(')'); - return messageFactory.newEntryMessage(messageFactory.newMessage(sb.toString())); + return flowMessageFactory.newEntryMessage(messageFactory.newMessage(sb.toString())); } protected EntryMessage entryMsg(final String format, final MessageSupplier... paramSuppliers) { @@ -1368,7 +1410,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { logMessage(FQCN, Level.TRACE, EXIT_MARKER, new MessageSupplier() { @Override public Message get() { - return messageFactory.newExitMessage(result, messageSupplier.get()); + return flowMessageFactory.newExitMessage(result, messageSupplier.get()); }; }, null); } @@ -1381,7 +1423,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { logMessage(FQCN, Level.TRACE, EXIT_MARKER, new MessageSupplier() { @Override public Message get() { - return messageFactory.newExitMessage(message); + return flowMessageFactory.newExitMessage(message); }; }, null); } @@ -1393,7 +1435,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { logMessage(FQCN, Level.TRACE, EXIT_MARKER, new MessageSupplier() { @Override public Message get() { - return messageFactory.newExitMessage(result, message); + return flowMessageFactory.newExitMessage(result, message); }; }, null); } @@ -1406,7 +1448,7 @@ public abstract class AbstractLogger implements ExtendedLogger, Serializable { logMessage(FQCN, Level.TRACE, EXIT_MARKER, new MessageSupplier() { @Override public Message get() { - return messageFactory.newExitMessage(result, message); + return flowMessageFactory.newExitMessage(result, message); }; }, null); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/log4j-api/src/test/java/org/apache/logging/log4j/LoggerTest.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/LoggerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/LoggerTest.java index ba452ff..edd92af 100644 --- a/log4j-api/src/test/java/org/apache/logging/log4j/LoggerTest.java +++ b/log4j-api/src/test/java/org/apache/logging/log4j/LoggerTest.java @@ -142,19 +142,6 @@ public class LoggerTest { } @Test - public void flowTracingString_ObjectArray2_ParameterizedMessageFactory() { - TestLogger myLogger = (TestLogger) LogManager.getLogger("LoggerTestWithCustomParameterizedMessageFactory", new ParameterizedMessageFactory("Enter", "Exit")); - EntryMessage msg = myLogger.traceEntry("doFoo(a={}, b={})", 1, 2); - myLogger.traceExit(msg, 3); - final List<String> entries = myLogger.getEntries(); - assertEquals(2, entries.size()); - assertThat("Incorrect Entry", entries.get(0), startsWith("ENTRY[ FLOW ] TRACE Enter")); - assertThat("Missing entry data", entries.get(0), containsString("doFoo(a=1, b=2)")); - assertThat("Incorrect Exit", entries.get(1), startsWith("EXIT[ FLOW ] TRACE Exit")); - assertThat("Missing exit data", entries.get(1), containsString("doFoo(a=1, b=2): 3")); - } - - @Test public void flowTracingNoExitArgs() { logger.traceEntry(); logger.traceExit(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a006907..77dd213 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -24,6 +24,9 @@ </properties> <body> <release version="2.6" date="201Y-MM-DD" description="GA Release 2.6"> + <action issue="LOG4J2-1284" dev="rpopma" type="fix"> + Made default MessageFactory configurable. + </action> <action issue="LOG4J2-1281" dev="rpopma" type="fix"> LoggerConfig.getProperties() should not allocate on each call. </action> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6def026b/src/site/xdoc/manual/configuration.xml.vm ---------------------------------------------------------------------- diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm index ee14ce0..18367eb 100644 --- a/src/site/xdoc/manual/configuration.xml.vm +++ b/src/site/xdoc/manual/configuration.xml.vm @@ -1903,6 +1903,16 @@ public class AwesomeTest { This property only has effect if <tt>Discard</tt> is specified as the <tt>log4j2.AsyncEventRouter</tt>.</td> </tr> + <tr> + <td>log4j2.messageFactory</td> + <td>org.apache.logging.log4j.message. ParameterizedMessageFactory</td> + <td>Default message factory used by Loggers if no factory was specified.</td> + </tr> + <tr> + <td>log4j2.flowMessageFactory</td> + <td>org.apache.logging.log4j.message. DefaultFlowMessageFactory</td> + <td>Default flow message factory used by Loggers.</td> + </tr> </table> </subsection>