diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 8ed17dc61..fc8dce235 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -205,7 +205,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { } public void setupForTesting(final Server server) throws IOException, InvalidDescriptionException { - LOGGER = new BaseLoggerProvider(BUKKIT_LOGGER); + LOGGER = new BaseLoggerProvider(this, BUKKIT_LOGGER); final File dataFolder = File.createTempFile("essentialstest", ""); if (!dataFolder.delete()) { throw new IOException(); @@ -250,6 +250,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { BUKKIT_LOGGER.setParent(super.getLogger()); } LOGGER = EssentialsLogger.getLoggerProvider(this); + EssentialsLogger.updatePluginLogger(this); execTimer = new ExecuteTimer(); execTimer.start(); @@ -477,7 +478,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { final String timeroutput = execTimer.end(); if (getSettings().isDebug()) { - LOGGER.log(Level.INFO, "Essentials load {0}", timeroutput); + LOGGER.log(Level.INFO, "Essentials load " + timeroutput); } } catch (final NumberFormatException ex) { handleCrash(ex); @@ -488,15 +489,6 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { getBackup().setPendingShutdown(false); } - @Override - public Logger getLogger() { - if (LOGGER != null) { - return LOGGER; - } - - return super.getLogger(); - } - // Returns our provider logger if available public static Logger getWrappedLogger() { if (LOGGER != null) { @@ -755,10 +747,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { if (bSenderBlock != null) { if (getSettings().logCommandBlockCommands()) { - LOGGER.log(Level.INFO, "CommandBlock at {0},{1},{2} issued server command: /{3} {4}", new Object[] {bSenderBlock.getX(), bSenderBlock.getY(), bSenderBlock.getZ(), commandLabel, EssentialsCommand.getFinalArg(args, 0)}); + LOGGER.log(Level.INFO, "CommandBlock at " + bSenderBlock.getX() + "," + bSenderBlock.getY() + "," + bSenderBlock.getZ() + " issued server command: /" + commandLabel + " " + EssentialsCommand.getFinalArg(args, 0)); } } else if (user == null) { - LOGGER.log(Level.INFO, "{0} issued server command: /{1} {2}", new Object[] {cSender.getName(), commandLabel, EssentialsCommand.getFinalArg(args, 0)}); + LOGGER.log(Level.INFO, cSender.getName()+ " issued server command: /" + commandLabel + " " + EssentialsCommand.getFinalArg(args, 0)); } final CommandSource sender = new CommandSource(cSender); @@ -1070,7 +1062,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { if (user == null) { if (getSettings().isDebug()) { - LOGGER.log(Level.INFO, "Constructing new userfile from base player {0}", base.getName()); + LOGGER.log(Level.INFO, "Constructing new userfile from base player " + base.getName()); } user = new User(base, this); } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsLogger.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsLogger.java index 5190bb66e..c471d01ab 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsLogger.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsLogger.java @@ -6,13 +6,29 @@ import net.ess3.provider.providers.BaseLoggerProvider; import net.ess3.provider.providers.PaperLoggerProvider; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; public final class EssentialsLogger { private final static Map loggerProviders = new HashMap<>(); + private final static MethodHandle loggerFieldHandle; + + static { + try { + final Field loggerField = ReflUtil.getFieldCached(JavaPlugin.class, "logger"); + //noinspection ConstantConditions + loggerFieldHandle = MethodHandles.lookup().unreflectSetter(loggerField); + } catch (Throwable t) { + throw new RuntimeException("Failed to get logger field handle", t); + } + } private EssentialsLogger() { } @@ -22,16 +38,28 @@ public final class EssentialsLogger { return loggerProviders.get(plugin.getName()); } + final Logger parentLogger = Logger.getLogger(plugin.getName()); final LoggerProvider provider; if (ReflUtil.getClassCached("io.papermc.paper.adventure.providers.ComponentLoggerProviderImpl") != null) { provider = new PaperLoggerProvider(plugin); + provider.setParent(parentLogger); } else { - provider = new BaseLoggerProvider(Logger.getLogger(plugin.getName())); + provider = new BaseLoggerProvider(plugin, parentLogger); + provider.setParent(parentLogger); } loggerProviders.put(plugin.getName(), provider); return provider; } + public static void updatePluginLogger(final Plugin plugin) { + final LoggerProvider provider = getLoggerProvider(plugin); + try { + loggerFieldHandle.invoke(plugin, provider); + } catch (Throwable e) { + provider.log(Level.SEVERE, "Failed to update " + plugin.getName() + " logger", e); + } + } + public static LoggerProvider getLoggerProvider(final String pluginName) { if (loggerProviders.containsKey(pluginName)) { return loggerProviders.get(pluginName); diff --git a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuild.java b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuild.java index 445a686c2..54ec55aef 100644 --- a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuild.java +++ b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuild.java @@ -10,7 +10,6 @@ import org.bukkit.plugin.java.JavaPlugin; import java.util.EnumMap; import java.util.List; import java.util.Map; -import java.util.logging.Logger; public class EssentialsAntiBuild extends JavaPlugin implements IAntiBuild { private final transient Map settingsBoolean = new EnumMap<>(AntiBuildConfig.class); @@ -29,6 +28,7 @@ public class EssentialsAntiBuild extends JavaPlugin implements IAntiBuild { if (essPlugin == null || !essPlugin.isEnabled()) { return; } + EssentialsLogger.updatePluginLogger(this); ess = new EssentialsConnect(essPlugin, this); final EssentialsAntiBuildListener blockListener = new EssentialsAntiBuildListener(this); @@ -39,16 +39,6 @@ public class EssentialsAntiBuild extends JavaPlugin implements IAntiBuild { } } - @Override - public Logger getLogger() { - try { - return EssentialsLogger.getLoggerProvider(this); - } catch (Throwable ignored) { - // In case Essentials isn't installed/loaded - return super.getLogger(); - } - } - @Override public boolean checkProtectionItems(final AntiBuildConfig list, final Material mat) { final List itemList = settingsList.get(list); diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java index 341075888..e9c2c6d0d 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java @@ -13,7 +13,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; -import java.util.logging.Logger; import static com.earth2me.essentials.I18n.tl; @@ -23,6 +22,7 @@ public class EssentialsChat extends JavaPlugin { @Override public void onEnable() { + EssentialsLogger.updatePluginLogger(this); final PluginManager pluginManager = getServer().getPluginManager(); ess = (IEssentials) pluginManager.getPlugin("Essentials"); if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) { @@ -47,16 +47,6 @@ public class EssentialsChat extends JavaPlugin { } } - @Override - public Logger getLogger() { - try { - return EssentialsLogger.getLoggerProvider(this); - } catch (Throwable ignored) { - // In case Essentials isn't installed/loaded - return super.getLogger(); - } - } - @Override public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) { metrics.markCommand(command.getName(), true); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java index b2936a11e..ca288a580 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java @@ -27,6 +27,7 @@ public class EssentialsDiscord extends JavaPlugin implements IEssentialsModule { @Override public void onEnable() { + EssentialsLogger.updatePluginLogger(this); ess = (IEssentials) getServer().getPluginManager().getPlugin("Essentials"); if (ess == null || !ess.isEnabled()) { setEnabled(false); @@ -67,16 +68,6 @@ public class EssentialsDiscord extends JavaPlugin implements IEssentialsModule { } } - @Override - public Logger getLogger() { - try { - return EssentialsLogger.getLoggerProvider(this); - } catch (Throwable ignored) { - // In case Essentials isn't installed/loaded - return super.getLogger(); - } - } - public static Logger getWrappedLogger() { try { return EssentialsLogger.getLoggerProvider("EssentialsDiscord"); diff --git a/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIP.java b/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIP.java index aa848de92..4d466c86e 100644 --- a/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIP.java +++ b/EssentialsGeoIP/src/main/java/com/earth2me/essentials/geoip/EssentialsGeoIP.java @@ -17,6 +17,7 @@ public class EssentialsGeoIP extends JavaPlugin { @Override public void onEnable() { + EssentialsLogger.updatePluginLogger(this); final PluginManager pm = getServer().getPluginManager(); final IEssentials ess = (IEssentials) pm.getPlugin("Essentials"); if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) { @@ -39,14 +40,4 @@ public class EssentialsGeoIP extends JavaPlugin { } } - @Override - public Logger getLogger() { - try { - return EssentialsLogger.getLoggerProvider(this); - } catch (Throwable ignored) { - // In case Essentials isn't installed/loaded - return super.getLogger(); - } - } - } diff --git a/EssentialsProtect/src/main/java/com/earth2me/essentials/protect/EssentialsProtect.java b/EssentialsProtect/src/main/java/com/earth2me/essentials/protect/EssentialsProtect.java index d3496c19b..49cb62b1b 100644 --- a/EssentialsProtect/src/main/java/com/earth2me/essentials/protect/EssentialsProtect.java +++ b/EssentialsProtect/src/main/java/com/earth2me/essentials/protect/EssentialsProtect.java @@ -14,7 +14,6 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.logging.Level; -import java.util.logging.Logger; public class EssentialsProtect extends JavaPlugin implements IProtect { private final Map settingsBoolean = new EnumMap<>(ProtectConfig.class); @@ -26,6 +25,7 @@ public class EssentialsProtect extends JavaPlugin implements IProtect { @Override public void onEnable() { + EssentialsLogger.updatePluginLogger(this); final PluginManager pm = this.getServer().getPluginManager(); final Plugin essPlugin = pm.getPlugin("Essentials"); if (essPlugin == null || !essPlugin.isEnabled()) { @@ -40,16 +40,6 @@ public class EssentialsProtect extends JavaPlugin implements IProtect { } } - @Override - public Logger getLogger() { - try { - return EssentialsLogger.getLoggerProvider(this); - } catch (Throwable ignored) { - // In case Essentials isn't installed/loaded - return super.getLogger(); - } - } - private void initialize(final PluginManager pm, final Plugin essPlugin) { getLogger().log(Level.INFO, "Continuing to enable Protect."); ess = new EssentialsConnect(essPlugin, this); diff --git a/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/EssentialsSpawn.java b/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/EssentialsSpawn.java index fd2a2b421..c2b11036e 100644 --- a/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/EssentialsSpawn.java +++ b/EssentialsSpawn/src/main/java/com/earth2me/essentials/spawn/EssentialsSpawn.java @@ -24,6 +24,7 @@ public class EssentialsSpawn extends JavaPlugin implements IEssentialsSpawn { @Override public void onEnable() { + EssentialsLogger.updatePluginLogger(this); final PluginManager pluginManager = getServer().getPluginManager(); ess = (IEssentials) pluginManager.getPlugin("Essentials"); if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) { @@ -56,16 +57,6 @@ public class EssentialsSpawn extends JavaPlugin implements IEssentialsSpawn { } } - @Override - public Logger getLogger() { - try { - return EssentialsLogger.getLoggerProvider(this); - } catch (Throwable ignored) { - // In case Essentials isn't installed/loaded - return super.getLogger(); - } - } - public static Logger getWrappedLogger() { try { return EssentialsLogger.getLoggerProvider("EssentialsSpawn"); diff --git a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java index dee2e2673..19e6cdf38 100644 --- a/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java +++ b/EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java @@ -35,6 +35,7 @@ public class EssentialsXMPP extends JavaPlugin implements IEssentialsXMPP { @Override public void onEnable() { + EssentialsLogger.updatePluginLogger(this); instance = this; final PluginManager pluginManager = getServer().getPluginManager(); @@ -62,16 +63,6 @@ public class EssentialsXMPP extends JavaPlugin implements IEssentialsXMPP { } } - @Override - public Logger getLogger() { - try { - return EssentialsLogger.getLoggerProvider(this); - } catch (Throwable ignored) { - // In case Essentials isn't installed/loaded - return super.getLogger(); - } - } - public static Logger getWrappedLogger() { try { return EssentialsLogger.getLoggerProvider("EssentialsXMPP"); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/LoggerProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/LoggerProvider.java index aaba0c8b8..de6917dd0 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/LoggerProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/LoggerProvider.java @@ -1,11 +1,14 @@ package net.ess3.provider; -import java.util.logging.Level; -import java.util.logging.Logger; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginLogger; -public abstract class LoggerProvider extends Logger { - public LoggerProvider(final String name) { - super(name, null); +import java.util.logging.Level; +import java.util.logging.LogRecord; + +public abstract class LoggerProvider extends PluginLogger { + public LoggerProvider(final Plugin plugin) { + super(plugin); } protected abstract void doTheLog(Level level, String message, Throwable throwable); @@ -22,6 +25,11 @@ public abstract class LoggerProvider extends Logger { doTheLog(level, msg, thrown); } + @Override + public void log(LogRecord logRecord) { + doTheLog(logRecord.getLevel(), logRecord.getMessage(), logRecord.getThrown()); + } + @Override public void warning(String message) { doTheLog(Level.WARNING, message); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseLoggerProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseLoggerProvider.java index e65a3eba3..58d9862c4 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseLoggerProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseLoggerProvider.java @@ -1,6 +1,7 @@ package net.ess3.provider.providers; import net.ess3.provider.LoggerProvider; +import org.bukkit.plugin.Plugin; import java.util.logging.Level; import java.util.logging.Logger; @@ -8,8 +9,8 @@ import java.util.logging.Logger; public class BaseLoggerProvider extends LoggerProvider { private final Logger logger; - public BaseLoggerProvider(final Logger logger) { - super(logger.getName()); + public BaseLoggerProvider(final Plugin plugin, final Logger logger) { + super(plugin); this.logger = logger; } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperLoggerProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperLoggerProvider.java index 6fd7b31d1..e7be599b4 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperLoggerProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperLoggerProvider.java @@ -12,7 +12,7 @@ public class PaperLoggerProvider extends LoggerProvider { private final ComponentLogger logger; public PaperLoggerProvider(final Plugin plugin) { - super(plugin.getComponentLogger().getName()); + super(plugin); this.logger = plugin.getComponentLogger(); }