You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/10/24 08:08:24 UTC
[13/50] [abbrv] logging-log4j2 git commit: [LOG4J2-1620] .7-rc1:
RollingFileAppender immediateFlush default value should be true, not false.
[LOG4J2-1620] .7-rc1: RollingFileAppender immediateFlush default value
should be true, not false.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/d7d1cf7d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d7d1cf7d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d7d1cf7d
Branch: refs/heads/LOG4J2-1390
Commit: d7d1cf7d488ef73f01884ab30122c5bf7cd98393
Parents: 81eeff1
Author: Gary Gregory <gg...@apache.org>
Authored: Thu Sep 29 12:00:11 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Thu Sep 29 12:00:11 2016 -0700
----------------------------------------------------------------------
.../appender/AbstractOutputStreamAppender.java | 376 +++++++++----------
src/changes/changes.xml | 3 +
2 files changed, 191 insertions(+), 188 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d7d1cf7d/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 f7e86b4..b186aea 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
@@ -1,188 +1,188 @@
-/*
- * 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;
-
-import java.io.Serializable;
-import java.util.concurrent.TimeUnit;
-
-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.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.util.Constants;
-
-/**
- * Appends log events as bytes to a byte output stream. The stream encoding is defined in the layout.
- *
- * @param <M> The kind of {@link OutputStreamManager} under management
- */
-public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager> extends AbstractAppender {
-
- /**
- * Subclasses can extend this abstract Builder.
- *
- * @param <B> This builder class.
- */
- public abstract static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B> {
-
- @PluginBuilderAttribute
- private boolean bufferedIo = true;
-
- @PluginBuilderAttribute
- private int bufferSize = Constants.ENCODER_BYTE_BUFFER_SIZE;
-
- @PluginBuilderAttribute
- private boolean immediateFlush;
-
- public int getBufferSize() {
- return bufferSize;
- }
-
- public boolean isBufferedIo() {
- return bufferedIo;
- }
-
- public boolean isImmediateFlush() {
- return immediateFlush;
- }
-
- public B withImmediateFlush(final boolean immediateFlush) {
- this.immediateFlush = immediateFlush;
- return asBuilder();
- }
-
- public B withBufferedIo(final boolean bufferedIo) {
- this.bufferedIo = bufferedIo;
- return asBuilder();
- }
-
- public B withBufferSize(final int bufferSize) {
- this.bufferSize = bufferSize;
- return asBuilder();
- }
-
- }
-
- /**
- * Immediate flush means that the underlying writer or output stream will be flushed at the end of each append
- * operation. Immediate flush is slower but ensures that each append request is actually written. If
- * <code>immediateFlush</code> is set to {@code false}, then there is a good chance that the last few logs events
- * are not actually written to persistent media if and when the application crashes.
- */
- private final boolean immediateFlush;
-
- private final M manager;
-
- /**
- * Instantiates a WriterAppender and set the output destination to a new {@link java.io.OutputStreamWriter}
- * initialized with <code>os</code> as its {@link java.io.OutputStream}.
- *
- * @param name The name of the Appender.
- * @param layout The layout to format the message.
- * @param manager The OutputStreamManager.
- */
- protected AbstractOutputStreamAppender(final String name, final Layout<? extends Serializable> layout,
- final Filter filter, final boolean ignoreExceptions, final boolean immediateFlush, final M manager) {
- super(name, filter, layout, ignoreExceptions);
- this.manager = manager;
- this.immediateFlush = immediateFlush;
- }
-
- /**
- * Gets the immediate flush setting.
- *
- * @return immediate flush.
- */
- public boolean getImmediateFlush() {
- return immediateFlush;
- }
-
- /**
- * Gets the manager.
- *
- * @return the manager.
- */
- public M getManager() {
- return manager;
- }
-
- @Override
- public void start() {
- if (getLayout() == null) {
- LOGGER.error("No layout set for the appender named [" + getName() + "].");
- }
- if (manager == null) {
- LOGGER.error("No OutputStreamManager set for the appender named [" + getName() + "].");
- }
- super.start();
- }
-
- @Override
- public boolean stop(final long timeout, final TimeUnit timeUnit) {
- return stop(timeout, timeUnit, true);
- }
-
- @Override
- protected boolean stop(final long timeout, final TimeUnit timeUnit, final boolean changeLifeCycleState) {
- boolean stopped = super.stop(timeout, timeUnit, changeLifeCycleState);
- stopped &= manager.stop(timeout, timeUnit);
- if (changeLifeCycleState) {
- setStopped();
- }
- return stopped;
- }
-
- /**
- * Actual writing occurs here.
- * <p>
- * Most subclasses of <code>AbstractOutputStreamAppender</code> will need to override this method.
- * </p>
- *
- * @param event The LogEvent.
- */
- @Override
- public void append(final LogEvent event) {
- try {
- tryAppend(event);
- } catch (final AppenderLoggingException ex) {
- error("Unable to write to stream " + manager.getName() + " for appender " + getName() + ": " + ex);
- throw ex;
- }
- }
-
- private void tryAppend(final LogEvent event) {
- if (Constants.ENABLE_DIRECT_ENCODERS) {
- directEncodeEvent(event);
- } else {
- writeByteArrayToManager(event);
- }
- }
-
- protected void directEncodeEvent(final LogEvent event) {
- getLayout().encode(event, manager);
- if (this.immediateFlush || event.isEndOfBatch()) {
- manager.flush();
- }
- }
-
- protected void writeByteArrayToManager(final LogEvent event) {
- final byte[] bytes = getLayout().toByteArray(event);
- if (bytes != null && bytes.length > 0) {
- manager.write(bytes, this.immediateFlush || event.isEndOfBatch());
- }
- }
-}
+/*
+ * 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;
+
+import java.io.Serializable;
+import java.util.concurrent.TimeUnit;
+
+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.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.core.util.Constants;
+
+/**
+ * Appends log events as bytes to a byte output stream. The stream encoding is defined in the layout.
+ *
+ * @param <M> The kind of {@link OutputStreamManager} under management
+ */
+public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager> extends AbstractAppender {
+
+ /**
+ * Subclasses can extend this abstract Builder.
+ *
+ * @param <B> This builder class.
+ */
+ public abstract static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B> {
+
+ @PluginBuilderAttribute
+ private boolean bufferedIo = true;
+
+ @PluginBuilderAttribute
+ private int bufferSize = Constants.ENCODER_BYTE_BUFFER_SIZE;
+
+ @PluginBuilderAttribute
+ private boolean immediateFlush = true;
+
+ public int getBufferSize() {
+ return bufferSize;
+ }
+
+ public boolean isBufferedIo() {
+ return bufferedIo;
+ }
+
+ public boolean isImmediateFlush() {
+ return immediateFlush;
+ }
+
+ public B withImmediateFlush(final boolean immediateFlush) {
+ this.immediateFlush = immediateFlush;
+ return asBuilder();
+ }
+
+ public B withBufferedIo(final boolean bufferedIo) {
+ this.bufferedIo = bufferedIo;
+ return asBuilder();
+ }
+
+ public B withBufferSize(final int bufferSize) {
+ this.bufferSize = bufferSize;
+ return asBuilder();
+ }
+
+ }
+
+ /**
+ * Immediate flush means that the underlying writer or output stream will be flushed at the end of each append
+ * operation. Immediate flush is slower but ensures that each append request is actually written. If
+ * <code>immediateFlush</code> is set to {@code false}, then there is a good chance that the last few logs events
+ * are not actually written to persistent media if and when the application crashes.
+ */
+ private final boolean immediateFlush;
+
+ private final M manager;
+
+ /**
+ * Instantiates a WriterAppender and set the output destination to a new {@link java.io.OutputStreamWriter}
+ * initialized with <code>os</code> as its {@link java.io.OutputStream}.
+ *
+ * @param name The name of the Appender.
+ * @param layout The layout to format the message.
+ * @param manager The OutputStreamManager.
+ */
+ protected AbstractOutputStreamAppender(final String name, final Layout<? extends Serializable> layout,
+ final Filter filter, final boolean ignoreExceptions, final boolean immediateFlush, final M manager) {
+ super(name, filter, layout, ignoreExceptions);
+ this.manager = manager;
+ this.immediateFlush = immediateFlush;
+ }
+
+ /**
+ * Gets the immediate flush setting.
+ *
+ * @return immediate flush.
+ */
+ public boolean getImmediateFlush() {
+ return immediateFlush;
+ }
+
+ /**
+ * Gets the manager.
+ *
+ * @return the manager.
+ */
+ public M getManager() {
+ return manager;
+ }
+
+ @Override
+ public void start() {
+ if (getLayout() == null) {
+ LOGGER.error("No layout set for the appender named [" + getName() + "].");
+ }
+ if (manager == null) {
+ LOGGER.error("No OutputStreamManager set for the appender named [" + getName() + "].");
+ }
+ super.start();
+ }
+
+ @Override
+ public boolean stop(final long timeout, final TimeUnit timeUnit) {
+ return stop(timeout, timeUnit, true);
+ }
+
+ @Override
+ protected boolean stop(final long timeout, final TimeUnit timeUnit, final boolean changeLifeCycleState) {
+ boolean stopped = super.stop(timeout, timeUnit, changeLifeCycleState);
+ stopped &= manager.stop(timeout, timeUnit);
+ if (changeLifeCycleState) {
+ setStopped();
+ }
+ return stopped;
+ }
+
+ /**
+ * Actual writing occurs here.
+ * <p>
+ * Most subclasses of <code>AbstractOutputStreamAppender</code> will need to override this method.
+ * </p>
+ *
+ * @param event The LogEvent.
+ */
+ @Override
+ public void append(final LogEvent event) {
+ try {
+ tryAppend(event);
+ } catch (final AppenderLoggingException ex) {
+ error("Unable to write to stream " + manager.getName() + " for appender " + getName() + ": " + ex);
+ throw ex;
+ }
+ }
+
+ private void tryAppend(final LogEvent event) {
+ if (Constants.ENABLE_DIRECT_ENCODERS) {
+ directEncodeEvent(event);
+ } else {
+ writeByteArrayToManager(event);
+ }
+ }
+
+ protected void directEncodeEvent(final LogEvent event) {
+ getLayout().encode(event, manager);
+ if (this.immediateFlush || event.isEndOfBatch()) {
+ manager.flush();
+ }
+ }
+
+ protected void writeByteArrayToManager(final LogEvent event) {
+ final byte[] bytes = getLayout().toByteArray(event);
+ if (bytes != null && bytes.length > 0) {
+ manager.write(bytes, this.immediateFlush || event.isEndOfBatch());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d7d1cf7d/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6c5d2cd..824b465 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,9 @@
</properties>
<body>
<release version="2.7" date="2016-09-25" description="GA Release 2.7">
+ <action issue="LOG4J2-1620" dev="ggregory" type="fix" due-to="Sascha Scholz">
+ 2.7-rc1: RollingFileAppender immediateFlush default value should be true, not false.
+ </action>
<action issue="LOG4J2-1611" dev="rpopma" type="fix">
Improved performance of context data injector for web applications to be on par with standalone applications.
</action>