blob: aa762548aea24afd3a1ca0ad2830ec5d4004da50 [file] [log] [blame]
/*
* 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.test.appender;
import java.io.Serializable;
import java.nio.ByteBuffer;
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.layout.ByteBufferDestination;
/**
* This appender is primarily used for testing. Use in a real environment is discouraged as the List could eventually
* grow to cause an OutOfMemoryError.
*
* This appender will use {@link Layout#encode(Object, ByteBufferDestination)} (and not
* {@link Layout#toByteArray(LogEvent)}).
*/
public class EncodingListAppender extends ListAppender {
public EncodingListAppender(final String name) {
super(name);
}
public EncodingListAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
final boolean newline, final boolean raw) {
super(name, filter, layout, newline, raw);
}
private static class Destination implements ByteBufferDestination {
// JUnit 5 stack traces can start to get looooong
ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[8192]);
@Override
public ByteBuffer getByteBuffer() {
return byteBuffer;
}
@Override
public ByteBuffer drain(final ByteBuffer buf) {
throw new IllegalStateException("Unexpected message larger than 4096 bytes");
}
@Override
public void writeBytes(final ByteBuffer data) {
byteBuffer.put(data);
}
@Override
public void writeBytes(final byte[] data, final int offset, final int length) {
byteBuffer.put(data, offset, length);
}
}
@Override
public synchronized void append(final LogEvent event) {
final Layout<? extends Serializable> layout = getLayout();
if (layout == null) {
events.add(event);
} else {
final Destination content = new Destination();
layout.encode(event, content);
content.getByteBuffer().flip();
final byte[] record = new byte[content.getByteBuffer().remaining()];
content.getByteBuffer().get(record);
write(record);
}
}
}