From 7fe3e28a2d49b14a270af0637c7e6f75f64dbcaa Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Mon, 3 Jul 2017 08:46:35 +0800 Subject: [PATCH] Add default log4j config file for better performance --- HMCL/log4j.xml | 23 ---------- .../main/java/org/jackhuang/hmcl/Main.java | 22 +++++++++ .../jackhuang/hmcl/ui/LaunchingUIDaemon.java | 6 ++- .../hmcl/util/HMCLMinecraftLoader.java | 6 +++ .../org/jackhuang/hmcl/util/Log4jHandler.java | 46 +++++++++++++++---- .../resources/org/jackhuang/hmcl/log4j.xml | 25 ++++++++++ .../hmcl/core/launch/GameLauncher.java | 6 ++- 7 files changed, 99 insertions(+), 35 deletions(-) delete mode 100644 HMCL/log4j.xml create mode 100644 HMCL/src/main/resources/org/jackhuang/hmcl/log4j.xml diff --git a/HMCL/log4j.xml b/HMCL/log4j.xml deleted file mode 100644 index ef67b60ad..000000000 --- a/HMCL/log4j.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index 262918303..c3f7a6088 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -20,6 +20,7 @@ package org.jackhuang.hmcl; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.security.GeneralSecurityException; @@ -38,6 +39,7 @@ import org.jackhuang.hmcl.api.HMCLog; import org.jackhuang.hmcl.api.ILogger; import org.jackhuang.hmcl.api.PluginManager; import org.jackhuang.hmcl.api.VersionNumber; +import org.jackhuang.hmcl.core.MCUtils; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.ui.LogWindow; import org.jackhuang.hmcl.ui.MainFrame; @@ -207,6 +209,12 @@ public final class Main { } }); } + + try { + unpackDefaultLog4jConfiguration(); + } catch(IOException e) { + HMCLog.err("Failed to unpack log4j.xml, log window will not work well.", e); + } MainFrame.showMainFrame(); } @@ -215,6 +223,20 @@ public final class Main { public static void invokeUpdate() { MainFrame.INSTANCE.invokeUpdate(); } + + public static final File LOG4J_FILE = new File(MCUtils.getWorkingDirectory("hmcl"), "log4j.xml"); + + public static void unpackDefaultLog4jConfiguration() throws IOException { + LOG4J_FILE.getParentFile().mkdirs(); + if (LOG4J_FILE.exists()) return; + LOG4J_FILE.createNewFile(); + try (InputStream is = Main.class.getResourceAsStream("/org/jackhuang/hmcl/log4j.xml"); + FileOutputStream fos = new FileOutputStream(LOG4J_FILE)) { + int b; + while ((b = is.read()) != -1) + fos.write(b); + } + } public static ImageIcon getIcon(String path) { try { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java index 1b1686ec0..b9fdb1e76 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java @@ -76,7 +76,11 @@ public class LaunchingUIDaemon { PipedOutputStream os = new PipedOutputStream(); monitor.setTag(obj); try { - Log4jHandler handler = new Log4jHandler(os); + Log4jHandler handler = new Log4jHandler(monitor, os); + handler.addForbiddenToken(obj.getLoginResult().getAccessToken(), ""); + handler.addForbiddenToken(obj.getLoginResult().getSession(), ""); + handler.addForbiddenToken(obj.getLoginResult().getUserId(), ""); + handler.addForbiddenToken("Setting user: " + obj.getLoginResult().getUserName(), ""); handler.start(); } catch(Exception e) { HMCLog.err("", e); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/HMCLMinecraftLoader.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/HMCLMinecraftLoader.java index 69ba369e0..8cbf61049 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/HMCLMinecraftLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/HMCLMinecraftLoader.java @@ -41,5 +41,11 @@ public class HMCLMinecraftLoader extends MinecraftLoader { list.add("-Dminecraft.launcher.version=" + Main.LAUNCHER_VERSION); list.add("-Dminecraft.launcher.brand=" + Main.LAUNCHER_NAME); + + boolean flag = false; + for (String s : list) if (s.contains("-Dlog4j.configurationFile=")) flag = true; + if (!flag) { + list.add("-Dlog4j.configurationFile=" + Main.LOG4J_FILE.getAbsolutePath()); + } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/Log4jHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/Log4jHandler.java index 2e075b49f..e113c26de 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/Log4jHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/Log4jHandler.java @@ -22,9 +22,15 @@ import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.LinkedList; +import java.util.List; import javax.xml.parsers.ParserConfigurationException; +import org.jackhuang.hmcl.api.HMCLApi; +import org.jackhuang.hmcl.api.event.process.JavaProcessStoppedEvent; +import org.jackhuang.hmcl.api.func.Consumer; import org.jackhuang.hmcl.ui.LogWindow; import org.jackhuang.hmcl.util.log.Level; +import org.jackhuang.hmcl.util.sys.ProcessMonitor; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -36,19 +42,25 @@ import org.xml.sax.helpers.XMLReaderFactory; * * @author huang */ -public class Log4jHandler extends Thread { +public class Log4jHandler extends Thread implements Consumer { XMLReader reader; + ProcessMonitor monitor; PipedInputStream inputStream; PipedOutputStream outputStream; + List> forbiddenTokens = new LinkedList<>(); - public Log4jHandler(PipedOutputStream outputStream) throws ParserConfigurationException, IOException, SAXException { - /*SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setNamespaceAware(true); - .*/ + public Log4jHandler(ProcessMonitor monitor, PipedOutputStream outputStream) throws ParserConfigurationException, IOException, SAXException { reader = XMLReaderFactory.createXMLReader(); inputStream = new PipedInputStream(outputStream); this.outputStream = outputStream; + this.monitor = monitor; + + HMCLApi.EVENT_BUS.channel(JavaProcessStoppedEvent.class).register((Consumer) this); + } + + public void addForbiddenToken(String token, String replacement) { + forbiddenTokens.add(new Pair<>(token, replacement)); } @Override @@ -56,7 +68,6 @@ public class Log4jHandler extends Thread { try { outputStream.write("".getBytes()); outputStream.flush(); - //reader.parse(inputStream, new Log4jHandlerImpl()); reader.setContentHandler(new Log4jHandlerImpl()); reader.parse(new InputSource(inputStream)); } catch (SAXException | IOException e) { @@ -64,10 +75,23 @@ public class Log4jHandler extends Thread { } } + @Override + public void accept(JavaProcessStoppedEvent t) { + if (t.getSource() == monitor) { + try { + outputStream.write("".getBytes()); + outputStream.close(); + } catch (IOException ignore) { // won't happen + throw new Error(ignore); + } + } + } + class Log4jHandlerImpl extends DefaultHandler { private final SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); - String message = "", date = "", thread = "", logger = ""; + String date = "", thread = "", logger = ""; + StringBuilder message = null; Level l = null; boolean readingMessage = false; @@ -75,7 +99,7 @@ public class Log4jHandler extends Thread { public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { switch (localName) { case "log4j_Event": - message = ""; + message = new StringBuilder(); Date d = new Date(Long.valueOf(attributes.getValue("timestamp"))); date = df.format(d); try { @@ -98,7 +122,7 @@ public class Log4jHandler extends Thread { public void endElement(String uri, String localName, String qName) throws SAXException { switch (localName) { case "log4j_Event": - println("[" + date + "] [" + thread + "/" + l.name() + "] [" + logger + "] " + message, l); + println("[" + date + "] [" + thread + "/" + l.name() + "] [" + logger + "] " + message.toString(), l); break; case "log4j_Message": readingMessage = false; @@ -111,12 +135,14 @@ public class Log4jHandler extends Thread { String line = new String(ch, start, length); if (line.trim().isEmpty()) return; if (readingMessage) - message += line + C.LINE_SEPARATOR; + message.append(line).append(C.LINE_SEPARATOR); else println(line, Level.guessLevel(line)); } public void println(String message, Level l) { + for (Pair entry : forbiddenTokens) + message = message.replace(entry.key, entry.value); if (LogWindow.outputStream != null) LogWindow.outputStream.log(message, l); } diff --git a/HMCL/src/main/resources/org/jackhuang/hmcl/log4j.xml b/HMCL/src/main/resources/org/jackhuang/hmcl/log4j.xml new file mode 100644 index 000000000..609a674ff --- /dev/null +++ b/HMCL/src/main/resources/org/jackhuang/hmcl/log4j.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java index 800c86fde..313b291ba 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java @@ -163,7 +163,11 @@ public abstract class GameLauncher { } } HMCLog.log("Starting process"); - HMCLog.log(str.toString()); + String s = StrUtils.makeCommand(str); + s = s.replace(result.getAccessToken(), ""); + s = s.replace(result.getSession(), ""); + s = s.replace(result.getUserId(), ""); + HMCLog.log(s); ProcessBuilder builder = new ProcessBuilder(str); if (options.getLaunchVersion() == null || service.baseDirectory() == null) throw new Error("Fucking bug!");