Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
7d7c559
fix: LOG4J2-3627 and gh issue 1729
alan0428a Jun 25, 2024
9f8af82
update naming and add final
alan0428a Jun 26, 2024
dbefb4f
add final
alan0428a Jun 26, 2024
66212e0
update core version to 3.0.0
alan0428a Jun 26, 2024
f7e1632
Merge branch 'apache:2.x' into 2.x
alan0428a Jun 26, 2024
de83163
update as per comment
alan0428a Jun 26, 2024
38cd7fe
add StringBuilders
alan0428a Jun 26, 2024
26dbdff
update
alan0428a Jun 26, 2024
8d3f7e4
add tests
alan0428a Jun 27, 2024
f17e6da
Fix OSGi failures
ppkarwasz Jun 27, 2024
42459ed
create tests programmatically
alan0428a Jun 28, 2024
659f7e5
fix style
alan0428a Jun 28, 2024
efc126a
update as comment
alan0428a Jul 3, 2024
e4fa223
Add ThrowableRenderer
alan0428a Jul 12, 2024
4016239
Add ThrowableRenderer.Context and update ThrowablePatternConverter su…
alan0428a Jul 12, 2024
0cd5f6b
Make ThrowableRenderer instance variable of ThrowablePatternConverter
alan0428a Jul 13, 2024
4e89d67
add RootThrowableRenderer and add missing "at"
alan0428a Jul 13, 2024
0975f5d
Fix ThrowableRenderer
alan0428a Jul 16, 2024
cf28898
Remove redundant method
alan0428a Jul 16, 2024
ca14ed1
Merge methods
alan0428a Jul 16, 2024
ca8ab05
Visibility related cosmetic changes to `ThrowableRender` (#2691)
vy Jul 16, 2024
7e57942
Arrange method order in `ThrowableRender` (#2691)
vy Jul 16, 2024
ce80b72
First (untested) draft of `ExtendedThrowableRenderer` (#2691)
vy Jul 17, 2024
4962f43
Fix import
alan0428a Jul 18, 2024
44d6c51
add render about suppressedThrowables
alan0428a Aug 8, 2024
54c8e2b
update for %xEx
alan0428a Aug 8, 2024
8bf1d29
update render
alan0428a Aug 12, 2024
2ec0bc4
Inline `TAB`
vy Aug 12, 2024
1b16ec1
Add comments
vy Aug 12, 2024
75e24b5
Rename `WRAPPED_BY_LABEL` to `WRAPPED_BY_CAPTION`
vy Aug 12, 2024
b4630b9
Make `ThrowableRenderer` more strict
vy Aug 12, 2024
cf55e42
Fix stack trace indentation in `ExtendedThrowableRenderer`
vy Aug 12, 2024
a3ccf35
Fix map key conflict in `ExtendedThrowableRenderer`
vy Aug 12, 2024
91e6110
Fix Spotless failures
vy Aug 12, 2024
f91620a
Add `ThrowableTestMain` test application
vy Aug 12, 2024
7d9e87b
fix rEx
alan0428a Aug 12, 2024
4b5325a
fix formatting
alan0428a Aug 12, 2024
2009888
Update `ThrowableTestMain`
vy Aug 12, 2024
ede1cd9
add visited for rendering
alan0428a Aug 13, 2024
bd4e2f2
set %xEx using ExtendedThrowableRenderer
alan0428a Aug 13, 2024
1e8fae1
Merge branch '2.x' of github.com:alan0428a/logging-log4j2 into 2.x
alan0428a Aug 13, 2024
36a812b
Merge remote-tracking branch 'origin/2.x' into 2.x-alan
vy Aug 13, 2024
c489190
Fix `bnd-baseline` failures
vy Aug 13, 2024
2afc7fa
fix tests and add suffix for every line
alan0428a Aug 13, 2024
0d6aedc
update suffix and separator
alan0428a Aug 14, 2024
1e3dbcf
Simplify `ThrowablePatternConverter` and document the awesome Log4j f…
vy Aug 14, 2024
deb2513
Fix Spotless failures
vy Aug 14, 2024
e15c48f
Fix `bnd-baseline` failures
vy Aug 14, 2024
483ed39
fix tests related to separator
alan0428a Aug 15, 2024
5bee486
add tests
alan0428a Aug 17, 2024
b3d53ca
Deprecate ThrowableProxy related classes and tests
alan0428a Aug 17, 2024
c0b06b6
add golden samples
alan0428a Aug 21, 2024
08ba30d
fix tests
alan0428a Aug 21, 2024
feea2db
Merge remote-tracking branch 'origin/2.x' into 2.x-alan
vy Sep 19, 2024
0a36a46
Add tests
vy Sep 23, 2024
dc4f8a2
Merge remote-tracking branch 'origin/2.x' into 2.x-alan
vy Sep 23, 2024
3fa309d
Fix `bnd-baseline` failures
vy Sep 23, 2024
9f9da1a
Remove deprecated `ThrowableFullTest`
vy Sep 23, 2024
97fd136
Add changelog entries
vy Sep 23, 2024
9e55f5c
Revert redundant `ThrowableProxy` and `ThrowableProxyRenderer` fixes
vy Sep 24, 2024
2e47d49
remove unused tests
alan0428a Sep 24, 2024
27d4663
fix: tests
alan0428a Sep 24, 2024
980da42
style: fix style
alan0428a Sep 24, 2024
1728fa9
tests: fix line separator
alan0428a Sep 25, 2024
d07e14a
Rework `ThrowablePatternConverter` et al.
vy Sep 25, 2024
be1639e
Merge remote-tracking branch 'alan0428a/2.x' into 2.x-alan
vy Sep 25, 2024
f3b13af
Revamp tests
vy Sep 26, 2024
7108d36
Improve docs
vy Sep 26, 2024
7161ed7
Merge remote-tracking branch 'origin/2.x' into 2.x-alan
vy Sep 26, 2024
8c57109
Remove redundant changelog entries
vy Sep 26, 2024
2cf6d36
Add circular reference support
vy Sep 27, 2024
e52fe1f
Fix newline handling in tests
vy Sep 27, 2024
7719098
Improve changelog
vy Sep 27, 2024
e4f34b6
Merge remote-tracking branch 'origin/2.x' into 2.x-alan
vy Sep 27, 2024
f3e89d3
Remove redundant `toString()` calls
vy Sep 29, 2024
b788206
Test module name serialization (LOG4J2-2170)
vy Sep 30, 2024
cf42de7
Merge remote-tracking branch 'origin/2.x' into 2.x-alan
vy Sep 30, 2024
d853ec0
Update changelog (LOG4J2-2170)
vy Sep 30, 2024
a419ea8
Normalize extended stack trace suffixes
vy Sep 30, 2024
beede50
Add `ThrowVsReturnBenchmark`
vy Oct 1, 2024
663a9e7
Fix Spotless failures
vy Oct 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public void test_formatExtendedStackTraceTo() {
new ArrayList<>(),
new PlainTextRenderer(),
"",
System.lineSeparator());
System.lineSeparator(),
null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -297,10 +297,32 @@ public String getCauseStackTraceAsString(
final String suffix,
final String lineSeparator) {
final StringBuilder sb = new StringBuilder();
ThrowableProxyRenderer.formatCauseStackTrace(this, sb, ignorePackages, textRenderer, suffix, lineSeparator);
ThrowableProxyRenderer.formatCauseStackTraceTo(
this, sb, ignorePackages, textRenderer, suffix, lineSeparator, null);
return sb.toString();
}

/**
* Formats the stack trace with cause exception.
*
* @param sb Destination.
* @param ignorePackages List of packages to be ignored in the trace.
* @param textRenderer The message renderer.
* @param suffix Append this to the end of each stack frame.
* @param lineSeparator The end-of-line separator.
* @param maxLineCount The total line count of final result
*/
public void formatCauseStackTraceTo(
final StringBuilder sb,
final List<String> ignorePackages,
final TextRenderer textRenderer,
final String suffix,
final String lineSeparator,
final Integer maxLineCount) {
ThrowableProxyRenderer.formatCauseStackTraceTo(
this, sb, ignorePackages, textRenderer, suffix, lineSeparator, maxLineCount);
}

/**
* Returns the number of elements that are being omitted because they are common with the parent Throwable's stack
* trace.
Expand Down Expand Up @@ -389,7 +411,7 @@ public String getExtendedStackTraceAsString(
final String suffix,
final String lineSeparator) {
final StringBuilder sb = new StringBuilder(1024);
formatExtendedStackTraceTo(sb, ignorePackages, textRenderer, suffix, lineSeparator);
formatExtendedStackTraceTo(sb, ignorePackages, textRenderer, suffix, lineSeparator, null);
return sb.toString();
}

Expand All @@ -401,15 +423,17 @@ public String getExtendedStackTraceAsString(
* @param textRenderer The message renderer.
* @param suffix Append this to the end of each stack frame.
* @param lineSeparator The end-of-line separator.
* @param maxLineCount The total line count of final result
*/
public void formatExtendedStackTraceTo(
final StringBuilder sb,
final List<String> ignorePackages,
final TextRenderer textRenderer,
final String suffix,
final String lineSeparator) {
final String lineSeparator,
final Integer maxLineCount) {
ThrowableProxyRenderer.formatExtendedStackTraceTo(
this, sb, ignorePackages, textRenderer, suffix, lineSeparator);
this, sb, ignorePackages, textRenderer, suffix, lineSeparator, maxLineCount);
}

public String getLocalizedMessage() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,9 @@ static void formatExtendedStackTraceTo(
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");
final String lineSeparator,
final Integer maxLineCount) {
renderOn(src, sb, textRenderer);
renderSuffix(suffix, sb, textRenderer);
textRenderer.render(lineSeparator, sb, "Text");
final StackTraceElement[] causedTrace =
Expand All @@ -260,6 +259,7 @@ static void formatExtendedStackTraceTo(
lineSeparator);
formatSuppressed(sb, TAB, src.getSuppressedProxies(), ignorePackages, textRenderer, suffix, lineSeparator);
formatCause(sb, Strings.EMPTY, src.getCauseProxy(), ignorePackages, textRenderer, suffix, lineSeparator);
truncateLines(sb, lineSeparator, maxLineCount, textRenderer);
}

/**
Expand All @@ -272,23 +272,24 @@ static void formatExtendedStackTraceTo(
* @param suffix Append this to the end of each stack frame.
* @param lineSeparator The end-of-line separator.
*/
static void formatCauseStackTrace(
static void formatCauseStackTraceTo(
final ThrowableProxy src,
final StringBuilder sb,
final List<String> ignorePackages,
final TextRenderer textRenderer,
final String suffix,
final String lineSeparator) {
final String lineSeparator,
final Integer maxLineCount) {
final ThrowableProxy causeProxy = src.getCauseProxy();
if (causeProxy != null) {
formatWrapper(sb, causeProxy, ignorePackages, textRenderer, suffix, lineSeparator);
sb.append(WRAPPED_BY_LABEL);
ThrowableProxyRenderer.renderSuffix(suffix, sb, textRenderer);
renderSuffix(suffix, sb, textRenderer);
}
renderOn(src, sb, textRenderer);
ThrowableProxyRenderer.renderSuffix(suffix, sb, textRenderer);
renderSuffix(suffix, sb, textRenderer);
textRenderer.render(lineSeparator, sb, "Text");
ThrowableProxyRenderer.formatElements(
formatElements(
sb,
Strings.EMPTY,
0,
Expand All @@ -298,6 +299,7 @@ static void formatCauseStackTrace(
textRenderer,
suffix,
lineSeparator);
truncateLines(sb, lineSeparator, maxLineCount, textRenderer);
}

private static void renderOn(
Expand All @@ -309,4 +311,27 @@ private static void renderOn(
textRenderer.render(msg, output, "Message");
}
}

private static void truncateLines(
final StringBuilder sb,
final String lineSeparator,
final Integer maxLineCount,
final TextRenderer textRenderer) {
if (maxLineCount == null) {
return;
}

String content = sb.toString();
String[] lines = content.split(lineSeparator);

if (lines.length <= maxLineCount) {
return;
}

sb.setLength(0);
for (int i = 0; i < maxLineCount; i++) {
sb.append(lines[i]);
textRenderer.render(lineSeparator, sb, "Text");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* Implementation of Log4j 2.
*/
@Export
@Version("2.24.0")
@Version("3.0.0")
package org.apache.logging.log4j.core;

import org.osgi.annotation.bundle.Export;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ public void format(final LogEvent event, final StringBuilder toAppendTo) {
options.getIgnorePackages(),
options.getTextRenderer(),
getSuffix(event),
options.getSeparator());
options.getSeparator(),
options.allLines() ? null : options.getLines());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.util.Strings;

/**
* Outputs the Throwable portion of the LoggingEvent as a full stack trace
Expand Down Expand Up @@ -68,27 +67,17 @@ public void format(final LogEvent event, final StringBuilder toAppendTo) {
super.format(event, toAppendTo);
return;
}
final String trace = proxy.getCauseStackTraceAsString(
options.getIgnorePackages(), options.getTextRenderer(), getSuffix(event), options.getSeparator());
final int len = toAppendTo.length();
if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
toAppendTo.append(' ');
}
if (!options.allLines() || !Strings.LINE_SEPARATOR.equals(options.getSeparator())) {
final StringBuilder sb = new StringBuilder();
final String[] array = trace.split(Strings.LINE_SEPARATOR);
final int limit = options.minLines(array.length) - 1;
for (int i = 0; i <= limit; ++i) {
sb.append(array[i]);
if (i < limit) {
sb.append(options.getSeparator());
}
}
toAppendTo.append(sb.toString());

} else {
toAppendTo.append(trace);
}
proxy.formatCauseStackTraceTo(
toAppendTo,
options.getIgnorePackages(),
options.getTextRenderer(),
getSuffix(event),
options.getSeparator(),
options.allLines() ? null : options.getLines());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -188,23 +187,24 @@ private void formatOption(final Throwable throwable, final String suffix, final
if (len > 0 && !Character.isWhitespace(buffer.charAt(len - 1))) {
buffer.append(' ');
}
if (!options.allLines() || nonStandardLineSeparator || Strings.isNotBlank(suffix)) {
final StringWriter w = new StringWriter();
throwable.printStackTrace(new PrintWriter(w));

final String[] array = w.toString().split(Strings.LINE_SEPARATOR);
final int limit = options.minLines(array.length) - 1;
final boolean suffixNotBlank = Strings.isNotBlank(suffix);
for (int i = 0; i <= limit; ++i) {
buffer.append(array[i]);
if (suffixNotBlank) {
buffer.append(' ');
buffer.append(suffix);
}
if (i < limit) {
buffer.append(options.getSeparator());
if (requireAdditionalFormatting(suffix)) {
StackTraceElement[] stackTrace = throwable.getStackTrace();
int ignoredCount = 0;
for (StackTraceElement stackTraceElement : stackTrace) {
if (!ignoreElement(stackTraceElement, options.getIgnorePackages())) {
if (ignoredCount > 0) {
appendSuppressedCount(buffer, ignoredCount, suffix, options.getSeparator());
ignoredCount = 0;
}
appendEntry(stackTraceElement, buffer, suffix, options.getSeparator());
} else {
++ignoredCount;
}
}
if (ignoredCount > 0) {
appendSuppressedCount(buffer, ignoredCount, suffix, options.getSeparator());
}
truncateLines(buffer, options.getSeparator(), options.allLines() ? null : options.getLines());
} else {
throwable.printStackTrace(new PrintWriter(new StringBuilderWriter(buffer)));
}
Expand Down Expand Up @@ -235,4 +235,69 @@ protected String getSuffix(final LogEvent event) {
public ThrowableFormatOptions getOptions() {
return options;
}

private boolean requireAdditionalFormatting(final String suffix) {
return !options.allLines() || nonStandardLineSeparator || Strings.isNotBlank(suffix) || options.hasPackages();
}

private boolean ignoreElement(final StackTraceElement element, final List<String> ignorePackages) {
if (ignorePackages != null) {
final String className = element.getClassName();
for (final String pkg : ignorePackages) {
if (className.startsWith(pkg)) {
return true;
}
}
}
return false;
}

private void appendSuppressedCount(
final StringBuilder sb, final int count, final String suffix, final String lineSeparator) {
if (count == 1) {
sb.append("\t... ");
} else {
sb.append("\t... suppressed ");
sb.append(count);
sb.append(" lines");
}
appendSuffix(sb, suffix);
sb.append(lineSeparator);
}

private void appendEntry(
final StackTraceElement stackTraceElement,
final StringBuilder sb,
final String suffix,
final String lineSeparator) {
sb.append(stackTraceElement.toString());
appendSuffix(sb, suffix);
sb.append(lineSeparator);
}

private void appendSuffix(final StringBuilder buffer, final String suffix) {
if (Strings.isNotBlank(suffix)) {
buffer.append(' ');
buffer.append(suffix);
}
}

private void truncateLines(final StringBuilder sb, final String lineSeparator, final Integer maxLineCount) {
if (maxLineCount == null) {
return;
}

String content = sb.toString();
String[] lines = content.split(lineSeparator);

if (lines.length <= maxLineCount) {
return;
}

sb.setLength(0);
for (int i = 0; i < maxLineCount; i++) {
sb.append(lines[i]);
sb.append(lineSeparator);
}
}
}