/* | |
* 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 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() { | |
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() { | |
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() | |
.setFileName("target/" + getClass().getName() + ".log") | |
.setAppend(false) | |
.setName("File") | |
.setIgnoreExceptions(false) | |
.setBufferedIo(false) | |
.setBufferSize(4000) | |
.setConfiguration(config) | |
.build(); | |
// @formatter:on | |
appender.start(); | |
config.addAppender(appender); | |
ConfigurationTestUtils.updateLoggers(appender, config); | |
LogManager.getLogger().error("FOO MSG"); | |
} | |
} |