diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java index 156bb508d..a34625b70 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java @@ -19,9 +19,7 @@ package org.jackhuang.hmcl.util; import org.jackhuang.hmcl.util.io.IOUtils; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.text.MessageFormat; @@ -60,10 +58,11 @@ public final class Logging { LOG.setLevel(Level.ALL); LOG.setUseParentHandlers(false); LOG.setFilter(record -> { - record.setMessage(filterForbiddenToken(record.getMessage())); + record.setMessage(format(record)); return true; }); + DefaultFormatter formatter = new DefaultFormatter(); try { if (Files.isRegularFile(logFolder)) Files.delete(logFolder); @@ -71,7 +70,7 @@ public final class Logging { Files.createDirectories(logFolder); FileHandler fileHandler = new FileHandler(logFolder.resolve("hmcl.log").toAbsolutePath().toString()); fileHandler.setLevel(Level.FINEST); - fileHandler.setFormatter(DefaultFormatter.INSTANCE); + fileHandler.setFormatter(formatter); fileHandler.setEncoding("UTF-8"); LOG.addHandler(fileHandler); } catch (IOException e) { @@ -79,11 +78,11 @@ public final class Logging { } ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setFormatter(DefaultFormatter.INSTANCE); + consoleHandler.setFormatter(formatter); consoleHandler.setLevel(Level.FINER); LOG.addHandler(consoleHandler); - StreamHandler streamHandler = new StreamHandler(storedLogs, DefaultFormatter.INSTANCE) { + StreamHandler streamHandler = new StreamHandler(storedLogs, formatter) { @Override public synchronized void publish(LogRecord record) { super.publish(record); @@ -104,7 +103,7 @@ public final class Logging { LOG.setUseParentHandlers(false); ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setFormatter(DefaultFormatter.INSTANCE); + consoleHandler.setFormatter(new DefaultFormatter()); consoleHandler.setLevel(Level.FINER); LOG.addHandler(consoleHandler); } @@ -121,23 +120,41 @@ public final class Logging { } } - private static final class DefaultFormatter extends Formatter { + private static final MessageFormat FORMAT = new MessageFormat("[{0,date,HH:mm:ss}] [{1}.{2}/{3}] {4}\n"); - static final DefaultFormatter INSTANCE = new DefaultFormatter(); - private static final MessageFormat format = new MessageFormat("[{0,date,HH:mm:ss}] [{1}.{2}/{3}] {4}\n"); + private static String format(LogRecord record) { + String message = filterForbiddenToken(record.getMessage()); - @Override - public String format(LogRecord record) { - String log = format.format(new Object[]{ - new Date(record.getMillis()), - record.getSourceClassName(), record.getSourceMethodName(), record.getLevel().getName(), - record.getMessage() - }, new StringBuffer(128), null).toString(); - if (record.getThrown() != null) - log += StringUtils.getStackTrace(record.getThrown()); + Throwable thrown = record.getThrown(); - return log; + StringWriter writer; + StringBuffer buffer; + if (thrown == null) { + writer = null; + buffer = new StringBuffer(256); + } else { + writer = new StringWriter(1024); + buffer = writer.getBuffer(); } + FORMAT.format(new Object[]{ + new Date(record.getMillis()), + record.getSourceClassName(), record.getSourceMethodName(), record.getLevel().getName(), + message + }, buffer, null); + + if (thrown != null) { + try (PrintWriter printWriter = new PrintWriter(writer)) { + thrown.printStackTrace(printWriter); + } + } + return buffer.toString(); + } + + private static final class DefaultFormatter extends Formatter { + @Override + public String format(LogRecord record) { + return record.getMessage(); + } } }