Adapt logger if j.u.l already initialized

This commit is contained in:
IzzelAliz 2022-07-20 13:17:01 +08:00
parent 6a513232e5
commit 74ac54c4e4
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
5 changed files with 46 additions and 6 deletions

View File

@ -24,4 +24,12 @@ public class ArclightPluginLogger extends PluginLogger {
public void log(LogRecord logRecord) {
logger.log(logRecord);
}
public static Logger getLogger(String name) {
return JUL_MANAGER.getLogger(name);
}
public static Logger getLogger(String name, String rb) {
return JUL_MANAGER.getLogger(name);
}
}

View File

@ -6,6 +6,7 @@ import io.izzel.arclight.api.PluginPatcher;
import io.izzel.arclight.api.Unsafe;
import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger;
import io.izzel.arclight.common.mod.util.remapper.patcher.ArclightPluginPatcher;
import io.izzel.arclight.common.mod.util.remapper.patcher.PluginLoggerTransformer;
import io.izzel.arclight.common.mod.util.remapper.resource.RemapSourceHandler;
import net.md_5.specialsource.InheritanceMap;
import net.md_5.specialsource.JarMapping;
@ -96,6 +97,9 @@ public class ArclightRemapper {
this.transformerList.add(ArclightInterfaceInvokerGen.INSTANCE);
this.transformerList.add(ArclightRedirectAdapter.INSTANCE);
this.transformerList.add(ClassLoaderAdapter.INSTANCE);
if (!(java.util.logging.LogManager.getLogManager() instanceof org.apache.logging.log4j.jul.LogManager)) {
this.transformerList.add(new PluginLoggerTransformer());
}
this.patchers = ArclightPluginPatcher.load(this.transformerList);
toBukkitMapping.setFallbackInheritanceProvider(GlobalClassRepo.inheritanceProvider());
this.toBukkitRemapper = new LenientJarRemapper(toBukkitMapping);

View File

@ -0,0 +1,24 @@
package io.izzel.arclight.common.mod.util.remapper.patcher;
import io.izzel.arclight.common.mod.util.log.ArclightPluginLogger;
import io.izzel.arclight.common.mod.util.remapper.ClassLoaderRemapper;
import io.izzel.arclight.common.mod.util.remapper.PluginTransformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
public class PluginLoggerTransformer implements PluginTransformer {
@Override
public void handleClass(ClassNode node, ClassLoaderRemapper remapper) {
for (var mn : node.methods) {
for (var insn : mn.instructions) {
if (insn.getOpcode() == Opcodes.INVOKESTATIC && insn instanceof MethodInsnNode method
&& method.owner.equals("java/util/logging/Logger") && method.name.equals("getLogger")) {
method.owner = Type.getInternalName(ArclightPluginLogger.class);
}
}
}
}
}

View File

@ -33,13 +33,21 @@ public class ArclightImplementer implements ILaunchPluginService {
private final boolean logger;
public ArclightImplementer() {
this(false);
this(detectTransformLogger());
}
public ArclightImplementer(boolean logger) {
this.logger = logger;
}
private static boolean detectTransformLogger() {
var transformLogger = !(java.util.logging.LogManager.getLogManager() instanceof org.apache.logging.log4j.jul.LogManager);
if (transformLogger && !System.getProperties().contains("log4j.jul.LoggerAdapter")) {
System.setProperty("log4j.jul.LoggerAdapter", "io.izzel.arclight.boot.log.ArclightLoggerAdapter");
}
return transformLogger;
}
@Override
public String name() {
return "arclight_implementer";

View File

@ -98,11 +98,7 @@ public class ModBootstrap extends AbstractBootstrap {
var plugins = LaunchPluginHandler.class.getDeclaredField("plugins");
plugins.setAccessible(true);
var map = (Map<String, ILaunchPluginService>) plugins.get(handler);
var transformLogger = !(java.util.logging.LogManager.getLogManager() instanceof org.apache.logging.log4j.jul.LogManager);
if (transformLogger && !System.getProperties().contains("log4j.jul.LoggerAdapter")) {
System.setProperty("log4j.jul.LoggerAdapter", "io.izzel.arclight.boot.log.ArclightLoggerAdapter");
}
var plugin = new ArclightImplementer(transformLogger);
var plugin = new ArclightImplementer();
map.put(plugin.name(), plugin);
}