blob: ef055a8f45074c245bf801b1c75fa1b8086e8421 [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.core.layout;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.BasicConfigurationFactory;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.lookup.MainMapLookup;
import org.apache.logging.log4j.test.junit.UsingAnyThreadContext;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.util.Strings;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@UsingAnyThreadContext
public class PatternLayoutTest {
public static class FauxLogger {
public String formatEvent(final LogEvent event, final Layout<?> layout) {
return new String(layout.toByteArray(event));
}
}
static ConfigurationFactory cf = new BasicConfigurationFactory();
static String msgPattern = "%m%n";
static String OUTPUT_FILE = "target/output/PatternParser";
static final String regexPattern = "%replace{%logger %msg}{\\.}{/}";
static String WITNESS_FILE = "witness/PatternParser";
public static void cleanupClass() {
ConfigurationFactory.removeConfigurationFactory(cf);
}
@BeforeAll
public static void setupClass() {
ConfigurationFactory.setConfigurationFactory(cf);
final LoggerContext ctx = LoggerContext.getContext();
ctx.reconfigure();
}
LoggerContext ctx = LoggerContext.getContext();
Logger root = ctx.getRootLogger();
private static class Destination implements ByteBufferDestination {
ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[2048]);
@Override
public ByteBuffer getByteBuffer() {
return byteBuffer;
}
@Override
public ByteBuffer drain(final ByteBuffer buf) {
throw new IllegalStateException("Unexpected message larger than 2048 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);
}
}
private void assertToByteArray(final String expectedStr, final PatternLayout layout, final LogEvent event) {
final byte[] result = layout.toByteArray(event);
assertEquals(expectedStr, new String(result));
}
private void assertEncode(final String expectedStr, final PatternLayout layout, final LogEvent event) {
final Destination destination = new Destination();
layout.encode(event, destination);
final ByteBuffer byteBuffer = destination.getByteBuffer();
byteBuffer.flip(); // set limit to position, position back to zero
assertEquals(expectedStr, new String(byteBuffer.array(), byteBuffer.arrayOffset() + byteBuffer.position(),
byteBuffer.remaining()));
}
@Test
public void testEqualsEmptyMarker() throws Exception {
// replace "[]" with the empty string
final PatternLayout layout = PatternLayout.newBuilder().setPattern("[%logger]%equals{[%marker]}{[]}{} %msg")
.setConfiguration(ctx.getConfiguration()).build();
// Not empty marker
final LogEvent event1 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMarker(MarkerManager.getMarker("TestMarker")) //
.setMessage(new SimpleMessage("Hello, world!")).build();
assertToByteArray("[org.apache.logging.log4j.core.layout.PatternLayoutTest][TestMarker] Hello, world!", layout,
event1);
assertEncode("[org.apache.logging.log4j.core.layout.PatternLayoutTest][TestMarker] Hello, world!", layout,
event1);
// empty marker
final LogEvent event2 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world!")).build();
assertToByteArray("[org.apache.logging.log4j.core.layout.PatternLayoutTest] Hello, world!", layout, event2);
assertEncode("[org.apache.logging.log4j.core.layout.PatternLayoutTest] Hello, world!", layout, event2);
}
@Test
public void testHeaderFooterJavaLookup() throws Exception {
// % does not work here.
final String pattern = "%d{UNIX} MyApp%n${java:version}%n${java:runtime}%n${java:vm}%n${java:os}%n${java:hw}";
final PatternLayout layout = PatternLayout.newBuilder().setConfiguration(ctx.getConfiguration())
.setHeader("Header: " + pattern).setFooter("Footer: " + pattern).build();
final byte[] header = layout.getHeader();
assertNotNull(header, "No header");
final String headerStr = new String(header);
assertTrue(headerStr.contains("Header: "), headerStr);
assertTrue(headerStr.contains("Java version "), headerStr);
assertTrue(headerStr.contains("(build "), headerStr);
assertTrue(headerStr.contains(" from "), headerStr);
assertTrue(headerStr.contains(" architecture: "), headerStr);
assertFalse(headerStr.contains("%d{UNIX}"), headerStr);
//
final byte[] footer = layout.getFooter();
assertNotNull(footer, "No footer");
final String footerStr = new String(footer);
assertTrue(footerStr.contains("Footer: "), footerStr);
assertTrue(footerStr.contains("Java version "), footerStr);
assertTrue(footerStr.contains("(build "), footerStr);
assertTrue(footerStr.contains(" from "), footerStr);
assertTrue(footerStr.contains(" architecture: "), footerStr);
assertFalse(footerStr.contains("%d{UNIX}"), footerStr);
}
/**
* Tests LOG4J2-962.
*/
@Test
public void testHeaderFooterMainLookup() {
MainMapLookup.setMainArguments("value0", "value1", "value2");
final PatternLayout layout = PatternLayout.newBuilder().setConfiguration(ctx.getConfiguration())
.setHeader("${main:0}").setFooter("${main:2}").build();
final byte[] header = layout.getHeader();
assertNotNull(header, "No header");
final String headerStr = new String(header);
assertTrue(headerStr.contains("value0"), headerStr);
//
final byte[] footer = layout.getFooter();
assertNotNull(footer, "No footer");
final String footerStr = new String(footer);
assertTrue(footerStr.contains("value2"), footerStr);
}
@Test
public void testHeaderFooterThreadContext() throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%d{UNIX} %m")
.setConfiguration(ctx.getConfiguration()).setHeader("${ctx:header}").setFooter("${ctx:footer}")
.build();
ThreadContext.put("header", "Hello world Header");
ThreadContext.put("footer", "Hello world Footer");
final byte[] header = layout.getHeader();
assertNotNull(header, "No header");
assertEquals("Hello world Header", new String(header),
"expected \"Hello world Header\", actual " + Strings.dquote(new String(header)));
}
private void testMdcPattern(final String patternStr, final String expectedStr, final boolean useThreadContext)
throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern(patternStr)
.setConfiguration(ctx.getConfiguration()).build();
if (useThreadContext) {
ThreadContext.put("key1", "value1");
ThreadContext.put("key2", "value2");
}
final LogEvent event = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello")).build();
assertToByteArray(expectedStr, layout, event);
assertEncode(expectedStr, layout, event);
}
@Test
public void testMdcPattern0() throws Exception {
testMdcPattern("%m : %X", "Hello : {key1=value1, key2=value2}", true);
}
@Test
public void testMdcPattern1() throws Exception {
testMdcPattern("%m : %X", "Hello : {}", false);
}
@Test
public void testMdcPattern2() throws Exception {
testMdcPattern("%m : %X{key1}", "Hello : value1", true);
}
@Test
public void testMdcPattern3() throws Exception {
testMdcPattern("%m : %X{key2}", "Hello : value2", true);
}
@Test
public void testMdcPattern4() throws Exception {
testMdcPattern("%m : %X{key3}", "Hello : ", true);
}
@Test
public void testMdcPattern5() throws Exception {
testMdcPattern("%m : %X{key1}, %X{key2}, %X{key3}", "Hello : value1, value2, ", true);
}
@Test
public void testPatternSelector() throws Exception {
final PatternMatch[] patterns = new PatternMatch[1];
patterns[0] = new PatternMatch("FLOW", "%d %-5p [%t]: ====== %C{1}.%M:%L %m ======%n");
// @formatter:off
final PatternSelector selector = MarkerPatternSelector.newBuilder()
.setProperties(patterns)
.setDefaultPattern("%d %-5p [%t]: %m%n")
.setAlwaysWriteExceptions(true)
.setNoConsoleNoAnsi(true)
.setConfiguration(ctx.getConfiguration())
.build();
// @formatter:on
final PatternLayout layout = PatternLayout.newBuilder().setPatternSelector(selector)
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.layout.PatternLayoutTest$FauxLogger")
.setMarker(MarkerManager.getMarker("FLOW"))
.setLevel(Level.TRACE) //
.setIncludeLocation(true)
.setMessage(new SimpleMessage("entry")).build();
final String result1 = new FauxLogger().formatEvent(event1, layout);
final String expectPattern1 = String.format(".*====== PatternLayoutTest.testPatternSelector:\\d+ entry ======%n");
assertTrue(result1.matches(expectPattern1), "Unexpected result: " + result1);
final LogEvent event2 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result2 = new String(layout.toByteArray(event2));
final String expectSuffix2 = String.format("Hello, world 1!%n");
assertTrue(result2.endsWith(expectSuffix2), "Unexpected result: " + result2);
}
@Test
public void testRegex() throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern(regexPattern)
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world!")).build();
assertToByteArray("org/apache/logging/log4j/core/layout/PatternLayoutTest Hello, world!", layout, event);
assertEncode("org/apache/logging/log4j/core/layout/PatternLayoutTest Hello, world!", layout, event);
}
@Test
public void testRegexEmptyMarker() throws Exception {
// replace "[]" with the empty string
final PatternLayout layout = PatternLayout.newBuilder().setPattern("[%logger]%replace{[%marker]}{\\[\\]}{} %msg")
.setConfiguration(ctx.getConfiguration()).build();
// Not empty marker
final LogEvent event1 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMarker(MarkerManager.getMarker("TestMarker")) //
.setMessage(new SimpleMessage("Hello, world!")).build();
assertToByteArray("[org.apache.logging.log4j.core.layout.PatternLayoutTest][TestMarker] Hello, world!", layout,
event1);
assertEncode("[org.apache.logging.log4j.core.layout.PatternLayoutTest][TestMarker] Hello, world!", layout,
event1);
// empty marker
final LogEvent event2 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world!")).build();
assertToByteArray("[org.apache.logging.log4j.core.layout.PatternLayoutTest] Hello, world!", layout, event2);
assertEncode("[org.apache.logging.log4j.core.layout.PatternLayoutTest] Hello, world!", layout, event2);
}
@Test
public void testEqualsMarkerWithMessageSubstitution() throws Exception {
// replace "[]" with the empty string
final PatternLayout layout = PatternLayout.newBuilder().setPattern("[%logger]%equals{[%marker]}{[]}{[%msg]}")
.setConfiguration(ctx.getConfiguration()).build();
// Not empty marker
final LogEvent event1 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMarker(MarkerManager.getMarker("TestMarker"))
.setMessage(new SimpleMessage("Hello, world!")).build();
final byte[] result1 = layout.toByteArray(event1);
assertEquals("[org.apache.logging.log4j.core.layout.PatternLayoutTest][TestMarker]", new String(result1));
// empty marker
final LogEvent event2 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world!")).build();
final byte[] result2 = layout.toByteArray(event2);
assertEquals("[org.apache.logging.log4j.core.layout.PatternLayoutTest][Hello, world!]", new String(result2));
}
@Test
public void testSpecialChars() throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern("\\\\%level\\t%msg\\n\\t%logger\\r\\n\\f")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world!")).build();
assertToByteArray("\\INFO\tHello, world!\n" +
"\torg.apache.logging.log4j.core.layout.PatternLayoutTest\r\n" +
"\f", layout, event);
assertEncode("\\INFO\tHello, world!\n" +
"\torg.apache.logging.log4j.core.layout.PatternLayoutTest\r\n" +
"\f", layout, event);
}
@Test
public void testUnixTime() throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%d{UNIX} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final byte[] result1 = layout.toByteArray(event1);
assertEquals(event1.getTimeMillis() / 1000 + " Hello, world 1!", new String(result1));
// System.out.println("event1=" + event1.getTimeMillis() / 1000);
final LogEvent event2 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world 2!")).build();
final byte[] result2 = layout.toByteArray(event2);
assertEquals(event2.getTimeMillis() / 1000 + " Hello, world 2!", new String(result2));
// System.out.println("event2=" + event2.getTimeMillis() / 1000);
}
@SuppressWarnings("unused")
private void testUnixTime(final String pattern) throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern(pattern + " %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final byte[] result1 = layout.toByteArray(event1);
assertEquals(event1.getTimeMillis() + " Hello, world 1!", new String(result1));
// System.out.println("event1=" + event1.getMillis());
final LogEvent event2 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world 2!")).build();
final byte[] result2 = layout.toByteArray(event2);
assertEquals(event2.getTimeMillis() + " Hello, world 2!", new String(result2));
// System.out.println("event2=" + event2.getMillis());
}
@Test
public void testUnixTimeMillis() throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%d{UNIX_MILLIS} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final byte[] result1 = layout.toByteArray(event1);
assertEquals(event1.getTimeMillis() + " Hello, world 1!", new String(result1));
// System.out.println("event1=" + event1.getTimeMillis());
final LogEvent event2 = Log4jLogEvent.newBuilder() //
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger") //
.setLevel(Level.INFO) //
.setMessage(new SimpleMessage("Hello, world 2!")).build();
final byte[] result2 = layout.toByteArray(event2);
assertEquals(event2.getTimeMillis() + " Hello, world 2!", new String(result2));
// System.out.println("event2=" + event2.getTimeMillis());
}
@Test
public void testUsePlatformDefaultIfNoCharset() throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%m")
.setConfiguration(ctx.getConfiguration()).build();
assertEquals(Charset.defaultCharset(), layout.getCharset());
}
@Test
public void testUseSpecifiedCharsetIfExists() throws Exception {
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%m")
.setConfiguration(ctx.getConfiguration()).setCharset(StandardCharsets.UTF_8).build();
assertEquals(StandardCharsets.UTF_8, layout.getCharset());
}
@Test
public void testLoggerNameTruncationByRetainingPartsFromEnd() throws Exception {
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%c{1} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result1 = layout.toSerializable(event1);
assertEquals(this.getClass().getName().substring(this.getClass().getName().lastIndexOf(".") + 1) + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%c{2} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result1 = layout.toSerializable(event1);
String name = this.getClass().getName().substring(0, this.getClass().getName().lastIndexOf("."));
name = name.substring(0, name.lastIndexOf("."));
assertEquals(this.getClass().getName().substring(name.length() + 1) + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%c{20} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result1 = layout.toSerializable(event1);
assertEquals(this.getClass().getName() + " Hello, world 1!", new String(result1));
}
}
@Test
public void testCallersFqcnTruncationByRetainingPartsFromEnd() throws Exception {
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%C{1} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByRetainingPartsFromEnd", this.getClass().getCanonicalName() + ".java", 440))
.build();
final String result1 = layout.toSerializable(event1);
assertEquals(this.getClass().getName().substring(this.getClass().getName().lastIndexOf(".") + 1) + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%C{2} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByRetainingPartsFromEnd", this.getClass().getCanonicalName() + ".java", 440))
.build();
final String result1 = layout.toSerializable(event1);
String name = this.getClass().getName().substring(0, this.getClass().getName().lastIndexOf("."));
name = name.substring(0, name.lastIndexOf("."));
assertEquals(this.getClass().getName().substring(name.length() + 1) + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%C{20} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByRetainingPartsFromEnd", this.getClass().getCanonicalName() + ".java", 440))
.build();
final String result1 = layout.toSerializable(event1);
assertEquals(this.getClass().getName() + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%class{1} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByRetainingPartsFromEnd", this.getClass().getCanonicalName() + ".java", 440))
.build();
final String result1 = layout.toSerializable(event1);
assertEquals(this.getClass().getName().substring(this.getClass().getName().lastIndexOf(".") + 1) + " Hello, world 1!", new String(result1));
}
}
@Test
public void testLoggerNameTruncationByDroppingPartsFromFront() throws Exception {
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%c{-1} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result1 = layout.toSerializable(event1);
final String name = this.getClass().getName().substring(this.getClass().getName().indexOf(".") + 1);
assertEquals(name + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%c{-3} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result1 = layout.toSerializable(event1);
String name = this.getClass().getName().substring(this.getClass().getName().indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
assertEquals(name + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%logger{-3} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result1 = layout.toSerializable(event1);
String name = this.getClass().getName().substring(this.getClass().getName().indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
assertEquals(name + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%c{-20} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!")).build();
final String result1 = layout.toSerializable(event1);
assertEquals(this.getClass().getName() + " Hello, world 1!", new String(result1));
}
}
@Test
public void testCallersFqcnTruncationByDroppingPartsFromFront() throws Exception {
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%C{-1} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByDroppingPartsFromFront", this.getClass().getCanonicalName() + ".java", 546))
.build();
final String result1 = layout.toSerializable(event1);
final String name = this.getClass().getName().substring(this.getClass().getName().indexOf(".") + 1);
assertEquals(name + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%C{-3} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByDroppingPartsFromFront", this.getClass().getCanonicalName() + ".java", 546))
.build();
final String result1 = layout.toSerializable(event1);
String name = this.getClass().getName().substring(this.getClass().getName().indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
assertEquals(name + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%class{-3} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByDroppingPartsFromFront", this.getClass().getCanonicalName() + ".java", 546))
.build();
final String result1 = layout.toSerializable(event1);
String name = this.getClass().getName().substring(this.getClass().getName().indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
name = name.substring(name.indexOf(".") + 1);
assertEquals(name + " Hello, world 1!", new String(result1));
}
{
final PatternLayout layout = PatternLayout.newBuilder().setPattern("%C{-20} %m")
.setConfiguration(ctx.getConfiguration()).build();
final LogEvent event1 = Log4jLogEvent.newBuilder()
.setLoggerName(this.getClass().getName()).setLoggerFqcn("org.apache.logging.log4j.core.Logger")
.setLevel(Level.INFO)
.setMessage(new SimpleMessage("Hello, world 1!"))
.setSource(new StackTraceElement(this.getClass().getName(), "testCallersFqcnTruncationByDroppingPartsFromFront", this.getClass().getCanonicalName() + ".java", 546))
.build();
final String result1 = layout.toSerializable(event1);
assertEquals(this.getClass().getName() + " Hello, world 1!", new String(result1));
}
}
}