Use AbstractManager.close() instead of deprecated release(). Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/1ba19a0b Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/1ba19a0b Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/1ba19a0b
Branch: refs/heads/LOG4J2-1553 Commit: 1ba19a0b72fbdda59200ad008cb3b8509ecda7df Parents: b73c589 Author: Gary Gregory <ggreg...@apache.org> Authored: Sun Aug 28 12:52:14 2016 -0700 Committer: Gary Gregory <ggreg...@apache.org> Committed: Sun Aug 28 12:52:14 2016 -0700 ---------------------------------------------------------------------- .../log4j/core/appender/AbstractManager.java | 32 +- .../appender/AbstractOutputStreamAppender.java | 2 +- .../core/appender/AbstractWriterAppender.java | 2 +- .../appender/db/AbstractDatabaseAppender.java | 4 +- .../appender/db/AbstractDatabaseManager.java | 2 +- .../log4j/core/appender/mom/JmsAppender.java | 2 +- .../log4j/core/appender/mom/JmsManager.java | 2 +- .../appender/mom/jeromq/JeroMqAppender.java | 362 +++++++++---------- .../core/appender/mom/kafka/KafkaAppender.java | 2 +- .../logging/log4j/core/lookup/JndiLookup.java | 2 +- .../log4j/core/net/server/JmsServer.java | 2 +- .../core/selector/JndiContextSelector.java | 2 +- .../appender/MemoryMappedFileManagerTest.java | 4 +- .../db/AbstractDatabaseAppenderTest.java | 10 +- .../db/jdbc/AbstractJdbcAppenderTest.java | 2 +- .../db/jpa/AbstractJpaAppenderTest.java | 2 +- .../log4j/core/appender/mom/JmsAppenderIT.java | 2 +- .../rolling/OnStartupTriggeringPolicyTest.java | 2 +- .../log4j/flume/appender/FlumeAppender.java | 2 +- .../appender/NoSqlDatabaseManagerTest.java | 12 +- .../log4j/perf/jmh/JdbcAppenderBenchmark.java | 4 +- .../log4j/perf/jmh/JpaAppenderBenchmark.java | 4 +- 22 files changed, 235 insertions(+), 225 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java index 4d7fc69..9e78df5 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java @@ -59,6 +59,24 @@ public abstract class AbstractManager { } /** + * Called to signify that this Manager is no longer required by an Appender. + */ + public void close() { + LOCK.lock(); + try { + --count; + if (count <= 0) { + MAP.remove(name); + LOGGER.debug("Shutting down {} {}", this.getClass().getSimpleName(), getName()); + releaseSub(); + } + } finally { + LOCK.unlock(); + } + } + + + /** * Retrieves a Manager if it has been previously created or creates a new Manager. * @param name The name of the Manager to retrieve. * @param factory The Factory to use to create the Manager. @@ -133,19 +151,11 @@ public abstract class AbstractManager { /** * Called to signify that this Manager is no longer required by an Appender. + * @deprecated Use {@link #close()}. */ + @Deprecated public void release() { - LOCK.lock(); - try { - --count; - if (count <= 0) { - MAP.remove(name); - LOGGER.debug("Shutting down {} {}", this.getClass().getSimpleName(), getName()); - releaseSub(); - } - } finally { - LOCK.unlock(); - } + close(); } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java index 67e835a..3e14d84 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java @@ -108,7 +108,7 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager @Override public void stop() { super.stop(); - manager.release(); + manager.close(); } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java index 18152fd..4e2b835 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java @@ -117,6 +117,6 @@ public abstract class AbstractWriterAppender<M extends WriterManager> extends Ab @Override public void stop() { super.stop(); - manager.release(); + manager.close(); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java index 326d47f..959df1f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java @@ -93,7 +93,7 @@ public abstract class AbstractDatabaseAppender<T extends AbstractDatabaseManager public final void stop() { super.stop(); if (this.getManager() != null) { - this.getManager().release(); + this.getManager().close(); } } @@ -130,7 +130,7 @@ public abstract class AbstractDatabaseAppender<T extends AbstractDatabaseManager manager.startup(); } this.manager = manager; - old.release(); + old.close(); } finally { this.writeLock.unlock(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java index c3682dc..4457008 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseManager.java @@ -78,7 +78,7 @@ public abstract class AbstractDatabaseManager extends AbstractManager implements protected abstract void shutdownInternal() throws Exception; /** - * This method is called from the {@link #release()} method when the appender is stopped or the appender's manager + * This method is called from the {@link #close()} method when the appender is stopped or the appender's manager * is replaced. If it has not already been called, it calls {@link #shutdownInternal()} and catches any exceptions * it might throw. */ http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java index 7484ca1..b470a38 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java @@ -70,7 +70,7 @@ public class JmsAppender extends AbstractAppender { @Override public void stop() { - this.manager.release(); + this.manager.close(); super.stop(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java index 7cf1637..1df23ec 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java @@ -132,7 +132,7 @@ public class JmsManager extends AbstractManager { this.connection.close(); } catch (final JMSException ignored) { } - this.jndiManager.release(); + this.jndiManager.close(); } private static class JmsConfiguration { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java index 9f2fa41..064ed2c 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java @@ -1,181 +1,181 @@ -/* - * 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.core.appender.mom.jeromq; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import org.apache.logging.log4j.core.Appender; -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Node; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required; -import org.apache.logging.log4j.core.layout.PatternLayout; -import org.apache.logging.log4j.util.Strings; - -/** - * Sends log events to one or more ZeroMQ (JeroMQ) endpoints. - * <p> - * Requires the JeroMQ jar (LGPL as of 0.3.5) - * </p> - */ -// TODO -// Some methods are synchronized because a ZMQ.Socket is not thread-safe -// Using a ThreadLocal for the publisher hangs tests on shutdown. There must be -// some issue on threads owning certain resources as opposed to others. -@Plugin(name = "JeroMQ", category = Node.CATEGORY, elementType = Appender.ELEMENT_TYPE, printObject = true) -public final class JeroMqAppender extends AbstractAppender { - - private static final int DEFAULT_BACKLOG = 100; - - private static final int DEFAULT_IVL = 100; - - private static final int DEFAULT_RCV_HWM = 1000; - - private static final int DEFAULT_SND_HWM = 1000; - - private final JeroMqManager manager; - private final List<String> endpoints; - private int sendRcFalse; - private int sendRcTrue; - - private JeroMqAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout, - final boolean ignoreExceptions, final List<String> endpoints, final long affinity, final long backlog, - final boolean delayAttachOnConnect, final byte[] identity, final boolean ipv4Only, final long linger, - final long maxMsgSize, final long rcvHwm, final long receiveBufferSize, final int receiveTimeOut, - final long reconnectIVL, final long reconnectIVLMax, final long sendBufferSize, final int sendTimeOut, - final long sndHWM, final int tcpKeepAlive, final long tcpKeepAliveCount, final long tcpKeepAliveIdle, - final long tcpKeepAliveInterval, final boolean xpubVerbose) { - super(name, filter, layout, ignoreExceptions); - this.manager = JeroMqManager.getJeroMqManager(name, affinity, backlog, delayAttachOnConnect, identity, ipv4Only, - linger, maxMsgSize, rcvHwm, receiveBufferSize, receiveTimeOut, reconnectIVL, reconnectIVLMax, - sendBufferSize, sendTimeOut, sndHWM, tcpKeepAlive, tcpKeepAliveCount, tcpKeepAliveIdle, - tcpKeepAliveInterval, xpubVerbose, endpoints); - this.endpoints = endpoints; - } - - // The ZMQ.Socket class has other set methods that we do not cover because - // they throw unsupported operation exceptions. - @PluginFactory - public static JeroMqAppender createAppender( - // @formatter:off - @Required(message = "No name provided for JeroMqAppender") @PluginAttribute("name") final String name, - @PluginElement("Layout") Layout<?> layout, - @PluginElement("Filter") final Filter filter, - @PluginElement("Properties") final Property[] properties, - // Super attributes - @PluginAttribute("ignoreExceptions") final boolean ignoreExceptions, - // ZMQ attributes; defaults picked from zmq.Options. - @PluginAttribute(value = "affinity", defaultLong = 0) final long affinity, - @PluginAttribute(value = "backlog", defaultLong = DEFAULT_BACKLOG) final long backlog, - @PluginAttribute(value = "delayAttachOnConnect", defaultBoolean = false) final boolean delayAttachOnConnect, - @PluginAttribute(value = "identity") final byte[] identity, - @PluginAttribute(value = "ipv4Only", defaultBoolean = true) final boolean ipv4Only, - @PluginAttribute(value = "linger", defaultLong = -1) final long linger, - @PluginAttribute(value = "maxMsgSize", defaultLong = -1) final long maxMsgSize, - @PluginAttribute(value = "rcvHwm", defaultLong = DEFAULT_RCV_HWM) final long rcvHwm, - @PluginAttribute(value = "receiveBufferSize", defaultLong = 0) final long receiveBufferSize, - @PluginAttribute(value = "receiveTimeOut", defaultLong = -1) final int receiveTimeOut, - @PluginAttribute(value = "reconnectIVL", defaultLong = DEFAULT_IVL) final long reconnectIVL, - @PluginAttribute(value = "reconnectIVLMax", defaultLong = 0) final long reconnectIVLMax, - @PluginAttribute(value = "sendBufferSize", defaultLong = 0) final long sendBufferSize, - @PluginAttribute(value = "sendTimeOut", defaultLong = -1) final int sendTimeOut, - @PluginAttribute(value = "sndHwm", defaultLong = DEFAULT_SND_HWM) final long sndHwm, - @PluginAttribute(value = "tcpKeepAlive", defaultInt = -1) final int tcpKeepAlive, - @PluginAttribute(value = "tcpKeepAliveCount", defaultLong = -1) final long tcpKeepAliveCount, - @PluginAttribute(value = "tcpKeepAliveIdle", defaultLong = -1) final long tcpKeepAliveIdle, - @PluginAttribute(value = "tcpKeepAliveInterval", defaultLong = -1) final long tcpKeepAliveInterval, - @PluginAttribute(value = "xpubVerbose", defaultBoolean = false) final boolean xpubVerbose - // @formatter:on - ) { - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } - List<String> endpoints; - if (properties == null) { - endpoints = new ArrayList<>(0); - } else { - endpoints = new ArrayList<>(properties.length); - for (final Property property : properties) { - if ("endpoint".equalsIgnoreCase(property.getName())) { - final String value = property.getValue(); - if (Strings.isNotEmpty(value)) { - endpoints.add(value); - } - } - } - } - LOGGER.debug("Creating JeroMqAppender with name={}, filter={}, layout={}, ignoreExceptions={}, endpoints={}", - name, filter, layout, ignoreExceptions, endpoints); - return new JeroMqAppender(name, filter, layout, ignoreExceptions, endpoints, affinity, backlog, - delayAttachOnConnect, identity, ipv4Only, linger, maxMsgSize, rcvHwm, receiveBufferSize, - receiveTimeOut, reconnectIVL, reconnectIVLMax, sendBufferSize, sendTimeOut, sndHwm, tcpKeepAlive, - tcpKeepAliveCount, tcpKeepAliveIdle, tcpKeepAliveInterval, xpubVerbose); - } - - @Override - public synchronized void append(final LogEvent event) { - final Layout<? extends Serializable> layout = getLayout(); - final byte[] formattedMessage = layout.toByteArray(event); - if (manager.send(getLayout().toByteArray(event))) { - sendRcTrue++; - } else { - sendRcFalse++; - LOGGER.error("Appender {} could not send message {} to JeroMQ {}", getName(), sendRcFalse, formattedMessage); - } - } - - @Override - public void stop() { - manager.release(); - super.stop(); - } - - // not public, handy for testing - int getSendRcFalse() { - return sendRcFalse; - } - - // not public, handy for testing - int getSendRcTrue() { - return sendRcTrue; - } - - // not public, handy for testing - void resetSendRcs() { - sendRcTrue = sendRcFalse = 0; - } - - @Override - public String toString() { - return "JeroMqAppender{" + - "name=" + getName() + - ", state=" + getState() + - ", manager=" + manager + - ", endpoints=" + endpoints + - '}'; - } -} +/* + * 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.core.appender.mom.jeromq; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Node; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.apache.logging.log4j.util.Strings; + +/** + * Sends log events to one or more ZeroMQ (JeroMQ) endpoints. + * <p> + * Requires the JeroMQ jar (LGPL as of 0.3.5) + * </p> + */ +// TODO +// Some methods are synchronized because a ZMQ.Socket is not thread-safe +// Using a ThreadLocal for the publisher hangs tests on shutdown. There must be +// some issue on threads owning certain resources as opposed to others. +@Plugin(name = "JeroMQ", category = Node.CATEGORY, elementType = Appender.ELEMENT_TYPE, printObject = true) +public final class JeroMqAppender extends AbstractAppender { + + private static final int DEFAULT_BACKLOG = 100; + + private static final int DEFAULT_IVL = 100; + + private static final int DEFAULT_RCV_HWM = 1000; + + private static final int DEFAULT_SND_HWM = 1000; + + private final JeroMqManager manager; + private final List<String> endpoints; + private int sendRcFalse; + private int sendRcTrue; + + private JeroMqAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout, + final boolean ignoreExceptions, final List<String> endpoints, final long affinity, final long backlog, + final boolean delayAttachOnConnect, final byte[] identity, final boolean ipv4Only, final long linger, + final long maxMsgSize, final long rcvHwm, final long receiveBufferSize, final int receiveTimeOut, + final long reconnectIVL, final long reconnectIVLMax, final long sendBufferSize, final int sendTimeOut, + final long sndHWM, final int tcpKeepAlive, final long tcpKeepAliveCount, final long tcpKeepAliveIdle, + final long tcpKeepAliveInterval, final boolean xpubVerbose) { + super(name, filter, layout, ignoreExceptions); + this.manager = JeroMqManager.getJeroMqManager(name, affinity, backlog, delayAttachOnConnect, identity, ipv4Only, + linger, maxMsgSize, rcvHwm, receiveBufferSize, receiveTimeOut, reconnectIVL, reconnectIVLMax, + sendBufferSize, sendTimeOut, sndHWM, tcpKeepAlive, tcpKeepAliveCount, tcpKeepAliveIdle, + tcpKeepAliveInterval, xpubVerbose, endpoints); + this.endpoints = endpoints; + } + + // The ZMQ.Socket class has other set methods that we do not cover because + // they throw unsupported operation exceptions. + @PluginFactory + public static JeroMqAppender createAppender( + // @formatter:off + @Required(message = "No name provided for JeroMqAppender") @PluginAttribute("name") final String name, + @PluginElement("Layout") Layout<?> layout, + @PluginElement("Filter") final Filter filter, + @PluginElement("Properties") final Property[] properties, + // Super attributes + @PluginAttribute("ignoreExceptions") final boolean ignoreExceptions, + // ZMQ attributes; defaults picked from zmq.Options. + @PluginAttribute(value = "affinity", defaultLong = 0) final long affinity, + @PluginAttribute(value = "backlog", defaultLong = DEFAULT_BACKLOG) final long backlog, + @PluginAttribute(value = "delayAttachOnConnect", defaultBoolean = false) final boolean delayAttachOnConnect, + @PluginAttribute(value = "identity") final byte[] identity, + @PluginAttribute(value = "ipv4Only", defaultBoolean = true) final boolean ipv4Only, + @PluginAttribute(value = "linger", defaultLong = -1) final long linger, + @PluginAttribute(value = "maxMsgSize", defaultLong = -1) final long maxMsgSize, + @PluginAttribute(value = "rcvHwm", defaultLong = DEFAULT_RCV_HWM) final long rcvHwm, + @PluginAttribute(value = "receiveBufferSize", defaultLong = 0) final long receiveBufferSize, + @PluginAttribute(value = "receiveTimeOut", defaultLong = -1) final int receiveTimeOut, + @PluginAttribute(value = "reconnectIVL", defaultLong = DEFAULT_IVL) final long reconnectIVL, + @PluginAttribute(value = "reconnectIVLMax", defaultLong = 0) final long reconnectIVLMax, + @PluginAttribute(value = "sendBufferSize", defaultLong = 0) final long sendBufferSize, + @PluginAttribute(value = "sendTimeOut", defaultLong = -1) final int sendTimeOut, + @PluginAttribute(value = "sndHwm", defaultLong = DEFAULT_SND_HWM) final long sndHwm, + @PluginAttribute(value = "tcpKeepAlive", defaultInt = -1) final int tcpKeepAlive, + @PluginAttribute(value = "tcpKeepAliveCount", defaultLong = -1) final long tcpKeepAliveCount, + @PluginAttribute(value = "tcpKeepAliveIdle", defaultLong = -1) final long tcpKeepAliveIdle, + @PluginAttribute(value = "tcpKeepAliveInterval", defaultLong = -1) final long tcpKeepAliveInterval, + @PluginAttribute(value = "xpubVerbose", defaultBoolean = false) final boolean xpubVerbose + // @formatter:on + ) { + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + List<String> endpoints; + if (properties == null) { + endpoints = new ArrayList<>(0); + } else { + endpoints = new ArrayList<>(properties.length); + for (final Property property : properties) { + if ("endpoint".equalsIgnoreCase(property.getName())) { + final String value = property.getValue(); + if (Strings.isNotEmpty(value)) { + endpoints.add(value); + } + } + } + } + LOGGER.debug("Creating JeroMqAppender with name={}, filter={}, layout={}, ignoreExceptions={}, endpoints={}", + name, filter, layout, ignoreExceptions, endpoints); + return new JeroMqAppender(name, filter, layout, ignoreExceptions, endpoints, affinity, backlog, + delayAttachOnConnect, identity, ipv4Only, linger, maxMsgSize, rcvHwm, receiveBufferSize, + receiveTimeOut, reconnectIVL, reconnectIVLMax, sendBufferSize, sendTimeOut, sndHwm, tcpKeepAlive, + tcpKeepAliveCount, tcpKeepAliveIdle, tcpKeepAliveInterval, xpubVerbose); + } + + @Override + public synchronized void append(final LogEvent event) { + final Layout<? extends Serializable> layout = getLayout(); + final byte[] formattedMessage = layout.toByteArray(event); + if (manager.send(getLayout().toByteArray(event))) { + sendRcTrue++; + } else { + sendRcFalse++; + LOGGER.error("Appender {} could not send message {} to JeroMQ {}", getName(), sendRcFalse, formattedMessage); + } + } + + @Override + public void stop() { + manager.close(); + super.stop(); + } + + // not public, handy for testing + int getSendRcFalse() { + return sendRcFalse; + } + + // not public, handy for testing + int getSendRcTrue() { + return sendRcTrue; + } + + // not public, handy for testing + void resetSendRcs() { + sendRcTrue = sendRcFalse = 0; + } + + @Override + public String toString() { + return "JeroMqAppender{" + + "name=" + getName() + + ", state=" + getState() + + ", manager=" + manager + + ", endpoints=" + endpoints + + '}'; + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java index 81879e7..fa7f7e0 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java @@ -102,7 +102,7 @@ public final class KafkaAppender extends AbstractAppender { @Override public void stop() { super.stop(); - manager.release(); + manager.close(); } @Override http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java index 3ceed5d..35c4f9d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java @@ -58,7 +58,7 @@ public class JndiLookup extends AbstractLookup { LOGGER.warn(LOOKUP, "Error looking up JNDI resource [{}].", jndiName, e); return null; } finally { - jndiManager.release(); + jndiManager.close(); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/server/JmsServer.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/server/JmsServer.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/server/JmsServer.java index 74a3834..c68b067 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/server/JmsServer.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/server/JmsServer.java @@ -104,7 +104,7 @@ public class JmsServer extends LogEventListener implements MessageListener, Life } catch (final JMSException e) { LOGGER.debug("Exception closing {}", messageConsumer, e); } - jmsManager.release(); + jmsManager.close(); } @Override http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java index b563c8d..87709f0 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java @@ -114,7 +114,7 @@ public class JndiContextSelector implements NamedContextSelector { } catch (final NamingException ne) { LOGGER.error("Unable to lookup {}", Constants.JNDI_CONTEXT_NAME, ne); } finally { - jndiManager.release(); + jndiManager.close(); } return loggingContextName == null ? CONTEXT : locateContext(loggingContextName, null, configLocation); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java index 4b06b52..5838fb0 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManagerTest.java @@ -54,7 +54,7 @@ public class MemoryMappedFileManagerTest { manager.write(msg, 0, msg.length, false); } - manager.release(); + manager.close(); try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String line = reader.readLine(); @@ -87,7 +87,7 @@ public class MemoryMappedFileManagerTest { isAppend, isForce, MemoryMappedFileManager.DEFAULT_REGION_LENGTH, null, null); manager.write(new byte[initialLength], 0, initialLength); - manager.release(); + manager.close(); final int expected = initialLength * 2; assertEquals("appended, not overwritten", expected, file.length()); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppenderTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppenderTest.java index a558460..d7f955d 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppenderTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppenderTest.java @@ -33,7 +33,7 @@ public class AbstractDatabaseAppenderTest { this.manager = createMockBuilder(LocalAbstractDatabaseManager.class) .withConstructor(String.class, int.class) .withArgs(name, 0) - .addMockedMethod("release") + .addMockedMethod("close") .createStrictMock(); this.appender = createMockBuilder(LocalAbstractDatabaseAppender.class) @@ -79,7 +79,7 @@ public class AbstractDatabaseAppenderTest { verify(this.manager, this.appender); reset(this.manager, this.appender); - this.manager.release(); + this.manager.close(); expectLastCall(); replay(this.manager, this.appender); @@ -98,10 +98,10 @@ public class AbstractDatabaseAppenderTest { verify(this.manager, this.appender); reset(this.manager, this.appender); - this.manager.release(); + this.manager.close(); expectLastCall(); final LocalAbstractDatabaseManager newManager = createMockBuilder(LocalAbstractDatabaseManager.class) - .withConstructor(String.class, int.class).withArgs("name", 0).addMockedMethod("release") + .withConstructor(String.class, int.class).withArgs("name", 0).addMockedMethod("close") .createStrictMock(); newManager.startupInternal(); expectLastCall(); @@ -111,7 +111,7 @@ public class AbstractDatabaseAppenderTest { verify(this.manager, this.appender, newManager); reset(this.manager, this.appender, newManager); - newManager.release(); + newManager.close(); expectLastCall(); replay(this.manager, this.appender, newManager); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderTest.java index 2d5f6ce..2b73c01 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jdbc/AbstractJdbcAppenderTest.java @@ -77,7 +77,7 @@ public abstract class AbstractJdbcAppenderTest { final Appender appender = context.getConfiguration().getAppender("databaseAppender"); assertNotNull("The appender should not be null.", appender); assertTrue("The appender should be a JdbcAppender.", appender instanceof JdbcAppender); - ((JdbcAppender) appender).getManager().release(); + ((JdbcAppender) appender).getManager().close(); } finally { System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); context.reconfigure(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java index 8fb2aaa..8d8f5f7 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/db/jpa/AbstractJpaAppenderTest.java @@ -62,7 +62,7 @@ public abstract class AbstractJpaAppenderTest { final Appender appender = context.getConfiguration().getAppender("databaseAppender"); assertNotNull("The appender should not be null.", appender); assertTrue("The appender should be a JpaAppender.", appender instanceof JpaAppender); - ((JpaAppender) appender).getManager().release(); + ((JpaAppender) appender).getManager().close(); } finally { System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); context.reconfigure(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderIT.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderIT.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderIT.java index 58f4f63..069a20c 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderIT.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderIT.java @@ -63,7 +63,7 @@ public class JmsAppenderIT { @AfterClass public static void tearDownClass() { - jmsManager.release(); + jmsManager.close(); } @Before http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java index 4ab6b5b..8a6864f 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java @@ -87,7 +87,7 @@ public class OnStartupTriggeringPolicyTest { assertTrue("Missing: " + rolled.toString() + ", files on disk = " + files, Files.exists(rolled)); assertEquals(rolled.toString(), size, Files.size(rolled)); } finally { - manager.release(); + manager.close(); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java ---------------------------------------------------------------------- diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java index 2141681..874ac54 100644 --- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java +++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java @@ -108,7 +108,7 @@ public final class FlumeAppender extends AbstractAppender implements FlumeEventF @Override public void stop() { super.stop(); - manager.release(); + manager.close(); } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java ---------------------------------------------------------------------- diff --git a/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java b/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java index 152b584..8d5b7a0 100644 --- a/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java +++ b/log4j-nosql/src/test/java/org/apache/logging/log4j/nosql/appender/NoSqlDatabaseManagerTest.java @@ -90,7 +90,7 @@ public class NoSqlDatabaseManagerTest { manager.commitAndClose(); } finally { try { - manager.release(); + manager.close(); } catch (final Throwable ignore) { /* */ } @@ -120,7 +120,7 @@ public class NoSqlDatabaseManagerTest { verify(event); } finally { try { - manager.release(); + manager.close(); } catch (final Throwable ignore) { /* */ } @@ -158,7 +158,7 @@ public class NoSqlDatabaseManagerTest { } } finally { try { - manager.release(); + manager.close(); } catch (final Throwable ignore) { /* */ } @@ -247,7 +247,7 @@ public class NoSqlDatabaseManagerTest { verify(this.provider, this.connection, event, message); } finally { try { - manager.release(); + manager.close(); } catch (final Throwable ignore) { /* */ } @@ -384,7 +384,7 @@ public class NoSqlDatabaseManagerTest { verify(this.provider, this.connection, event, message); } finally { try { - manager.release(); + manager.close(); } catch (final Throwable ignore) { /* */ } @@ -583,7 +583,7 @@ public class NoSqlDatabaseManagerTest { verify(this.provider, this.connection, event, message); } finally { try { - manager.release(); + manager.close(); } catch (final Throwable ignore) { /* */ } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java ---------------------------------------------------------------------- diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java index 4f475b1..62e6218 100644 --- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java +++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JdbcAppenderBenchmark.java @@ -136,8 +136,8 @@ public class JdbcAppenderBenchmark { public void tearDown() throws SQLException { final LoggerContext context = LoggerContext.getContext(false); try { - ((JdbcAppender) context.getConfiguration().getAppender("H2Appender")).getManager().release(); - ((JdbcAppender) context.getConfiguration().getAppender("HSQLDBAppender")).getManager().release(); + ((JdbcAppender) context.getConfiguration().getAppender("H2Appender")).getManager().close(); + ((JdbcAppender) context.getConfiguration().getAppender("HSQLDBAppender")).getManager().close(); } finally { System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); // context.reconfigure(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1ba19a0b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java ---------------------------------------------------------------------- diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java index 6267232..462b74a 100644 --- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java +++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/JpaAppenderBenchmark.java @@ -134,8 +134,8 @@ public class JpaAppenderBenchmark { public void tearDown() throws SQLException { final LoggerContext context = LoggerContext.getContext(false); try { - ((JpaAppender) context.getConfiguration().getAppender("H2Appender")).getManager().release(); - ((JpaAppender) context.getConfiguration().getAppender("HSQLDBAppender")).getManager().release(); + ((JpaAppender) context.getConfiguration().getAppender("H2Appender")).getManager().close(); + ((JpaAppender) context.getConfiguration().getAppender("HSQLDBAppender")).getManager().close(); } finally { System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); // context.reconfigure();