You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2019/01/17 04:00:46 UTC

[logging-log4j2] branch master updated: LOG4J2-1570 - Logging with a lambda expression with a method call that also logs would cause logs within method call to reference line num and method name of the parent method

This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f1ff29  LOG4J2-1570 - Logging with a lambda expression with a method call that also logs would cause logs within method call to reference line num and method name of the parent method
2f1ff29 is described below

commit 2f1ff291dfe1c859c1baa9ce5a457584b3ad0945
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Wed Jan 16 21:00:25 2019 -0700

    LOG4J2-1570 - Logging with a lambda expression with a method call that also logs would cause logs within method call to reference line num and method name of the parent method
---
 .../apache/logging/log4j/util/StackLocator.java    | 12 ++--
 .../log4j/io/LoggerBufferedInputStream.java        | 19 +++--
 .../logging/log4j/io/LoggerBufferedReader.java     | 26 ++++---
 .../logging/log4j/io/LoggerFilterOutputStream.java | 24 +++----
 .../logging/log4j/io/LoggerFilterWriter.java       | 29 +++-----
 .../apache/logging/log4j/io/LoggerInputStream.java | 22 +++---
 .../logging/log4j/io/LoggerOutputStream.java       | 15 ++--
 .../apache/logging/log4j/io/LoggerPrintStream.java | 77 ++++++++++----------
 .../apache/logging/log4j/io/LoggerPrintWriter.java | 82 ++++++++++++----------
 .../org/apache/logging/log4j/io/LoggerReader.java  | 30 +++-----
 .../org/apache/logging/log4j/io/LoggerWriter.java  | 21 +++---
 .../InternalBufferedInputStream.java}              | 27 +++----
 .../InternalBufferedReader.java}                   | 30 ++++----
 .../InternalFilterOutputStream.java}               | 21 +++---
 .../InternalFilterWriter.java}                     | 19 +++--
 .../InternalInputStream.java}                      | 18 ++---
 .../InternalLoggerReader.java}                     | 18 ++---
 .../InternalOutputStream.java}                     | 19 +++--
 .../InternalPrintStream.java}                      | 38 +++++-----
 .../InternalPrintWriter.java}                      | 48 +++++--------
 .../InternalReader.java}                           | 18 ++---
 .../InternalWriter.java}                           | 16 ++---
 .../logging/log4j/io/internal/package-info.java    | 20 ++++++
 pom.xml                                            |  2 +-
 src/changes/changes.xml                            |  3 +
 25 files changed, 319 insertions(+), 335 deletions(-)

diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
index 4eba44b..dae9bd9 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
@@ -170,13 +170,17 @@ public final class StackLocator {
         }
         // LOG4J2-1029 new Throwable().getStackTrace is faster than Thread.currentThread().getStackTrace().
         final StackTraceElement[] stackTrace = new Throwable().getStackTrace();
-        StackTraceElement last = null;
-        for (int i = stackTrace.length - 1; i > 0; i--) {
+        boolean found = false;
+        for (int i = 0; i < stackTrace.length; i++) {
             final String className = stackTrace[i].getClassName();
             if (fqcnOfLogger.equals(className)) {
-                return last;
+
+                found = true;
+                continue;
+            }
+            if (found) {
+                return stackTrace[i];
             }
-            last = stackTrace[i];
         }
         return null;
     }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedInputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedInputStream.java
