blob: 81fa86195ff1a1a41ad31fe51695de0f33567261 [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.perf.nogc;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.layout.ByteBufferDestination;
import org.apache.logging.log4j.core.layout.Encoder;
import org.apache.logging.log4j.core.layout.StringBuilderEncoder;
import org.apache.logging.log4j.core.pattern.FormattingInfo;
import org.apache.logging.log4j.core.pattern.PatternFormatter;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.Map;
/**
* Layout that does not allocate temp objects.
* <p>
* LOG4J2-1274 proposes to add the {@link #encode} method to the Layout interface.
* In that scenario, the Appender would supply the ByteBuffer.
* For this demo we cannot
* </p>
*/
public class NoGcLayout implements Layout<Serializable>, Encoder<LogEvent> {
private final StringBuilder cachedStringBuilder = new StringBuilder(2048);
private final PatternSerializer2 serializer = new PatternSerializer2();
private final StringBuilderEncoder cachedHelper;
public NoGcLayout(final Charset charset) {
cachedHelper = new StringBuilderEncoder(charset);
}
@Override
public void encode(final LogEvent event, final ByteBufferDestination destination) {
final StringBuilder text = toText(event, getCachedStringBuilder());
final Encoder<StringBuilder> helper = getCachedHelper();
helper.encode(text, destination);
}
/**
* Creates a text representation of the specified log event
* and writes it into the specified StringBuilder.
* <p>
* Implementations are free to return a new StringBuilder if they can
* detect in advance that the specified StringBuilder is too small.
*/
StringBuilder toText(final LogEvent e, final StringBuilder destination) {
return serializer.toSerializable(e, destination);
}
public StringBuilder getCachedStringBuilder() {
cachedStringBuilder.setLength(0);
return cachedStringBuilder;
}
public Encoder<StringBuilder> getCachedHelper() {
return cachedHelper;
}
private static class PatternSerializer2 {
private final PatternFormatter[] formatters;
PatternSerializer2() {
this(new PatternFormatter[]{
new PatternFormatter(NoGcMessagePatternConverter.newInstance(null, null),
FormattingInfo.getDefault()),
});
}
private PatternSerializer2(final PatternFormatter[] formatters) {
super();
this.formatters = formatters;
}
public StringBuilder toSerializable(final LogEvent event, final StringBuilder buf) {
//final StringBuilder buf = getStringBuilder();
final int len = formatters.length;
for (int i = 0; i < len; i++) {
formatters[i].format(event, buf);
}
// String str = buf.toString();
// if (replace != null) {
// str = replace.format(str);
// }
return buf;
}
}
@Override
public byte[] getFooter() {
return new byte[0];
}
@Override
public byte[] getHeader() {
return new byte[0];
}
@Override
public byte[] toByteArray(final LogEvent event) {
return null;
}
@Override
public Serializable toSerializable(final LogEvent event) {
return null;
}
@Override
public String getContentType() {
return null;
}
@Override
public Map<String, String> getContentFormat() {
return null;
}
}