diff --git a/src/com/projectkorra/ProjectKorra/ProjectKorra.java b/src/com/projectkorra/ProjectKorra/ProjectKorra.java index 0fb0e523..0cc48f01 100644 --- a/src/com/projectkorra/ProjectKorra/ProjectKorra.java +++ b/src/com/projectkorra/ProjectKorra/ProjectKorra.java @@ -1,6 +1,8 @@ package com.projectkorra.ProjectKorra; +import java.io.File; import java.io.IOException; +import java.util.logging.Handler; import java.util.logging.Logger; import org.bukkit.Bukkit; @@ -13,6 +15,8 @@ import com.projectkorra.ProjectKorra.Ability.MultiAbility.MultiAbilityModuleMana import com.projectkorra.ProjectKorra.Objects.Preset; import com.projectkorra.ProjectKorra.Utilities.CraftingRecipes; import com.projectkorra.ProjectKorra.Utilities.Updater; +import com.projectkorra.ProjectKorra.Utilities.logging.PKFilter; +import com.projectkorra.ProjectKorra.Utilities.logging.PKLogHandler; import com.projectkorra.ProjectKorra.airbending.AirbendingManager; import com.projectkorra.ProjectKorra.chiblocking.ChiComboManager; import com.projectkorra.ProjectKorra.chiblocking.ChiblockingManager; @@ -26,12 +30,19 @@ public class ProjectKorra extends JavaPlugin { public static long time_step = 1; public static ProjectKorra plugin; public static Logger log; - + public static PKLogHandler handler; public Updater updater; @Override public void onEnable() { ProjectKorra.log = this.getLogger(); + try { + handler = new PKLogHandler(getDataFolder() + File.separator + "ERROR.log"); + log.getParent().setFilter(new PKFilter()); + log.getParent().addHandler(handler); + } catch (SecurityException | IOException e) { + e.printStackTrace(); + } plugin = this; new ConfigManager(this); new GeneralMethods(this); @@ -74,7 +85,6 @@ public class ProjectKorra extends JavaPlugin { metrics.start(); } catch (IOException e) { e.printStackTrace(); - GeneralMethods.logError(e); } GeneralMethods.deserializeFile(); @@ -89,9 +99,12 @@ public class ProjectKorra extends JavaPlugin { GeneralMethods.stopBending(); if (DBConnection.isOpen == false) return; DBConnection.sql.close(); + for (Handler handler : log.getHandlers()) { + handler.close(); + } } public void stopPlugin() { getServer().getPluginManager().disablePlugin(plugin); } -} \ No newline at end of file +} diff --git a/src/com/projectkorra/ProjectKorra/Utilities/logging/PKErrorFilter.java b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKErrorFilter.java new file mode 100644 index 00000000..6508e2af --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKErrorFilter.java @@ -0,0 +1,15 @@ +package com.projectkorra.ProjectKorra.Utilities.logging; + +import java.util.logging.LogRecord; + +public class PKErrorFilter extends PKFilter { + + @Override + public boolean isLoggable(LogRecord record) { + if (consoleError.contains(record.getMessage().replace("[ProjectKorra] ", ""))) { + return false; + } + return true; + } + +} diff --git a/src/com/projectkorra/ProjectKorra/Utilities/logging/PKFilter.java b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKFilter.java new file mode 100644 index 00000000..5bb8f80a --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKFilter.java @@ -0,0 +1,37 @@ +package com.projectkorra.ProjectKorra.Utilities.logging; + +import java.util.Arrays; +import java.util.List; +import java.util.logging.Filter; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +import com.projectkorra.ProjectKorra.ProjectKorra; + +public class PKFilter implements Filter { + + List consoleError = Arrays.asList( + "###################################################", + "##################====[ERROR]====##################", + " An error has been caught", + " Please check the ERROR.log file for stack trace.", + " Create a bug report with the log contents at.", + "http://projectkorra.com/forum/forums/bug-reports.6/", + "##################====[ERROR]====##################", + "###################################################" + ); + + @Override + public boolean isLoggable(LogRecord record) { + if (record.getLevel() == Level.SEVERE && record.getMessage().contains("ProjectKorra") && record.getThrown() != null) { + for (String line : consoleError) { + ProjectKorra.log.severe(line); + } + ProjectKorra.handler.publish(record); + ProjectKorra.handler.flush(); + return false; + } + return true; + } + +} diff --git a/src/com/projectkorra/ProjectKorra/Utilities/logging/PKFormatter.java b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKFormatter.java new file mode 100644 index 00000000..a7604898 --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKFormatter.java @@ -0,0 +1,34 @@ +package com.projectkorra.ProjectKorra.Utilities.logging; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.logging.Formatter; +import java.util.logging.LogRecord; + +public class PKFormatter extends Formatter { + +private final SimpleDateFormat date = new SimpleDateFormat("HH:mm:ss"); + + @Override + public String format(LogRecord record) { + StringBuilder builder = new StringBuilder(); + Throwable ex = record.getThrown(); + + builder.append(date.format(record.getMillis())); + builder.append(" ["); + builder.append(record.getLevel().getLocalizedName().toUpperCase()); + builder.append("] "); + builder.append(formatMessage(record)); + builder.append('\n'); + + if (ex != null) { + StringWriter writer = new StringWriter(); + ex.printStackTrace(new PrintWriter(writer)); + builder.append(writer); + } + + return builder.toString(); + } + +} diff --git a/src/com/projectkorra/ProjectKorra/Utilities/logging/PKLogHandler.java b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKLogHandler.java new file mode 100644 index 00000000..f657c66b --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Utilities/logging/PKLogHandler.java @@ -0,0 +1,16 @@ +package com.projectkorra.ProjectKorra.Utilities.logging; + +import java.io.IOException; +import java.util.logging.FileHandler; +import java.util.logging.Level; + +public class PKLogHandler extends FileHandler { + + public PKLogHandler(String filename) throws IOException { + super(filename); + this.setLevel(Level.WARNING); + this.setFilter(new PKErrorFilter()); + this.setFormatter(new PKFormatter()); + } + +}