in log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java [218:274]
private static int findLabeledLineStartIndex(
final CharSequence buffer,
final int startIndex,
final int endIndex) {
// Note that the index arithmetic in this method is not guarded.
// That is, there are no `Math.addExact()` or `Math.subtractExact()` usages.
// Since we know a priori that we are already operating within buffer limits.
for (int bufferIndex = startIndex; bufferIndex < endIndex;) {
// Find the next line start, if exists.
final int lineStartIndex = findLineStartIndex(buffer, bufferIndex, endIndex);
if (lineStartIndex < 0) {
break;
}
bufferIndex = lineStartIndex;
// Skip tabs.
while (bufferIndex < endIndex && '\t' == buffer.charAt(bufferIndex)) {
bufferIndex++;
}
// Search for the `Caused by: ` occurrence.
if (bufferIndex < (endIndex - 11) &&
buffer.charAt(bufferIndex) == 'C' &&
buffer.charAt(bufferIndex + 1) == 'a' &&
buffer.charAt(bufferIndex + 2) == 'u' &&
buffer.charAt(bufferIndex + 3) == 's' &&
buffer.charAt(bufferIndex + 4) == 'e' &&
buffer.charAt(bufferIndex + 5) == 'd' &&
buffer.charAt(bufferIndex + 6) == ' ' &&
buffer.charAt(bufferIndex + 7) == 'b' &&
buffer.charAt(bufferIndex + 8) == 'y' &&
buffer.charAt(bufferIndex + 9) == ':' &&
buffer.charAt(bufferIndex + 10) == ' ') {
return lineStartIndex;
}
// Search for the `Suppressed: ` occurrence.
else if (bufferIndex < (endIndex - 12) &&
buffer.charAt(bufferIndex) == 'S' &&
buffer.charAt(bufferIndex + 1) == 'u' &&
buffer.charAt(bufferIndex + 2) == 'p' &&
buffer.charAt(bufferIndex + 3) == 'p' &&
buffer.charAt(bufferIndex + 4) == 'r' &&
buffer.charAt(bufferIndex + 5) == 'e' &&
buffer.charAt(bufferIndex + 6) == 's' &&
buffer.charAt(bufferIndex + 7) == 's' &&
buffer.charAt(bufferIndex + 8) == 'e' &&
buffer.charAt(bufferIndex + 9) == 'd' &&
buffer.charAt(bufferIndex + 10) == ':' &&
buffer.charAt(bufferIndex + 11) == ' ') {
return lineStartIndex;
}
}
return -1;
}