You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "alset (Jira)" <ji...@apache.org> on 2021/08/24 17:24:00 UTC

[jira] [Created] (LOG4J2-3143) ThrowableProxyRenderer cannot handle options with depth and "short"

alset created LOG4J2-3143:
-----------------------------

             Summary: ThrowableProxyRenderer cannot handle options with depth and "short"
                 Key: LOG4J2-3143
                 URL: https://issues.apache.org/jira/browse/LOG4J2-3143
             Project: Log4j 2
          Issue Type: Bug
          Components: Appenders, Configuration, Documentation
    Affects Versions: 2.14.1
         Environment: Darwin 18.7.0 Darwin Kernel Version 18.7.0

java version "11.0.11" 2021-04-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)

 
            Reporter: alset


The [Document|https://logging.apache.org/log4j/log4j-2.1/manual/layouts.html] said that *%xEx\{short}* which will only output the first line of the Throwable or *%xEx\{n}* where the first n lines of the stacktrace will be printed. But it actually not work.

I followed the code in ThrowableProxyRenderer.java . It turns out that the method here not consider about these options at all.
{code:java}
static void formatExtendedStackTraceTo(final ThrowableProxy src, final StringBuilder sb, final List<String> ignorePackages, final TextRenderer textRenderer, final String suffix, final String lineSeparator) {
    textRenderer.render(src.getName(), sb, "Name");
    textRenderer.render(": ", sb, "NameMessageSeparator");
    textRenderer.render(src.getMessage(), sb, "Message");
    renderSuffix(suffix, sb, textRenderer);
    textRenderer.render(lineSeparator, sb, "Text");
    final StackTraceElement[] causedTrace = src.getThrowable() != null ? src.getThrowable().getStackTrace() : null;
    formatElements(sb, Strings.EMPTY, 0, causedTrace, src.getExtendedStackTrace(), ignorePackages, textRenderer, suffix, lineSeparator);
    formatSuppressed(sb, TAB, src.getSuppressedProxies(), ignorePackages, textRenderer, suffix, lineSeparator);
    formatCause(sb, Strings.EMPTY, src.getCauseProxy(), ignorePackages, textRenderer, suffix, lineSeparator);
}
{code}
Here are my test case
{code:java}
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test {
    private static final Logger logger = LogManager.getLogger(Test.class);

    private static void makeADeepErr(int i, int n) throws Exception {
        if (i < n) {
            makeADeepErr(i + 1, n);
        }
        throw new Exception("err");
    }

    public static void main(String[] args) {
        try {
            makeADeepErr(0, 20);
        } catch (Exception e) {
            logger.error("err occur", e);
        }
    }
}

{code}
And here are my log4j2.xml
{code:xml}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n %xEx{short}"/>
        </Console>

    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

{code}
And here are my output
{code:java}
01:03:26.877 [main] ERROR Test - err occur
 java.lang.Exception: err
	at Test.makeADeepErr(Test.java:11) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.makeADeepErr(Test.java:9) ~[classes/:?]
	at Test.main(Test.java:16) [classes/:?]
{code}
 But the *%xEx\{none}* or *%xEx\{0}* can work fine.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)