mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-27 15:00:13 +01:00
Rewrite LogEvents to contain the source jars in stack traces
This commit is contained in:
parent
34407fe880
commit
a0389538ec
4 changed files with 211 additions and 0 deletions
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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"/>
|
||||
|
|
Loading…
Reference in a new issue