diff --git a/src/main/java/org/ultramine/server/bootstrap/log4j/IUnformattedMessage.java b/src/main/java/org/ultramine/server/bootstrap/log4j/IUnformattedMessage.java new file mode 100644 index 0000000..1810bc5 --- /dev/null +++ b/src/main/java/org/ultramine/server/bootstrap/log4j/IUnformattedMessage.java @@ -0,0 +1,14 @@ +package org.ultramine.server.bootstrap.log4j; + +/** + * Used in {@link UMStripColorsRewritePolicy} to provide custom + * unformatted (without control sequences) log messages + * @see org.ultramine.server.internal.ChatComponentLogMessage + */ +public interface IUnformattedMessage +{ + /** + * @return text for writing to log file without control sequences (colors) + */ + String getUnformattedMessage(); +} diff --git a/src/main/java/org/ultramine/server/bootstrap/log4j/UMStripColorsRewritePolicy.java b/src/main/java/org/ultramine/server/bootstrap/log4j/UMStripColorsRewritePolicy.java index afb294c..d1e7086 100644 --- a/src/main/java/org/ultramine/server/bootstrap/log4j/UMStripColorsRewritePolicy.java +++ b/src/main/java/org/ultramine/server/bootstrap/log4j/UMStripColorsRewritePolicy.java @@ -19,19 +19,20 @@ public LogEvent rewrite(LogEvent source) { Message message = source.getMessage(); - if(message instanceof SimpleMessage || message instanceof MessageFormatMessage || message instanceof StringFormattedMessage) + if(message instanceof IUnformattedMessage) + { + message = new SimpleMessage(((IUnformattedMessage) message).getUnformattedMessage()); + } + else if(message instanceof SimpleMessage || message instanceof MessageFormatMessage || message instanceof StringFormattedMessage) { String text = message.getFormattedMessage(); StringBuilder sb = new StringBuilder(text.length()); UMConsoleLayout.stripControlSequences(sb, text); message = new SimpleMessage(sb.toString()); } - else if(message.getClass().getName().equals("org.ultramine.server.internal.ChatComponentLogMessage")) + else { - // All log4j plugins loads by AppClassLoader, ChatComponentLogMessage uses - // minecraft classes and loads by LaunchClassLoader with transform. So - // we should compare class by name and use existing interface methods - message = new SimpleMessage(message.getFormat()); + return source; } return new Log4jLogEvent(source.getLoggerName(), source.getMarker(), source.getFQCN(), source.getLevel(), diff --git a/src/main/java/org/ultramine/server/internal/ChatComponentLogMessage.java b/src/main/java/org/ultramine/server/internal/ChatComponentLogMessage.java index 091777d..1926970 100644 --- a/src/main/java/org/ultramine/server/internal/ChatComponentLogMessage.java +++ b/src/main/java/org/ultramine/server/internal/ChatComponentLogMessage.java @@ -3,8 +3,9 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.IChatComponent; import org.apache.logging.log4j.message.Message; +import org.ultramine.server.bootstrap.log4j.IUnformattedMessage; -public class ChatComponentLogMessage implements Message +public class ChatComponentLogMessage implements Message, IUnformattedMessage { private final IChatComponent comp; private String formattedMessage; @@ -23,6 +24,7 @@ return formattedMessage; } + @Override public String getUnformattedMessage() { if(unformattedMessage == null) @@ -30,11 +32,10 @@ return unformattedMessage; } - /** Used in UMStripColorsRewritePolicy due to classloader issues */ @Override public String getFormat() { - return getUnformattedMessage(); + return comp instanceof ChatComponentTranslation ? ((ChatComponentTranslation) comp).getKey() : getUnformattedMessage(); } @Override