index 54d9796..6122b20 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedInputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedInputStream.java
@@ -24,6 +24,8 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalBufferedInputStream;
+import org.apache.logging.log4j.io.internal.InternalInputStream;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -32,40 +34,43 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
  */
 public class LoggerBufferedInputStream extends BufferedInputStream {
     private static final String FQCN = LoggerBufferedInputStream.class.getName();
+    private final InternalBufferedInputStream stream;
 
     protected LoggerBufferedInputStream(final InputStream in, final Charset charset, final ExtendedLogger logger,
                                         final String fqcn, final Level level, final Marker marker) {
-        super(new LoggerInputStream(in, charset, logger, fqcn == null ? FQCN : fqcn, level, marker));
+        super(in);
+        stream = new InternalBufferedInputStream(in, charset, logger, fqcn == null ? FQCN: fqcn, level, marker);
     }
 
     protected LoggerBufferedInputStream(final InputStream in, final Charset charset, final int size,
                                         final ExtendedLogger logger, final String fqcn, final Level level,
                                         final Marker marker) {
-        super(new LoggerInputStream(in, charset, logger, fqcn == null ? FQCN : fqcn, level, marker), size);
+        super(in);
+        stream = new InternalBufferedInputStream(in, charset, size, logger, fqcn == null ? FQCN: fqcn, level, marker);
     }
 
     @Override
     public void close() throws IOException {
-        super.close();
+        stream.close();
     }
     
     @Override
     public synchronized int read() throws IOException {
-        return super.read();
+        return stream.read();
     }
     
     @Override
     public int read(final byte[] b) throws IOException {
-        return super.read(b, 0, b.length);
+        return stream.read(b);
     }
     
     @Override
     public synchronized int read(final byte[] b, final int off, final int len) throws IOException {
-        return super.read(b, off, len);
+        return stream.read(b, off, len);
     }
 
     @Override
     public String toString() {
-        return LoggerBufferedInputStream.class.getSimpleName() + "{stream=" + this.in + '}';
+        return LoggerBufferedInputStream.class.getSimpleName() + stream.toString();
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedReader.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedReader.java
index 584e61a..a981ca5 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedReader.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedReader.java
@@ -24,6 +24,7 @@ import java.nio.CharBuffer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalBufferedReader;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -32,50 +33,47 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
  */
 public class LoggerBufferedReader extends BufferedReader {
     private static final String FQCN = LoggerBufferedReader.class.getName();
+    private final InternalBufferedReader reader;
 
     protected LoggerBufferedReader(final Reader reader, final ExtendedLogger logger, final String fqcn,
                                    final Level level, final Marker marker) {
-        super(new LoggerReader(reader, logger, fqcn == null ? FQCN : fqcn, level, marker));
+        super(reader);
+        this.reader = new InternalBufferedReader(reader, logger, fqcn == null ? FQCN: fqcn, level, marker);
     }
 
     protected LoggerBufferedReader(final Reader reader, final int size, final ExtendedLogger logger, final String fqcn,
                                    final Level level, final Marker marker) {
-        super(new LoggerReader(reader, logger, fqcn == null ? FQCN : fqcn, level, marker), size);
+        super(reader);
+        this.reader = new InternalBufferedReader(reader, size, logger, fqcn == null ? FQCN : fqcn, level, marker);
     }
     
     @Override
     public void close() throws IOException {
-        super.close();
+        reader.close();
     }
     
     @Override
     public int read() throws IOException {
-        return super.read();
+        return reader.read();
     }
     
     @Override
     public int read(final char[] cbuf) throws IOException {
-        return super.read(cbuf, 0, cbuf.length);
+        return reader.read(cbuf);
     }
     
     @Override
     public int read(final char[] cbuf, final int off, final int len) throws IOException {
-        return super.read(cbuf, off, len);
+        return reader.read(cbuf, off, len);
     }
     
     @Override
     public int read(final CharBuffer target) throws IOException {
-        final int len = target.remaining();
-        final char[] cbuf = new char[len];
-        final int charsRead = read(cbuf, 0, len);
-        if (charsRead > 0) {
-            target.put(cbuf, 0, charsRead);
-        }
-        return charsRead;
+        return reader.read(target);
     }
     
     @Override
     public String readLine() throws IOException {
-        return super.readLine();
+        return reader.readLine();
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterOutputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterOutputStream.java
index b608502..a103233 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterOutputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterOutputStream.java
@@ -24,6 +24,7 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalFilterOutputStream;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -37,47 +38,42 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
 public class LoggerFilterOutputStream extends FilterOutputStream {
     private static final String FQCN = LoggerFilterOutputStream.class.getName();
 
-    private final ByteStreamLogger logger;
-    private final String fqcn;
+    private final InternalFilterOutputStream logger;
 
     protected LoggerFilterOutputStream(final OutputStream out, final Charset charset, final ExtendedLogger logger,
                                        final String fqcn, final Level level, final Marker marker) {
         super(out);
-        this.logger = new ByteStreamLogger(logger, level, marker, charset);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.logger = new InternalFilterOutputStream(out, charset, logger, fqcn == null ? FQCN : fqcn,
+            level, marker);
     }
 
     @Override
     public void close() throws IOException {
-        this.out.close();
-        this.logger.close(this.fqcn);
+        this.logger.close();
     }
 
     @Override
     public void flush() throws IOException {
-        this.out.flush();
+        this.logger.flush();
     }
 
     @Override
     public String toString() {
-        return LoggerFilterOutputStream.class.getSimpleName() + "{stream=" + this.out + '}';
+        return LoggerFilterOutputStream.class.getSimpleName() + logger.toString();
     }
 
     @Override
     public void write(final byte[] b) throws IOException {
-        this.out.write(b);
-        this.logger.put(this.fqcn, b, 0, b.length);
+        this.logger.write(b);
     }
 
     @Override
     public void write(final byte[] b, final int off, final int len) throws IOException {
-        this.out.write(b, off, len);
-        this.logger.put(this.fqcn, b, off, len);
+        this.logger.write(b, off, len);
     }
 
     @Override
     public void write(final int b) throws IOException {
-        this.out.write(b);
-        this.logger.put(this.fqcn, (byte) (b & 0xFF));
+        this.logger.write(b);
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterWriter.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterWriter.java
index 4b0991f..682e831 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterWriter.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterWriter.java
@@ -23,6 +23,7 @@ import java.io.Writer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalFilterWriter;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -34,59 +35,51 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
 public class LoggerFilterWriter extends FilterWriter {
     private static final String FQCN = LoggerFilterWriter.class.getName();
 
-    private final CharStreamLogger logger;
-    private final String fqcn;
+    private final InternalFilterWriter logger;
 
     protected LoggerFilterWriter(final Writer out, final ExtendedLogger logger, final String fqcn, final Level level,
                                  final Marker marker) {
         super(out);
-        this.logger = new CharStreamLogger(logger, level, marker);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.logger = new InternalFilterWriter(out, logger, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     @Override
     public void close() throws IOException {
-        this.out.close();
-        this.logger.close(this.fqcn);
+        this.logger.close();
     }
 
     @Override
     public void flush() throws IOException {
-        this.out.flush();
+        this.logger.flush();
     }
 
     @Override
     public String toString() {
-        return LoggerFilterWriter.class.getSimpleName() + "{writer=" + this.out + '}';
+        return LoggerFilterWriter.class.getSimpleName() + logger.toString();
     }
 
     @Override
     public void write(final char[] cbuf) throws IOException {
-        this.out.write(cbuf);
-        this.logger.put(this.fqcn, cbuf, 0, cbuf.length);
+        this.logger.write(cbuf);
     }
 
     @Override
     public void write(final char[] cbuf, final int off, final int len) throws IOException {
-        this.out.write(cbuf, off, len);
-        this.logger.put(this.fqcn, cbuf, off, len);
+        this.logger.write(cbuf, off, len);
     }
 
     @Override
     public void write(final int c) throws IOException {
-        this.out.write(c);
-        this.logger.put(this.fqcn, (char) c);
+        this.logger.write(c);
     }
 
     @Override
     public void write(final String str) throws IOException {
-        this.out.write(str);
-        this.logger.put(this.fqcn, str, 0, str.length());
+        this.logger.write(str);
     }
 
     @Override
     public void write(final String str, final int off, final int len) throws IOException {
-        this.out.write(str, off, len);
-        this.logger.put(this.fqcn, str, off, len);
+        this.logger.write(str, off, len);
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerInputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerInputStream.java
index 5366f19..8da122b 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerInputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerInputStream.java
@@ -24,6 +24,7 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalInputStream;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -34,43 +35,36 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
 public class LoggerInputStream extends FilterInputStream {
     private static final String FQCN = LoggerInputStream.class.getName();
 
-    private final String fqcn;
-    private final ByteStreamLogger logger;
+    private final InternalInputStream logger;
 
     protected LoggerInputStream(final InputStream in, final Charset charset, final ExtendedLogger logger,
                                 final String fqcn, final Level level, final Marker marker) {
         super(in);
-        this.logger = new ByteStreamLogger(logger, level, marker, charset);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.logger = new InternalInputStream(in, charset, logger, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     @Override
     public void close() throws IOException {
-        this.logger.close(this.fqcn);
-        super.close();
+        this.logger.close();
     }
 
     @Override
     public int read() throws IOException {
-        final int b = super.read();
-        this.logger.put(this.fqcn, b);
-        return b;
+        return logger.read();
     }
 
     @Override
     public int read(final byte[] b) throws IOException {
-        return read(b, 0, b.length);
+        return logger.read(b);
     }
 
     @Override
     public int read(final byte[] b, final int off, final int len) throws IOException {
-        final int bytesRead = super.read(b, off, len);
-        this.logger.put(this.fqcn, b, off, bytesRead);
-        return bytesRead;
+        return logger.read(b, off, len);
     }
 
     @Override
     public String toString() {
-        return LoggerInputStream.class.getSimpleName() + "{stream=" + this.in + '}';
+        return LoggerInputStream.class.getSimpleName() + logger.toString();
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerOutputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerOutputStream.java
index b8ea392..e1bd658 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerOutputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerOutputStream.java
@@ -23,6 +23,7 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalOutputStream;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -36,18 +37,16 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
 public class LoggerOutputStream extends OutputStream {
     private static final String FQCN = LoggerOutputStream.class.getName();
 
-    private final ByteStreamLogger logger;
-    private final String fqcn;
+    private final InternalOutputStream logger;
 
     protected LoggerOutputStream(final ExtendedLogger logger, final Level level, final Marker marker,
                                  final Charset charset, final String fqcn) {
-        this.logger = new ByteStreamLogger(logger, level, marker, charset);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.logger = new InternalOutputStream(logger, level, marker, charset, fqcn == null ? FQCN : fqcn);
     }
 
     @Override
     public void close() throws IOException {
-        this.logger.close(this.fqcn);
+        this.logger.close();
     }
 
     @Override
@@ -57,16 +56,16 @@ public class LoggerOutputStream extends OutputStream {
 
     @Override
     public void write(final byte[] b) throws IOException {
-        this.logger.put(this.fqcn, b, 0, b.length);
+        logger.write(b);
     }
 
     @Override
     public void write(final byte[] b, final int off, final int len) throws IOException {
-        this.logger.put(this.fqcn, b, off, len);
+        logger.write(b, off, len);
     }
 
     @Override
     public void write(final int b) throws IOException {
-        this.logger.put(this.fqcn, (byte) (b & 0xFF));
+        logger.write(b);
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintStream.java
index 30bac34..0489119 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintStream.java
@@ -17,6 +17,7 @@
 
 package org.apache.logging.log4j.io;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintStream;
@@ -26,6 +27,7 @@ import java.util.Locale;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalPrintStream;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -38,19 +40,20 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
  */
 public class LoggerPrintStream extends PrintStream {
     private static final String FQCN = LoggerPrintStream.class.getName();
+    private final InternalPrintStream psLogger;
 
     protected LoggerPrintStream(final ExtendedLogger logger, final boolean autoFlush, final Charset charset,
                                 final String fqcn, final Level level, final Marker marker)
         throws UnsupportedEncodingException {
-        super(new LoggerOutputStream(logger, level, marker, ensureNonNull(charset), fqcn == null ? FQCN : fqcn),
-            autoFlush, ensureNonNull(charset).name());
+        super(new PrintStream(new ByteArrayOutputStream()));
+        psLogger = new InternalPrintStream(logger, autoFlush, charset, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     protected LoggerPrintStream(final OutputStream out, final boolean autoFlush, final Charset charset,
                                 final ExtendedLogger logger, final String fqcn, final Level level, final Marker marker)
         throws UnsupportedEncodingException {
-        super(new LoggerFilterOutputStream(out, ensureNonNull(charset), logger, fqcn == null ? FQCN : fqcn, level,
-            marker), autoFlush, ensureNonNull(charset).name());
+        super(new PrintStream(out));
+        psLogger = new InternalPrintStream(out, autoFlush, charset, logger, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     private static Charset ensureNonNull(final Charset charset) {
@@ -59,173 +62,173 @@ public class LoggerPrintStream extends PrintStream {
 
     @Override
     public LoggerPrintStream append(final char c) {
-        super.append(c);
+        psLogger.append(c);
         return this;
     }
 
     @Override
     public LoggerPrintStream append(final CharSequence csq) {
-        super.append(csq);
+        psLogger.append(csq);
         return this;
     }
 
     @Override
     public LoggerPrintStream append(final CharSequence csq, final int start, final int end) {
-        super.append(csq, start, end);
+        psLogger.append(csq, start, end);
         return this;
     }
 
     @Override
     public boolean checkError() {
-        return super.checkError();
+        return psLogger.checkError();
     }
 
     @Override
     public void close() {
-        super.close();
+        psLogger.close();
     }
 
     @Override
     public void flush() {
-        super.flush();
+        psLogger.flush();
     }
 
     @Override
     public LoggerPrintStream format(final Locale l, final String format, final Object... args) {
-        super.format(l, format, args);
+        psLogger.format(l, format, args);
         return this;
     }
 
     @Override
     public LoggerPrintStream format(final String format, final Object... args) {
-        super.format(format, args);
+        psLogger.format(format, args);
         return this;
     }
 
     @Override
     public void print(final boolean b) {
-        super.print(b);
+        psLogger.print(b);
     }
 
     @Override
     public void print(final char c) {
-        super.print(c);
+        psLogger.print(c);
     }
 
     @Override
     public void print(final char[] s) {
-        super.print(s);
+        psLogger.print(s);
     }
 
     @Override
     public void print(final double d) {
-        super.print(d);
+        psLogger.print(d);
     }
 
     @Override
     public void print(final float f) {
-        super.print(f);
+        psLogger.print(f);
     }
 
     @Override
     public void print(final int i) {
-        super.print(i);
+        psLogger.print(i);
     }
 
     @Override
     public void print(final long l) {
-        super.print(l);
+        psLogger.print(l);
     }
 
     @Override
     public void print(final Object obj) {
-        super.print(obj);
+        psLogger.print(obj);
     }
 
     @Override
     public void print(final String s) {
-        super.print(s);
+        psLogger.print(s);
     }
 
     @Override
     public LoggerPrintStream printf(final Locale l, final String format, final Object... args) {
-        super.printf(l, format, args);
+        psLogger.printf(l, format, args);
         return this;
     }
 
     @Override
     public LoggerPrintStream printf(final String format, final Object... args) {
-        super.printf(format, args);
+        psLogger.printf(format, args);
         return this;
     }
 
     @Override
     public void println() {
-        super.println();
+        psLogger.println();
     }
 
     @Override
     public void println(final boolean x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final char x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final char[] x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final double x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final float x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final int x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final long x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final Object x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public void println(final String x) {
-        super.println(x);
+        psLogger.println(x);
     }
 
     @Override
     public String toString() {
-        return LoggerPrintStream.class.getSimpleName() + "{stream=" + this.out + '}';
+        return LoggerPrintStream.class.getSimpleName() + psLogger.toString();
     }
 
     @Override
     public void write(final byte[] b) throws IOException {
-        super.write(b);
+        psLogger.write(b);
     }
 
     @Override
     public void write(final byte[] b, final int off, final int len) {
-        super.write(b, off, len);
+        psLogger.write(b, off, len);
     }
 
     @Override
     public void write(final int b) {
-        super.write(b);
+        psLogger.write(b);
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintWriter.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintWriter.java
index ab7977c..d63ab3b 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintWriter.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintWriter.java
@@ -17,12 +17,15 @@
 
 package org.apache.logging.log4j.io;
 
+import java.io.IOException;
 import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.io.Writer;
 import java.util.Locale;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalPrintWriter;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -41,200 +44,203 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
  * @since 2.1
  */
 // TODO
-// All method implementations that call only super are apparently required for the unit tests to pass.
+// All method implementations that call only writer.are apparently required for the unit tests to pass.
 // Not sure if this a bug in the tests or a feature.
 public class LoggerPrintWriter extends PrintWriter {
     private static final String FQCN = LoggerPrintWriter.class.getName();
+    private final InternalPrintWriter writer;
 
     protected LoggerPrintWriter(final ExtendedLogger logger, final boolean autoFlush, final String fqcn,
                                 final Level level, final Marker marker) {
-        super(new LoggerWriter(logger, fqcn == null ? FQCN : fqcn, level, marker), autoFlush);
+        super(new StringWriter());
+        writer = new InternalPrintWriter(logger, autoFlush, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     protected LoggerPrintWriter(final Writer writer, final boolean autoFlush, final ExtendedLogger logger,
                                 final String fqcn, final Level level, final Marker marker) {
-        super(new LoggerFilterWriter(writer, logger, fqcn == null ? FQCN : fqcn, level, marker), autoFlush);
+        super(writer);
+        this.writer = new InternalPrintWriter(writer, autoFlush, logger, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     @Override
     public LoggerPrintWriter append(final char c) {
-        super.append(c);
+        writer.append(c);
         return this;
     }
 
     @Override
     public LoggerPrintWriter append(final CharSequence csq) {
-        super.append(csq);
+        writer.append(csq);
         return this;
     }
 
     @Override
     public LoggerPrintWriter append(final CharSequence csq, final int start, final int end) {
-        super.append(csq, start, end);
+        writer.append(csq, start, end);
         return this;
     }
 
     @Override
     public boolean checkError() {
-        return super.checkError();
+        return writer.checkError();
     }
 
     @Override
     public void close() {
-        super.close();
+        writer.close();
     }
 
     @Override
     public void flush() {
-        super.flush();
+        writer.flush();
     }
 
     @Override
     public LoggerPrintWriter format(final Locale l, final String format, final Object... args) {
-        super.format(l, format, args);
+        writer.format(l, format, args);
         return this;
     }
 
     @Override
     public LoggerPrintWriter format(final String format, final Object... args) {
-        super.format(format, args);
+        writer.format(format, args);
         return this;
     }
 
     @Override
     public void print(final boolean b) {
-        super.print(b);
+        writer.print(b);
     }
 
     @Override
     public void print(final char c) {
-        super.print(c);
+        writer.print(c);
     }
 
     @Override
     public void print(final char[] s) {
-        super.print(s);
+        writer.print(s);
     }
 
     @Override
     public void print(final double d) {
-        super.print(d);
+        writer.print(d);
     }
 
     @Override
     public void print(final float f) {
-        super.print(f);
+        writer.print(f);
     }
 
     @Override
     public void print(final int i) {
-        super.print(i);
+        writer.print(i);
     }
 
     @Override
     public void print(final long l) {
-        super.print(l);
+        writer.print(l);
     }
 
     @Override
     public void print(final Object obj) {
-        super.print(obj);
+        writer.print(obj);
     }
 
     @Override
     public void print(final String s) {
-        super.print(s);
+        writer.print(s);
     }
 
     @Override
     public LoggerPrintWriter printf(final Locale l, final String format, final Object... args) {
-        super.printf(l, format, args);
+        writer.printf(l, format, args);
         return this;
     }
 
     @Override
     public LoggerPrintWriter printf(final String format, final Object... args) {
-        super.printf(format, args);
+        writer.printf(format, args);
         return this;
     }
 
     @Override
     public void println() {
-        super.println();
+        writer.println();
     }
 
     @Override
     public void println(final boolean x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final char x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final char[] x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final double x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final float x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final int x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final long x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final Object x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public void println(final String x) {
-        super.println(x);
+        writer.println(x);
     }
 
     @Override
     public String toString() {
-        return LoggerPrintWriter.class.getSimpleName() + "{stream=" + this.out + '}';
+        return LoggerPrintWriter.class.getSimpleName() + writer.toString();
     }
 
     @Override
     public void write(final char[] buf) {
-        super.write(buf);
+        writer.write(buf);
     }
 
     @Override
     public void write(final char[] buf, final int off, final int len) {
-        super.write(buf, off, len);
+        writer.write(buf, off, len);
     }
 
     @Override
     public void write(final int c) {
-        super.write(c);
+        writer.write(c);
     }
 
     @Override
     public void write(final String s) {
-        super.write(s);
+        writer.write(s);
     }
 
     @Override
     public void write(final String s, final int off, final int len) {
-        super.write(s, off, len);
+        writer.write(s, off, len);
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java
index 265e8e7..01834ce 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java
@@ -24,6 +24,7 @@ import java.nio.CharBuffer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalReader;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -34,54 +35,41 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
 public class LoggerReader extends FilterReader {
     private static final String FQCN = LoggerReader.class.getName();
 
-    private final CharStreamLogger logger;
-    private final String fqcn;
+    private final InternalReader reader;
 
     protected LoggerReader(final Reader reader, final ExtendedLogger logger, final String fqcn, final Level level,
                            final Marker marker) {
         super(reader);
-        this.logger = new CharStreamLogger(logger, level, marker);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.reader = new InternalReader(reader, logger, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     @Override
     public void close() throws IOException {
-        super.close();
-        this.logger.close(this.fqcn);
+        reader.close();
     }
 
     @Override
     public int read() throws IOException {
-        final int c = super.read();
-        this.logger.put(this.fqcn, c);
-        return c;
+        return reader.read();
     }
 
     @Override
     public int read(final char[] cbuf) throws IOException {
-        return read(cbuf, 0, cbuf.length);
+        return reader.read(cbuf);
     }
 
     @Override
     public int read(final char[] cbuf, final int off, final int len) throws IOException {
-        final int charsRead = super.read(cbuf, off, len);
-        this.logger.put(this.fqcn, cbuf, off, charsRead);
-        return charsRead;
+        return reader.read(cbuf, off, len);
     }
 
     @Override
     public int read(final CharBuffer target) throws IOException {
-        final int len = target.remaining();
-        final char[] cbuf = new char[len];
-        final int charsRead = read(cbuf, 0, len);
-        if (charsRead > 0) {
-            target.put(cbuf, 0, charsRead);
-        }
-        return charsRead;
+        return reader.read(target);
     }
 
     @Override
     public String toString() {
-        return LoggerReader.class.getSimpleName() + "{stream=" + this.in + '}';
+        return LoggerReader.class.getSimpleName() + this.reader.toString();
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerWriter.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerWriter.java
index 8fba24c..29d61fa 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerWriter.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerWriter.java
@@ -22,6 +22,7 @@ import java.io.Writer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.internal.InternalWriter;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
@@ -33,17 +34,15 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
 public class LoggerWriter extends Writer {
     private static final String FQCN = LoggerWriter.class.getName();
 
-    private final CharStreamLogger logger;
-    private final String fqcn;
+    private final InternalWriter writer;
 
     protected LoggerWriter(final ExtendedLogger logger, final String fqcn, final Level level, final Marker marker) {
-        this.logger = new CharStreamLogger(logger, level, marker);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.writer = new InternalWriter(logger, fqcn == null ? FQCN : fqcn, level, marker);
     }
 
     @Override
     public void close() throws IOException {
-        this.logger.close(this.fqcn);
+        writer.close();
     }
 
     @Override
@@ -53,31 +52,31 @@ public class LoggerWriter extends Writer {
 
     @Override
     public String toString() {
-        return this.getClass().getSimpleName() + "[fqcn=" + this.fqcn + ", logger=" + this.logger + "]";
+        return this.getClass().getSimpleName() + "[fqcn=" + writer.toString();
     }
 
     @Override
     public void write(final char[] cbuf) throws IOException {
-        this.logger.put(this.fqcn, cbuf, 0, cbuf.length);
+        writer.write(cbuf);
     }
 
     @Override
     public void write(final char[] cbuf, final int off, final int len) throws IOException {
-        this.logger.put(this.fqcn, cbuf, off, len);
+        writer.write(cbuf, off, len);
     }
 
     @Override
     public void write(final int c) throws IOException {
-        this.logger.put(this.fqcn, (char) c);
+        writer.write(c);
     }
 
     @Override
     public void write(final String str) throws IOException {
-        this.logger.put(this.fqcn, str, 0, str.length());
+        writer.write(str);
     }
 
     @Override
     public void write(final String str, final int off, final int len) throws IOException {
-        this.logger.put(this.fqcn, str, off, len);
+        writer.write(str, off, len);
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedInputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalBufferedInputStream.java
similarity index 69%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedInputStream.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalBufferedInputStream.java
index 54d9796..9f04ed3 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedInputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalBufferedInputStream.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.BufferedInputStream;
 import java.io.IOException;
@@ -24,41 +24,42 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.LoggerInputStream;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * 
- * @since 2.1
+ * Internal class that exists primiarly to allow location calculations to work.
+ * @since 2.12
  */
-public class LoggerBufferedInputStream extends BufferedInputStream {
-    private static final String FQCN = LoggerBufferedInputStream.class.getName();
+public class InternalBufferedInputStream extends BufferedInputStream {
+    private static final String FQCN = InternalBufferedInputStream.class.getName();
 
-    protected LoggerBufferedInputStream(final InputStream in, final Charset charset, final ExtendedLogger logger,
+    public InternalBufferedInputStream(final InputStream in, final Charset charset, final ExtendedLogger logger,
                                         final String fqcn, final Level level, final Marker marker) {
-        super(new LoggerInputStream(in, charset, logger, fqcn == null ? FQCN : fqcn, level, marker));
+        super(new InternalInputStream(in, charset, logger, fqcn == null ? FQCN : fqcn, level, marker));
     }
 
-    protected LoggerBufferedInputStream(final InputStream in, final Charset charset, final int size,
+    public InternalBufferedInputStream(final InputStream in, final Charset charset, final int size,
                                         final ExtendedLogger logger, final String fqcn, final Level level,
                                         final Marker marker) {
-        super(new LoggerInputStream(in, charset, logger, fqcn == null ? FQCN : fqcn, level, marker), size);
+        super(new InternalInputStream(in, charset, logger, fqcn == null ? FQCN : fqcn, level, marker), size);
     }
 
     @Override
     public void close() throws IOException {
         super.close();
     }
-    
+
     @Override
     public synchronized int read() throws IOException {
         return super.read();
     }
-    
+
     @Override
     public int read(final byte[] b) throws IOException {
         return super.read(b, 0, b.length);
     }
-    
+
     @Override
     public synchronized int read(final byte[] b, final int off, final int len) throws IOException {
         return super.read(b, off, len);
@@ -66,6 +67,6 @@ public class LoggerBufferedInputStream extends BufferedInputStream {
 
     @Override
     public String toString() {
-        return LoggerBufferedInputStream.class.getSimpleName() + "{stream=" + this.in + '}';
+        return "{stream=" + this.in + '}';
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedReader.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalBufferedReader.java
similarity index 74%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedReader.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalBufferedReader.java
index 584e61a..90452a4 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerBufferedReader.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalBufferedReader.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -27,42 +27,42 @@ import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * 
- * @since 2.1
+ * Internal class that exists primiarly to allow location calculations to work.
+ * @since 2.12
  */
-public class LoggerBufferedReader extends BufferedReader {
-    private static final String FQCN = LoggerBufferedReader.class.getName();
+public class InternalBufferedReader extends BufferedReader {
+    private static final String FQCN = InternalBufferedReader.class.getName();
 
-    protected LoggerBufferedReader(final Reader reader, final ExtendedLogger logger, final String fqcn,
+    public InternalBufferedReader(final Reader reader, final ExtendedLogger logger, final String fqcn,
                                    final Level level, final Marker marker) {
-        super(new LoggerReader(reader, logger, fqcn == null ? FQCN : fqcn, level, marker));
+        super(new InternalLoggerReader(reader, logger, fqcn == null ? FQCN : fqcn, level, marker));
     }
 
-    protected LoggerBufferedReader(final Reader reader, final int size, final ExtendedLogger logger, final String fqcn,
+    public InternalBufferedReader(final Reader reader, final int size, final ExtendedLogger logger, final String fqcn,
                                    final Level level, final Marker marker) {
-        super(new LoggerReader(reader, logger, fqcn == null ? FQCN : fqcn, level, marker), size);
+        super(new InternalLoggerReader(reader, logger, fqcn == null ? FQCN : fqcn, level, marker), size);
     }
-    
+
     @Override
     public void close() throws IOException {
         super.close();
     }
-    
+
     @Override
     public int read() throws IOException {
         return super.read();
     }
-    
+
     @Override
     public int read(final char[] cbuf) throws IOException {
         return super.read(cbuf, 0, cbuf.length);
     }
-    
+
     @Override
     public int read(final char[] cbuf, final int off, final int len) throws IOException {
         return super.read(cbuf, off, len);
     }
-    
+
     @Override
     public int read(final CharBuffer target) throws IOException {
         final int len = target.remaining();
@@ -73,7 +73,7 @@ public class LoggerBufferedReader extends BufferedReader {
         }
         return charsRead;
     }
-    
+
     @Override
     public String readLine() throws IOException {
         return super.readLine();
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterOutputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalFilterOutputStream.java
similarity index 71%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterOutputStream.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalFilterOutputStream.java
index b608502..a726818 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterOutputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalFilterOutputStream.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.FilterOutputStream;
 import java.io.IOException;
@@ -24,27 +24,24 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.ByteStreamLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
- * that follows the {@link java.io.OutputStream} methods in spirit, but doesn't require output to any external stream.
- * This class should <em>not</em> be used as a stream for an underlying logger unless it's being used as a bridge.
- * Otherwise, infinite loops may occur!
- * 
- * @since 2.1
+ * Internal class that exists primiarly to allow location calculations to work.
+ *
+ * @since 2.12
  */
-public class LoggerFilterOutputStream extends FilterOutputStream {
-    private static final String FQCN = LoggerFilterOutputStream.class.getName();
+public class InternalFilterOutputStream extends FilterOutputStream {
 
     private final ByteStreamLogger logger;
     private final String fqcn;
 
-    protected LoggerFilterOutputStream(final OutputStream out, final Charset charset, final ExtendedLogger logger,
+    public InternalFilterOutputStream(final OutputStream out, final Charset charset, final ExtendedLogger logger,
                                        final String fqcn, final Level level, final Marker marker) {
         super(out);
         this.logger = new ByteStreamLogger(logger, level, marker, charset);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.fqcn = fqcn;
     }
 
     @Override
@@ -60,7 +57,7 @@ public class LoggerFilterOutputStream extends FilterOutputStream {
 
     @Override
     public String toString() {
-        return LoggerFilterOutputStream.class.getSimpleName() + "{stream=" + this.out + '}';
+        return "{stream=" + this.out + '}';
     }
 
     @Override
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterWriter.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalFilterWriter.java
similarity index 78%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterWriter.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalFilterWriter.java
index 4b0991f..67c4859 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerFilterWriter.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalFilterWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.FilterWriter;
 import java.io.IOException;
@@ -23,25 +23,24 @@ import java.io.Writer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.CharStreamLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
- * that follows the {@link java.io.Writer} methods in spirit, but doesn't require output to any external out.
- * 
- * @since 2.1
+ * Internal class that exists primarily to allow location calculation to work.
+ *
+ * @since 2.12
  */
-public class LoggerFilterWriter extends FilterWriter {
-    private static final String FQCN = LoggerFilterWriter.class.getName();
+public class InternalFilterWriter extends FilterWriter {
 
     private final CharStreamLogger logger;
     private final String fqcn;
 
-    protected LoggerFilterWriter(final Writer out, final ExtendedLogger logger, final String fqcn, final Level level,
+    public InternalFilterWriter(final Writer out, final ExtendedLogger logger, final String fqcn, final Level level,
                                  final Marker marker) {
         super(out);
         this.logger = new CharStreamLogger(logger, level, marker);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.fqcn = fqcn;
     }
 
     @Override
@@ -57,7 +56,7 @@ public class LoggerFilterWriter extends FilterWriter {
 
     @Override
     public String toString() {
-        return LoggerFilterWriter.class.getSimpleName() + "{writer=" + this.out + '}';
+        return "{writer=" + this.out + '}';
     }
 
     @Override
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerInputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalInputStream.java
similarity index 79%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerInputStream.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalInputStream.java
index 5366f19..160766a 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerInputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalInputStream.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.FilterInputStream;
 import java.io.IOException;
@@ -24,24 +24,24 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.ByteStreamLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line read to a pre-defined level. Can also be configured with a Marker.
- * 
- * @since 2.1
+ * Internal class that exists primarily to allow location calculation to work.
+ *
+ * @since 2.12
  */
-public class LoggerInputStream extends FilterInputStream {
-    private static final String FQCN = LoggerInputStream.class.getName();
+public class InternalInputStream extends FilterInputStream {
 
     private final String fqcn;
     private final ByteStreamLogger logger;
 
-    protected LoggerInputStream(final InputStream in, final Charset charset, final ExtendedLogger logger,
+    public InternalInputStream(final InputStream in, final Charset charset, final ExtendedLogger logger,
                                 final String fqcn, final Level level, final Marker marker) {
         super(in);
         this.logger = new ByteStreamLogger(logger, level, marker, charset);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.fqcn = fqcn;
     }
 
     @Override
@@ -71,6 +71,6 @@ public class LoggerInputStream extends FilterInputStream {
 
     @Override
     public String toString() {
-        return LoggerInputStream.class.getSimpleName() + "{stream=" + this.in + '}';
+        return "{stream=" + this.in + '}';
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalLoggerReader.java
similarity index 82%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalLoggerReader.java
index 265e8e7..86914ed 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalLoggerReader.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.FilterReader;
 import java.io.IOException;
@@ -24,24 +24,24 @@ import java.nio.CharBuffer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.CharStreamLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line read to a pre-defined level. Can also be configured with a Marker.
- * 
- * @since 2.1
+ * Internal class that exists primarily to allow location calculation to work.
+ *
+ * @since 2.12
  */
-public class LoggerReader extends FilterReader {
-    private static final String FQCN = LoggerReader.class.getName();
+public class InternalLoggerReader extends FilterReader {
 
     private final CharStreamLogger logger;
     private final String fqcn;
 
-    protected LoggerReader(final Reader reader, final ExtendedLogger logger, final String fqcn, final Level level,
+    public InternalLoggerReader(final Reader reader, final ExtendedLogger logger, final String fqcn, final Level level,
                            final Marker marker) {
         super(reader);
         this.logger = new CharStreamLogger(logger, level, marker);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.fqcn = fqcn;
     }
 
     @Override
@@ -82,6 +82,6 @@ public class LoggerReader extends FilterReader {
 
     @Override
     public String toString() {
-        return LoggerReader.class.getSimpleName() + "{stream=" + this.in + '}';
+        return "{stream=" + this.in + '}';
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerOutputStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalOutputStream.java
similarity index 72%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerOutputStream.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalOutputStream.java
index b8ea392..595a01c 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerOutputStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalOutputStream.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -23,26 +23,23 @@ import java.nio.charset.Charset;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.ByteStreamLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
- * that follows the {@link java.io.OutputStream} methods in spirit, but doesn't require output to any external stream.
- * This class should <em>not</em> be used as a stream for an underlying logger unless it's being used as a bridge.
- * Otherwise, infinite loops may occur!
- * 
- * @since 2.1
+ * Internal class that exists primarily to allow location calculation to work.
+ *
+ * @since 2.12
  */
-public class LoggerOutputStream extends OutputStream {
-    private static final String FQCN = LoggerOutputStream.class.getName();
+public class InternalOutputStream extends OutputStream {
 
     private final ByteStreamLogger logger;
     private final String fqcn;
 
-    protected LoggerOutputStream(final ExtendedLogger logger, final Level level, final Marker marker,
+    public InternalOutputStream(final ExtendedLogger logger, final Level level, final Marker marker,
                                  final Charset charset, final String fqcn) {
         this.logger = new ByteStreamLogger(logger, level, marker, charset);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.fqcn = fqcn;
     }
 
     @Override
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintStream.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalPrintStream.java
similarity index 72%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintStream.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalPrintStream.java
index 30bac34..529d4b6 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintStream.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalPrintStream.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -29,27 +29,23 @@ import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
- * that follows the {@link java.io.PrintStream} methods in spirit, but doesn't require output to any external stream.
- * This class should <em>not</em> be used as a stream for an underlying logger unless it's being used as a bridge.
- * Otherwise, infinite loops may occur!
- * 
- * @since 2.1
+ * Internal class used primarily to allow location calculations to work properly.
+ *
+ * @since 2.12
  */
-public class LoggerPrintStream extends PrintStream {
-    private static final String FQCN = LoggerPrintStream.class.getName();
+public class InternalPrintStream extends PrintStream {
 
-    protected LoggerPrintStream(final ExtendedLogger logger, final boolean autoFlush, final Charset charset,
+    public InternalPrintStream(final ExtendedLogger logger, final boolean autoFlush, final Charset charset,
                                 final String fqcn, final Level level, final Marker marker)
         throws UnsupportedEncodingException {
-        super(new LoggerOutputStream(logger, level, marker, ensureNonNull(charset), fqcn == null ? FQCN : fqcn),
+        super(new InternalOutputStream(logger, level, marker, ensureNonNull(charset), fqcn),
             autoFlush, ensureNonNull(charset).name());
     }
 
-    protected LoggerPrintStream(final OutputStream out, final boolean autoFlush, final Charset charset,
+    public InternalPrintStream(final OutputStream out, final boolean autoFlush, final Charset charset,
                                 final ExtendedLogger logger, final String fqcn, final Level level, final Marker marker)
         throws UnsupportedEncodingException {
-        super(new LoggerFilterOutputStream(out, ensureNonNull(charset), logger, fqcn == null ? FQCN : fqcn, level,
+        super(new InternalFilterOutputStream(out, ensureNonNull(charset), logger, fqcn, level,
             marker), autoFlush, ensureNonNull(charset).name());
     }
 
@@ -58,19 +54,19 @@ public class LoggerPrintStream extends PrintStream {
     }
 
     @Override
-    public LoggerPrintStream append(final char c) {
+    public InternalPrintStream append(final char c) {
         super.append(c);
         return this;
     }
 
     @Override
-    public LoggerPrintStream append(final CharSequence csq) {
+    public InternalPrintStream append(final CharSequence csq) {
         super.append(csq);
         return this;
     }
 
     @Override
-    public LoggerPrintStream append(final CharSequence csq, final int start, final int end) {
+    public InternalPrintStream append(final CharSequence csq, final int start, final int end) {
         super.append(csq, start, end);
         return this;
     }
@@ -91,13 +87,13 @@ public class LoggerPrintStream extends PrintStream {
     }
 
     @Override
-    public LoggerPrintStream format(final Locale l, final String format, final Object... args) {
+    public InternalPrintStream format(final Locale l, final String format, final Object... args) {
         super.format(l, format, args);
         return this;
     }
 
     @Override
-    public LoggerPrintStream format(final String format, final Object... args) {
+    public InternalPrintStream format(final String format, final Object... args) {
         super.format(format, args);
         return this;
     }
@@ -148,13 +144,13 @@ public class LoggerPrintStream extends PrintStream {
     }
 
     @Override
-    public LoggerPrintStream printf(final Locale l, final String format, final Object... args) {
+    public InternalPrintStream printf(final Locale l, final String format, final Object... args) {
         super.printf(l, format, args);
         return this;
     }
 
     @Override
-    public LoggerPrintStream printf(final String format, final Object... args) {
+    public InternalPrintStream printf(final String format, final Object... args) {
         super.printf(format, args);
         return this;
     }
@@ -211,7 +207,7 @@ public class LoggerPrintStream extends PrintStream {
 
     @Override
     public String toString() {
-        return LoggerPrintStream.class.getSimpleName() + "{stream=" + this.out + '}';
+        return "{stream=" + this.out + '}';
     }
 
     @Override
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintWriter.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalPrintWriter.java
similarity index 68%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintWriter.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalPrintWriter.java
index ab7977c..f8f8c92 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerPrintWriter.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalPrintWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.PrintWriter;
 import java.io.Writer;
@@ -23,53 +23,41 @@ import java.util.Locale;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.LoggerFilterWriter;
+import org.apache.logging.log4j.io.LoggerWriter;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
- * that follows the {@link java.io.PrintWriter} methods in spirit, but doesn't require output to any external writer.
- * <p>
- * Integration with JDBC logging can be as simple as:
- * </p>
- * <pre>
- *     PrintWriter pw = IoBuilder.forLogger().setLevel(Level.DEBUG).buildPrintWriter();
- *     DriverManager.setLogWriter(pw);
- *     DataSource ds = ...
- *     ds.setLogWriter(pw);
- * </pre>
+ * Internal class that exists primiarly to allow location calculations to work.
  *
- * @since 2.1
+ * @since 2.12
  */
-// TODO
-// All method implementations that call only super are apparently required for the unit tests to pass.
-// Not sure if this a bug in the tests or a feature.
-public class LoggerPrintWriter extends PrintWriter {
-    private static final String FQCN = LoggerPrintWriter.class.getName();
+public class InternalPrintWriter extends PrintWriter {
 
-    protected LoggerPrintWriter(final ExtendedLogger logger, final boolean autoFlush, final String fqcn,
+    public InternalPrintWriter(final ExtendedLogger logger, final boolean autoFlush, final String fqcn,
                                 final Level level, final Marker marker) {
-        super(new LoggerWriter(logger, fqcn == null ? FQCN : fqcn, level, marker), autoFlush);
+        super(new InternalWriter(logger, fqcn, level, marker), autoFlush);
     }
 
-    protected LoggerPrintWriter(final Writer writer, final boolean autoFlush, final ExtendedLogger logger,
+    public InternalPrintWriter(final Writer writer, final boolean autoFlush, final ExtendedLogger logger,
                                 final String fqcn, final Level level, final Marker marker) {
-        super(new LoggerFilterWriter(writer, logger, fqcn == null ? FQCN : fqcn, level, marker), autoFlush);
+        super(new InternalFilterWriter(writer, logger, fqcn, level, marker), autoFlush);
     }
 
     @Override
-    public LoggerPrintWriter append(final char c) {
+    public InternalPrintWriter append(final char c) {
         super.append(c);
         return this;
     }
 
     @Override
-    public LoggerPrintWriter append(final CharSequence csq) {
+    public InternalPrintWriter append(final CharSequence csq) {
         super.append(csq);
         return this;
     }
 
     @Override
-    public LoggerPrintWriter append(final CharSequence csq, final int start, final int end) {
+    public InternalPrintWriter append(final CharSequence csq, final int start, final int end) {
         super.append(csq, start, end);
         return this;
     }
@@ -90,13 +78,13 @@ public class LoggerPrintWriter extends PrintWriter {
     }
 
     @Override
-    public LoggerPrintWriter format(final Locale l, final String format, final Object... args) {
+    public InternalPrintWriter format(final Locale l, final String format, final Object... args) {
         super.format(l, format, args);
         return this;
     }
 
     @Override
-    public LoggerPrintWriter format(final String format, final Object... args) {
+    public InternalPrintWriter format(final String format, final Object... args) {
         super.format(format, args);
         return this;
     }
@@ -147,13 +135,13 @@ public class LoggerPrintWriter extends PrintWriter {
     }
 
     @Override
-    public LoggerPrintWriter printf(final Locale l, final String format, final Object... args) {
+    public InternalPrintWriter printf(final Locale l, final String format, final Object... args) {
         super.printf(l, format, args);
         return this;
     }
 
     @Override
-    public LoggerPrintWriter printf(final String format, final Object... args) {
+    public InternalPrintWriter printf(final String format, final Object... args) {
         super.printf(format, args);
         return this;
     }
@@ -210,7 +198,7 @@ public class LoggerPrintWriter extends PrintWriter {
 
     @Override
     public String toString() {
-        return LoggerPrintWriter.class.getSimpleName() + "{stream=" + this.out + '}';
+        return "{stream=" + this.out + '}';
     }
 
     @Override
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalReader.java
similarity index 82%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalReader.java
index 265e8e7..40f9fd1 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerReader.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalReader.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.FilterReader;
 import java.io.IOException;
@@ -24,24 +24,24 @@ import java.nio.CharBuffer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.CharStreamLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line read to a pre-defined level. Can also be configured with a Marker.
- * 
- * @since 2.1
+ * Internal class that exists primiarly to allow location calculations to work.
+ *
+ * @since 2.12
  */
-public class LoggerReader extends FilterReader {
-    private static final String FQCN = LoggerReader.class.getName();
+public class InternalReader extends FilterReader {
 
     private final CharStreamLogger logger;
     private final String fqcn;
 
-    protected LoggerReader(final Reader reader, final ExtendedLogger logger, final String fqcn, final Level level,
+    public InternalReader(final Reader reader, final ExtendedLogger logger, final String fqcn, final Level level,
                            final Marker marker) {
         super(reader);
         this.logger = new CharStreamLogger(logger, level, marker);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.fqcn = fqcn;
     }
 
     @Override
@@ -82,6 +82,6 @@ public class LoggerReader extends FilterReader {
 
     @Override
     public String toString() {
-        return LoggerReader.class.getSimpleName() + "{stream=" + this.in + '}';
+        return "{stream=" + this.in + '}';
     }
 }
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerWriter.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalWriter.java
similarity index 79%
copy from log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerWriter.java
copy to log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalWriter.java
index 8fba24c..11deeab 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/LoggerWriter.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/InternalWriter.java
@@ -15,30 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.logging.log4j.io;
+package org.apache.logging.log4j.io.internal;
 
 import java.io.IOException;
 import java.io.Writer;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.io.CharStreamLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 
 /**
- * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
- * that follows the {@link java.io.Writer} methods in spirit, but doesn't require output to any external writer.
- * 
- * @since 2.1
+ * Internal class that exists primiarly to allow location calculations to work.
+ * @since 2.12
  */
-public class LoggerWriter extends Writer {
-    private static final String FQCN = LoggerWriter.class.getName();
+public class InternalWriter extends Writer {
 
     private final CharStreamLogger logger;
     private final String fqcn;
 
-    protected LoggerWriter(final ExtendedLogger logger, final String fqcn, final Level level, final Marker marker) {
+    public InternalWriter(final ExtendedLogger logger, final String fqcn, final Level level, final Marker marker) {
         this.logger = new CharStreamLogger(logger, level, marker);
-        this.fqcn = fqcn == null ? FQCN : fqcn;
+        this.fqcn = fqcn;
     }
 
     @Override
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/package-info.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/package-info.java
new file mode 100644
index 0000000..38f754a
--- /dev/null
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/internal/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+/**
+ * Internal classes. Should not be used by users.
+ */
+package org.apache.logging.log4j.io.internal;
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 0a2f60d..b003714 100644
--- a/pom.xml
+++ b/pom.xml
@@ -240,7 +240,7 @@
     <!-- Allow Clirr severity to be overriden by the command-line option -DminSeverity=level -->
     <minSeverity>info</minSeverity>
     <jctoolsVersion>1.2.1</jctoolsVersion>
-    <mockitoVersion>2.13.0</mockitoVersion>
+    <mockitoVersion>2.23.4</mockitoVersion>
     <argLine>-Xms256m -Xmx1024m</argLine>
     <javaTargetVersion>1.8</javaTargetVersion>
     <module.name />
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 93d9d0b..1a5b09a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -354,6 +354,9 @@
       </action>
     </release>
     <release version="2.11.2" date="2018-MM-DD" description="GA Release 2.11.2">
+      <action issue="LOG4J2-1570" dev="rgoers" type="fix">
+        Logging with a lambda expression with a method call that also logs would cause logs within method call to reference line num and method name of the parent method.
+      </action>
       <action issue="LOG4J2-1576" dev="rgoers" type="update">
         Switch from CLIRR to RevAPI for detecting API changes.
       </action>