diff --git a/paper-api/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java b/paper-api/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java
new file mode 100644
index 0000000000..c78a359566
--- /dev/null
+++ b/paper-api/src/main/java/com/destroystokyo/paper/utils/PaperPluginLogger.java
@@ -0,0 +1,46 @@
+package com.destroystokyo.paper.utils;
+
+import io.papermc.paper.plugin.configuration.PluginMeta;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
+import org.bukkit.plugin.PluginDescriptionFile;
+import org.jspecify.annotations.NullMarked;
+
+/**
+ * Prevents plugins (e.g. Essentials) from changing the parent of the plugin logger.
+ */
+@NullMarked
+public class PaperPluginLogger extends Logger {
+
+    @Deprecated(forRemoval = true)
+    public static Logger getLogger(final PluginDescriptionFile description) {
+        return getLogger((PluginMeta) description);
+    }
+
+    public static Logger getLogger(final PluginMeta meta) {
+        Logger logger = new PaperPluginLogger(meta);
+        if (!LogManager.getLogManager().addLogger(logger)) {
+            // Disable this if it's going to happen across reloads anyways...
+            //logger.log(Level.WARNING, "Could not insert plugin logger - one was already found: {}", LogManager.getLogManager().getLogger(this.getName()));
+            logger = LogManager.getLogManager().getLogger(meta.getLoggerPrefix() != null ? meta.getLoggerPrefix() : meta.getName());
+        }
+
+        return logger;
+    }
+
+    private PaperPluginLogger(final PluginMeta meta) {
+        super(meta.getLoggerPrefix() != null ? meta.getLoggerPrefix() : meta.getName(), null);
+    }
+
+    @Override
+    public void setParent(final Logger parent) {
+        if (this.getParent() != null) {
+            this.warning("Ignoring attempt to change parent of plugin logger");
+        } else {
+            this.log(Level.FINE, "Setting plugin logger parent to {0}", parent);
+            super.setParent(parent);
+        }
+    }
+
+}
diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
index 801578de85..2d64fc065d 100644
--- a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
+++ b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
@@ -292,10 +292,10 @@ public abstract class JavaPlugin extends PluginBase {
             .orElseThrow();
     }
     public final void init(@NotNull PluginLoader loader, @NotNull Server server, @NotNull PluginDescriptionFile description, @NotNull File dataFolder, @NotNull File file, @NotNull ClassLoader classLoader) {
-        init(server, description, dataFolder, file, classLoader, description);
+        init(server, description, dataFolder, file, classLoader, description, com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(description));
         this.pluginMeta = description;
     }
-    public final void init(@NotNull Server server, @NotNull PluginDescriptionFile description, @NotNull File dataFolder, @NotNull File file, @NotNull ClassLoader classLoader, @Nullable io.papermc.paper.plugin.configuration.PluginMeta configuration) {
+    public final void init(@NotNull Server server, @NotNull PluginDescriptionFile description, @NotNull File dataFolder, @NotNull File file, @NotNull ClassLoader classLoader, @Nullable io.papermc.paper.plugin.configuration.PluginMeta configuration, @NotNull Logger logger) {
     // Paper end
         this.loader = DummyPluginLoaderImplHolder.INSTANCE; // Paper
         this.server = server;
@@ -305,7 +305,7 @@ public abstract class JavaPlugin extends PluginBase {
         this.classLoader = classLoader;
         this.configFile = new File(dataFolder, "config.yml");
         this.pluginMeta = configuration; // Paper
-        this.logger = Logger.getLogger(description.getPrefix() != null ? description.getPrefix() : description.getName()); // Paper - Handle plugin prefix in implementation
+        this.logger = logger; // Paper
     }
 
     /**
diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
index 58d20eff7e..8c5597e02d 100644
--- a/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
+++ b/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
@@ -67,6 +67,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm
         this.url = file.toURI().toURL();
         this.libraryLoader = libraryLoader;
 
+        this.logger = com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(description); // Paper - Register logger early
         // Paper start
         this.dependencyContext = dependencyContext;
         this.classLoaderGroup = io.papermc.paper.plugin.provider.classloader.PaperClassLoaderStorage.instance().registerSpigotGroup(this);
@@ -262,7 +263,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm
         pluginState = new IllegalStateException("Initial initialization");
         this.pluginInit = javaPlugin;
 
-        javaPlugin.init(null, org.bukkit.Bukkit.getServer(), description, dataFolder, file, this); // Paper
+        javaPlugin.init(org.bukkit.Bukkit.getServer(), description, dataFolder, file, this, description, this.logger); // Paper
     }
 
     // Paper start