I fixed it already in both branches. Gary
On Thu, Aug 15, 2019, 10:42 Ralph Goers <[email protected]> wrote: > Gary, > > Are you going to look into this? > > Ralph > > > On Aug 14, 2019, at 9:17 AM, Ralph Goers <[email protected]> > wrote: > > > > Any update on this? I’d like my builds to work again. > > > > Ralph > > > >> On Aug 13, 2019, at 4:29 PM, Ralph Goers <[email protected]> > wrote: > >> > >> Gary, > >> > >> It seems this change broker compatibility. Please see the Jenkins > failure. You either need to resolve the code so compatibility is maintained > or update revapi.json with the recommended changes. > >> > >> Ralph > >> > >>> On Aug 13, 2019, at 2:06 PM, [email protected] wrote: > >>> > >>> This is an automated email from the ASF dual-hosted git repository. > >>> > >>> ggregory pushed a commit to branch release-2.x > >>> in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git > >>> > >>> > >>> The following commit(s) were added to refs/heads/release-2.x by this > push: > >>> new 4679a08 [LOG4J2-2673] OutputStreamAppender.Builder ignores > setFilter(). > >>> 4679a08 is described below > >>> > >>> commit 4679a08d4899350f7ee19d050d2a96783b748066 > >>> Author: Gary Gregory <[email protected]> > >>> AuthorDate: Tue Aug 13 17:06:48 2019 -0400 > >>> > >>> [LOG4J2-2673] OutputStreamAppender.Builder ignores setFilter(). > >>> > >>> Also allow a null output stream for convenience instead of an NPE. > >>> --- > >>> .../log4j/core/appender/OutputStreamAppender.java | 351 > +++++++++++---------- > >>> .../core/appender/OutputStreamAppenderTest.java | 230 +++++++------- > >>> src/changes/changes.xml | 3 + > >>> 3 files changed, 302 insertions(+), 282 deletions(-) > >>> > >>> diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java > >>> index 7dfd187..dc6f352 100644 > >>> --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java > >>> +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java > >>> @@ -1,174 +1,177 @@ > >>> -/* > >>> - * 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.OutputStream; > >>> -import java.io.Serializable; > >>> - > >>> -import org.apache.logging.log4j.core.Appender; > >>> -import org.apache.logging.log4j.core.Core; > >>> -import org.apache.logging.log4j.core.Filter; > >>> -import org.apache.logging.log4j.core.Layout; > >>> -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.PluginBuilderFactory; > >>> -import org.apache.logging.log4j.core.config.plugins.PluginFactory; > >>> -import org.apache.logging.log4j.core.layout.PatternLayout; > >>> -import org.apache.logging.log4j.core.util.CloseShieldOutputStream; > >>> - > >>> -/** > >>> - * Appends log events to a given output stream using a layout. > >>> - * <p> > >>> - * Character encoding is handled within the Layout. > >>> - * </p> > >>> - */ > >>> -@Plugin(name = "OutputStream", category = Core.CATEGORY_NAME, > elementType = Appender.ELEMENT_TYPE, printObject = true) > >>> -public final class OutputStreamAppender extends > AbstractOutputStreamAppender<OutputStreamManager> { > >>> - > >>> - /** > >>> - * Builds OutputStreamAppender instances. > >>> - */ > >>> - public static class Builder<B extends Builder<B>> extends > AbstractOutputStreamAppender.Builder<B> > >>> - implements > org.apache.logging.log4j.core.util.Builder<OutputStreamAppender> { > >>> - > >>> - private Filter filter; > >>> - > >>> - private boolean follow = false; > >>> - > >>> - private final boolean ignoreExceptions = true; > >>> - > >>> - private OutputStream target; > >>> - > >>> - @Override > >>> - public OutputStreamAppender build() { > >>> - final Layout<? extends Serializable> layout = getLayout(); > >>> - final Layout<? extends Serializable> actualLayout = > layout == null ? PatternLayout.createDefaultLayout() > >>> - : layout; > >>> - return new OutputStreamAppender(getName(), actualLayout, > filter, getManager(target, follow, actualLayout), > >>> - ignoreExceptions, getPropertyArray()); > >>> - } > >>> - > >>> - public B setFollow(final boolean shouldFollow) { > >>> - this.follow = shouldFollow; > >>> - return asBuilder(); > >>> - } > >>> - > >>> - public B setTarget(final OutputStream aTarget) { > >>> - this.target = aTarget; > >>> - return asBuilder(); > >>> - } > >>> - } > >>> - > >>> - /** > >>> - * Holds data to pass to factory method. > >>> - */ > >>> - private static class FactoryData { > >>> - private final Layout<? extends Serializable> layout; > >>> - private final String name; > >>> - private final OutputStream os; > >>> - > >>> - /** > >>> - * Builds instances. > >>> - * > >>> - * @param os > >>> - * The OutputStream. > >>> - * @param type > >>> - * The name of the target. > >>> - * @param layout > >>> - * A Serializable layout > >>> - */ > >>> - public FactoryData(final OutputStream os, final String type, > final Layout<? extends Serializable> layout) { > >>> - this.os = os; > >>> - this.name = type; > >>> - this.layout = layout; > >>> - } > >>> - } > >>> - > >>> - /** > >>> - * Creates the manager. > >>> - */ > >>> - private static class OutputStreamManagerFactory implements > ManagerFactory<OutputStreamManager, FactoryData> { > >>> - > >>> - /** > >>> - * Creates an OutputStreamManager. > >>> - * > >>> - * @param name > >>> - * The name of the entity to manage. > >>> - * @param data > >>> - * The data required to create the entity. > >>> - * @return The OutputStreamManager > >>> - */ > >>> - @Override > >>> - public OutputStreamManager createManager(final String name, > final FactoryData data) { > >>> - return new OutputStreamManager(data.os, data.name, > data.layout, true); > >>> - } > >>> - } > >>> - > >>> - private static OutputStreamManagerFactory factory = new > OutputStreamManagerFactory(); > >>> - > >>> - /** > >>> - * Creates an OutputStream Appender. > >>> - * > >>> - * @param layout > >>> - * The layout to use or null to get the default layout. > >>> - * @param filter > >>> - * The Filter or null. > >>> - * @param target > >>> - * an output stream. > >>> - * @param follow > >>> - * If true will follow changes to the underlying > output stream. > >>> - * Use false as the default. > >>> - * @param name > >>> - * The name of the Appender (required). > >>> - * @param ignore > >>> - * If {@code "true"} (default) exceptions encountered > when > >>> - * appending events are logged; otherwise they are > propagated to > >>> - * the caller. Use true as the default. > >>> - * @return The ConsoleAppender. > >>> - */ > >>> - @PluginFactory > >>> - public static OutputStreamAppender createAppender(Layout<? > extends Serializable> layout, final Filter filter, > >>> - final OutputStream target, final String name, final > boolean follow, final boolean ignore) { > >>> - if (name == null) { > >>> - LOGGER.error("No name provided for OutputStreamAppender"); > >>> - return null; > >>> - } > >>> - if (layout == null) { > >>> - layout = PatternLayout.createDefaultLayout(); > >>> - } > >>> - return new OutputStreamAppender(name, layout, filter, > getManager(target, follow, layout), ignore, null); > >>> - } > >>> - > >>> - private static OutputStreamManager getManager(final OutputStream > target, final boolean follow, > >>> - final Layout<? extends Serializable> layout) { > >>> - final OutputStream os = new CloseShieldOutputStream(target); > >>> - final String managerName = target.getClass().getName() + "@" > + Integer.toHexString(target.hashCode()) + '.' > >>> - + follow; > >>> - return OutputStreamManager.getManager(managerName, new > FactoryData(os, managerName, layout), factory); > >>> - } > >>> - > >>> - @PluginBuilderFactory > >>> - public static Builder newBuilder() { > >>> - return new Builder(); > >>> - } > >>> - > >>> - private OutputStreamAppender(final String name, final Layout<? > extends Serializable> layout, final Filter filter, > >>> - final OutputStreamManager manager, final boolean > ignoreExceptions, final Property[] properties) { > >>> - super(name, layout, filter, ignoreExceptions, true, > properties, manager); > >>> - } > >>> - > >>> -} > >>> +/* > >>> + * 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.OutputStream; > >>> +import java.io.Serializable; > >>> + > >>> +import org.apache.logging.log4j.core.Appender; > >>> +import org.apache.logging.log4j.core.Core; > >>> +import org.apache.logging.log4j.core.Filter; > >>> +import org.apache.logging.log4j.core.Layout; > >>> +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.PluginBuilderFactory; > >>> +import org.apache.logging.log4j.core.config.plugins.PluginFactory; > >>> +import org.apache.logging.log4j.core.layout.PatternLayout; > >>> +import org.apache.logging.log4j.core.util.CloseShieldOutputStream; > >>> +import org.apache.logging.log4j.core.util.NullOutputStream; > >>> + > >>> +/** > >>> + * Appends log events to a given output stream using a layout. > >>> + * <p> > >>> + * Character encoding is handled within the Layout. > >>> + * </p> > >>> + */ > >>> +@Plugin(name = "OutputStream", category = Core.CATEGORY_NAME, > elementType = Appender.ELEMENT_TYPE, printObject = true) > >>> +public final class OutputStreamAppender extends > AbstractOutputStreamAppender<OutputStreamManager> { > >>> + > >>> + /** > >>> + * Builds OutputStreamAppender instances. > >>> + * > >>> + * @param <B> > >>> + * The type to build. > >>> + */ > >>> + public static class Builder<B extends Builder<B>> extends > AbstractOutputStreamAppender.Builder<B> > >>> + implements > org.apache.logging.log4j.core.util.Builder<OutputStreamAppender> { > >>> + > >>> + private boolean follow = false; > >>> + > >>> + private final boolean ignoreExceptions = true; > >>> + > >>> + private OutputStream target; > >>> + > >>> + @Override > >>> + public OutputStreamAppender build() { > >>> + final Layout<? extends Serializable> layout = getLayout(); > >>> + final Layout<? extends Serializable> actualLayout = > layout == null ? PatternLayout.createDefaultLayout() > >>> + : layout; > >>> + return new OutputStreamAppender(getName(), actualLayout, > getFilter(), getManager(target, follow, actualLayout), > >>> + ignoreExceptions, getPropertyArray()); > >>> + } > >>> + > >>> + public B setFollow(final boolean shouldFollow) { > >>> + this.follow = shouldFollow; > >>> + return asBuilder(); > >>> + } > >>> + > >>> + public B setTarget(final OutputStream aTarget) { > >>> + this.target = aTarget; > >>> + return asBuilder(); > >>> + } > >>> + } > >>> + > >>> + /** > >>> + * Holds data to pass to factory method. > >>> + */ > >>> + private static class FactoryData { > >>> + private final Layout<? extends Serializable> layout; > >>> + private final String name; > >>> + private final OutputStream os; > >>> + > >>> + /** > >>> + * Builds instances. > >>> + * > >>> + * @param os > >>> + * The OutputStream. > >>> + * @param type > >>> + * The name of the target. > >>> + * @param layout > >>> + * A Serializable layout > >>> + */ > >>> + public FactoryData(final OutputStream os, final String type, > final Layout<? extends Serializable> layout) { > >>> + this.os = os; > >>> + this.name = type; > >>> + this.layout = layout; > >>> + } > >>> + } > >>> + > >>> + /** > >>> + * Creates the manager. > >>> + */ > >>> + private static class OutputStreamManagerFactory implements > ManagerFactory<OutputStreamManager, FactoryData> { > >>> + > >>> + /** > >>> + * Creates an OutputStreamManager. > >>> + * > >>> + * @param name > >>> + * The name of the entity to manage. > >>> + * @param data > >>> + * The data required to create the entity. > >>> + * @return The OutputStreamManager > >>> + */ > >>> + @Override > >>> + public OutputStreamManager createManager(final String name, > final FactoryData data) { > >>> + return new OutputStreamManager(data.os, data.name, > data.layout, true); > >>> + } > >>> + } > >>> + > >>> + private static OutputStreamManagerFactory factory = new > OutputStreamManagerFactory(); > >>> + > >>> + /** > >>> + * Creates an OutputStream Appender. > >>> + * > >>> + * @param layout > >>> + * The layout to use or null to get the default layout. > >>> + * @param filter > >>> + * The Filter or null. > >>> + * @param target > >>> + * an output stream. > >>> + * @param follow > >>> + * If true will follow changes to the underlying > output stream. > >>> + * Use false as the default. > >>> + * @param name > >>> + * The name of the Appender (required). > >>> + * @param ignore > >>> + * If {@code "true"} (default) exceptions encountered > when > >>> + * appending events are logged; otherwise they are > propagated to > >>> + * the caller. Use true as the default. > >>> + * @return The ConsoleAppender. > >>> + */ > >>> + @PluginFactory > >>> + public static OutputStreamAppender createAppender(Layout<? > extends Serializable> layout, final Filter filter, > >>> + final OutputStream target, final String name, final > boolean follow, final boolean ignore) { > >>> + if (name == null) { > >>> + LOGGER.error("No name provided for OutputStreamAppender"); > >>> + return null; > >>> + } > >>> + if (layout == null) { > >>> + layout = PatternLayout.createDefaultLayout(); > >>> + } > >>> + return new OutputStreamAppender(name, layout, filter, > getManager(target, follow, layout), ignore, null); > >>> + } > >>> + > >>> + private static OutputStreamManager getManager(final OutputStream > target, final boolean follow, > >>> + final Layout<? extends Serializable> layout) { > >>> + final OutputStream os = target == null ? > NullOutputStream.getInstance() : new CloseShieldOutputStream(target); > >>> + final OutputStream targetRef = target == null ? os : target; > >>> + final String managerName = targetRef.getClass().getName() + > "@" + Integer.toHexString(targetRef.hashCode()) > >>> + + '.' + follow; > >>> + return OutputStreamManager.getManager(managerName, new > FactoryData(os, managerName, layout), factory); > >>> + } > >>> + > >>> + @PluginBuilderFactory > >>> + public static <B extends Builder<B>> B newBuilder() { > >>> + return new Builder<B>().asBuilder(); > >>> + } > >>> + > >>> + private OutputStreamAppender(final String name, final Layout<? > extends Serializable> layout, final Filter filter, > >>> + final OutputStreamManager manager, final boolean > ignoreExceptions, final Property[] properties) { > >>> + super(name, layout, filter, ignoreExceptions, true, > properties, manager); > >>> + } > >>> + > >>> +} > >>> diff --git > a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java > b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java > >>> index 00af014..c1448bf 100644 > >>> --- > a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java > >>> +++ > b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java > >>> @@ -1,108 +1,122 @@ > >>> -/* > >>> - * 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.BufferedOutputStream; > >>> -import java.io.ByteArrayOutputStream; > >>> -import java.io.OutputStream; > >>> -import java.sql.SQLException; > >>> - > >>> -import org.apache.logging.log4j.LogManager; > >>> -import org.apache.logging.log4j.Logger; > >>> -import org.apache.logging.log4j.core.Appender; > >>> -import org.apache.logging.log4j.core.LoggerContext; > >>> -import org.apache.logging.log4j.core.config.Configuration; > >>> -import org.apache.logging.log4j.core.layout.PatternLayout; > >>> -import org.junit.Assert; > >>> -import org.junit.Rule; > >>> -import org.junit.Test; > >>> -import org.junit.rules.TestName; > >>> - > >>> -/** > >>> - * Tests {@link OutputStreamAppender}. > >>> - */ > >>> -public class OutputStreamAppenderTest { > >>> - > >>> - private static final String TEST_MSG = "FOO ERROR"; > >>> - > >>> - @Rule > >>> - public TestName testName = new TestName(); > >>> - > >>> - private String getName(final OutputStream out) { > >>> - return out.getClass().getSimpleName() + "." + > testName.getMethodName(); > >>> - } > >>> - > >>> - /** > >>> - * Tests that you can add an output stream appender dynamically. > >>> - */ > >>> - private void addAppender(final OutputStream outputStream, final > String outputStreamName) { > >>> - final LoggerContext context = LoggerContext.getContext(false); > >>> - final Configuration config = context.getConfiguration(); > >>> - final PatternLayout layout = > PatternLayout.createDefaultLayout(config); > >>> - final Appender appender = > OutputStreamAppender.createAppender(layout, null, outputStream, > outputStreamName, false, true); > >>> - appender.start(); > >>> - config.addAppender(appender); > >>> - ConfigurationTestUtils.updateLoggers(appender, config); > >>> - } > >>> - > >>> - @Test > >>> - public void testOutputStreamAppenderToBufferedOutputStream() > throws SQLException { > >>> - final ByteArrayOutputStream out = new ByteArrayOutputStream(); > >>> - final OutputStream os = new BufferedOutputStream(out); > >>> - final String name = getName(out); > >>> - final Logger logger = LogManager.getLogger(name); > >>> - addAppender(os, name); > >>> - logger.error(TEST_MSG); > >>> - final String actual = out.toString(); > >>> - Assert.assertTrue(actual, actual.contains(TEST_MSG)); > >>> - } > >>> - > >>> - @Test > >>> - public void testOutputStreamAppenderToByteArrayOutputStream() > throws SQLException { > >>> - final OutputStream out = new ByteArrayOutputStream(); > >>> - final String name = getName(out); > >>> - final Logger logger = LogManager.getLogger(name); > >>> - addAppender(out, name); > >>> - logger.error(TEST_MSG); > >>> - final String actual = out.toString(); > >>> - Assert.assertTrue(actual, actual.contains(TEST_MSG)); > >>> - } > >>> - > >>> - /** > >>> - * Validates that the code pattern we use to add an appender on > the fly > >>> - * works with a basic appender that is not the new OutputStream > appender or > >>> - * new Writer appender. > >>> - */ > >>> - @Test > >>> - public void testUpdatePatternWithFileAppender() { > >>> - final LoggerContext ctx = (LoggerContext) > LogManager.getContext(false); > >>> - final Configuration config = ctx.getConfiguration(); > >>> - // @formatter:off > >>> - final Appender appender = FileAppender.newBuilder() > >>> - .withFileName("target/" + getClass().getName() + ".log") > >>> - .withAppend(false).setName("File").setIgnoreExceptions(false) > >>> - .withBufferedIo(false) > >>> - .withBufferSize(4000) > >>> - .setConfiguration(config) > >>> - .build(); > >>> - // @formatter:on > >>> - appender.start(); > >>> - config.addAppender(appender); > >>> - ConfigurationTestUtils.updateLoggers(appender, config); > >>> - LogManager.getLogger().error("FOO MSG"); > >>> - } > >>> -} > >>> +/* > >>> + * 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.BufferedOutputStream; > >>> +import java.io.ByteArrayOutputStream; > >>> +import java.io.OutputStream; > >>> +import java.sql.SQLException; > >>> + > >>> +import org.apache.logging.log4j.LogManager; > >>> +import org.apache.logging.log4j.Logger; > >>> +import org.apache.logging.log4j.core.Appender; > >>> +import org.apache.logging.log4j.core.LoggerContext; > >>> +import org.apache.logging.log4j.core.config.Configuration; > >>> +import org.apache.logging.log4j.core.filter.NoMarkerFilter; > >>> +import org.apache.logging.log4j.core.layout.PatternLayout; > >>> +import org.junit.Assert; > >>> +import org.junit.Rule; > >>> +import org.junit.Test; > >>> +import org.junit.rules.TestName; > >>> + > >>> +/** > >>> + * Tests {@link OutputStreamAppender}. > >>> + */ > >>> +public class OutputStreamAppenderTest { > >>> + > >>> + private static final String TEST_MSG = "FOO ERROR"; > >>> + > >>> + @Rule > >>> + public TestName testName = new TestName(); > >>> + > >>> + private String getName(final OutputStream out) { > >>> + return out.getClass().getSimpleName() + "." + > testName.getMethodName(); > >>> + } > >>> + > >>> + /** > >>> + * Tests that you can add an output stream appender dynamically. > >>> + */ > >>> + private void addAppender(final OutputStream outputStream, final > String outputStreamName) { > >>> + final LoggerContext context = LoggerContext.getContext(false); > >>> + final Configuration config = context.getConfiguration(); > >>> + final PatternLayout layout = > PatternLayout.createDefaultLayout(config); > >>> + final Appender appender = > OutputStreamAppender.createAppender(layout, null, outputStream, > outputStreamName, false, true); > >>> + appender.start(); > >>> + config.addAppender(appender); > >>> + ConfigurationTestUtils.updateLoggers(appender, config); > >>> + } > >>> + > >>> + @Test > >>> + public void testBuildFilter() { > >>> + final NoMarkerFilter filter = > NoMarkerFilter.newBuilder().build(); > >>> + // @formatter:off > >>> + final OutputStreamAppender.Builder builder = > OutputStreamAppender.newBuilder() > >>> + .setName("test") > >>> + .setFilter(filter); > >>> + // @formatter:on > >>> + Assert.assertEquals(filter, builder.getFilter()); > >>> + final OutputStreamAppender appender = builder.build(); > >>> + Assert.assertEquals(filter, appender.getFilter()); > >>> + } > >>> + > >>> + @Test > >>> + public void testOutputStreamAppenderToBufferedOutputStream() > throws SQLException { > >>> + final ByteArrayOutputStream out = new ByteArrayOutputStream(); > >>> + final OutputStream os = new BufferedOutputStream(out); > >>> + final String name = getName(out); > >>> + final Logger logger = LogManager.getLogger(name); > >>> + addAppender(os, name); > >>> + logger.error(TEST_MSG); > >>> + final String actual = out.toString(); > >>> + Assert.assertTrue(actual, actual.contains(TEST_MSG)); > >>> + } > >>> + > >>> + @Test > >>> + public void testOutputStreamAppenderToByteArrayOutputStream() > throws SQLException { > >>> + final OutputStream out = new ByteArrayOutputStream(); > >>> + final String name = getName(out); > >>> + final Logger logger = LogManager.getLogger(name); > >>> + addAppender(out, name); > >>> + logger.error(TEST_MSG); > >>> + final String actual = out.toString(); > >>> + Assert.assertTrue(actual, actual.contains(TEST_MSG)); > >>> + } > >>> + > >>> + /** > >>> + * Validates that the code pattern we use to add an appender on > the fly > >>> + * works with a basic appender that is not the new OutputStream > appender or > >>> + * new Writer appender. > >>> + */ > >>> + @Test > >>> + public void testUpdatePatternWithFileAppender() { > >>> + final LoggerContext ctx = (LoggerContext) > LogManager.getContext(false); > >>> + final Configuration config = ctx.getConfiguration(); > >>> + // @formatter:off > >>> + final Appender appender = FileAppender.newBuilder() > >>> + .withFileName("target/" + getClass().getName() + ".log") > >>> + .withAppend(false).setName("File").setIgnoreExceptions(false) > >>> + .withBufferedIo(false) > >>> + .withBufferSize(4000) > >>> + .setConfiguration(config) > >>> + .build(); > >>> + // @formatter:on > >>> + appender.start(); > >>> + config.addAppender(appender); > >>> + ConfigurationTestUtils.updateLoggers(appender, config); > >>> + LogManager.getLogger().error("FOO MSG"); > >>> + } > >>> +} > >>> diff --git a/src/changes/changes.xml b/src/changes/changes.xml > >>> index c3483bd..a9ec160 100644 > >>> --- a/src/changes/changes.xml > >>> +++ b/src/changes/changes.xml > >>> @@ -33,6 +33,9 @@ > >>> <action issue="LOG4J2-2639" dev="rgoers" type="add"> > >>> Add builder pattern to Logger interface. > >>> </action> > >>> + <action issue="LOG4J2-2673" dev="ggregory" type="fix" > due-to="Yuichi Sugimura, Gary Gregory"> > >>> + OutputStreamAppender.Builder ignores setFilter(). > >>> + </action> > >>> </release> > >>> <release version="2.12.1" date="2019-08-06" description="GA Release > 2.12.1"> > >>> <action issue="LOG4J2-1946" dev="rgoers" type="fix" due-to="Igor > Perelyotov"> > >>> > >>> > >> > >> > >> > > > > > > > > >
