Rewrite LogEvents to contain the source jars in stack traces

This commit is contained in:
SirYwell 2021-07-10 11:12:30 +02:00
parent 34407fe880
commit a0389538ec
4 changed files with 211 additions and 0 deletions

View file

@ -0,0 +1,130 @@
package io.papermc.paper.logging;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import java.util.Map;
public class DelegateLogEvent implements LogEvent {
private final LogEvent original;
protected DelegateLogEvent(LogEvent original) {
this.original = original;
}
@Override
public LogEvent toImmutable() {
return this.original.toImmutable();
}
@Override
public Map<String, String> getContextMap() {
return this.original.getContextMap();
}
@Override
public ReadOnlyStringMap getContextData() {
return this.original.getContextData();
}
@Override
public ThreadContext.ContextStack getContextStack() {
return this.original.getContextStack();
}
@Override
public String getLoggerFqcn() {
return this.original.getLoggerFqcn();
}
@Override
public Level getLevel() {
return this.original.getLevel();
}
@Override
public String getLoggerName() {
return this.original.getLoggerName();
}
@Override
public Marker getMarker() {
return this.original.getMarker();
}
@Override
public Message getMessage() {
return this.original.getMessage();
}
@Override
public long getTimeMillis() {
return this.original.getTimeMillis();
}
@Override
public Instant getInstant() {
return this.original.getInstant();
}
@Override
public StackTraceElement getSource() {
return this.original.getSource();
}
@Override
public String getThreadName() {
return this.original.getThreadName();
}
@Override
public long getThreadId() {
return this.original.getThreadId();
}
@Override
public int getThreadPriority() {
return this.original.getThreadPriority();
}
@Override
public Throwable getThrown() {
return this.original.getThrown();
}
@Override
public ThrowableProxy getThrownProxy() {
return this.original.getThrownProxy();
}
@Override
public boolean isEndOfBatch() {
return this.original.isEndOfBatch();
}
@Override
public boolean isIncludeLocation() {
return this.original.isIncludeLocation();
}
@Override
public void setEndOfBatch(boolean endOfBatch) {
this.original.setEndOfBatch(endOfBatch);
}
@Override
public void setIncludeLocation(boolean locationRequired) {
this.original.setIncludeLocation(locationRequired);
}
@Override
public long getNanoTime() {
return this.original.getNanoTime();
}
}

View file

@ -0,0 +1,48 @@
package io.papermc.paper.logging;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.ExtendedClassInfo;
import org.apache.logging.log4j.core.impl.ExtendedStackTraceElement;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
public class ExtraClassInfoLogEvent extends DelegateLogEvent {
private boolean fixed;
public ExtraClassInfoLogEvent(LogEvent original) {
super(original);
}
@Override
public ThrowableProxy getThrownProxy() {
if (fixed) {
return super.getThrownProxy();
}
rewriteStackTrace(super.getThrownProxy());
fixed = true;
return super.getThrownProxy();
}
private void rewriteStackTrace(ThrowableProxy throwable) {
ExtendedStackTraceElement[] stackTrace = throwable.getExtendedStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
ExtendedClassInfo classInfo = stackTrace[i].getExtraClassInfo();
if (classInfo.getLocation().equals("?")) {
StackTraceElement element = stackTrace[i].getStackTraceElement();
String classLoaderName = element.getClassLoaderName();
if (classLoaderName != null) {
stackTrace[i] = new ExtendedStackTraceElement(element,
new ExtendedClassInfo(classInfo.getExact(), classLoaderName, "?"));
}
}
}
if (throwable.getCauseProxy() != null) {
rewriteStackTrace(throwable.getCauseProxy());
}
if (throwable.getSuppressedProxies() != null) {
for (ThrowableProxy proxy : throwable.getSuppressedProxies()) {
rewriteStackTrace(proxy);
}
}
}
}

View file

@ -0,0 +1,29 @@
package io.papermc.paper.logging;
import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.jetbrains.annotations.NotNull;
@Plugin(
name = "ExtraClassInfoRewritePolicy",
category = Core.CATEGORY_NAME,
elementType = "rewritePolicy",
printObject = true
)
public final class ExtraClassInfoRewritePolicy implements RewritePolicy {
@Override
public LogEvent rewrite(LogEvent source) {
if (source.getThrown() != null) {
return new ExtraClassInfoLogEvent(source);
}
return source;
}
@PluginFactory
public static @NotNull ExtraClassInfoRewritePolicy createPolicy() {
return new ExtraClassInfoRewritePolicy();
}
}

View file

@ -34,6 +34,10 @@
</Async>
<Rewrite name="rewrite">
<StacktraceDeobfuscatingRewritePolicy />
<AppenderRef ref="rewrite2"/>
</Rewrite>
<Rewrite name="rewrite2">
<ExtraClassInfoRewritePolicy />
<AppenderRef ref="File"/>
<AppenderRef ref="TerminalConsole" level="info"/>
<AppenderRef ref="ServerGuiConsole" level="info"/>