diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index d31bf4efd..494dda7b3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -51,10 +51,9 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Launcher extends Application { @@ -71,7 +70,7 @@ public final class Launcher extends Application { Object pipeline = Class.forName("com.sun.prism.GraphicsPipeline").getMethod("getPipeline").invoke(null); LOG.info("Prism pipeline: " + (pipeline == null ? "null" : pipeline.getClass().getName())); } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to get prism pipeline", e); + LOG.warning("Failed to get prism pipeline", e); } try { @@ -80,7 +79,7 @@ public final class Launcher extends Application { } catch (SambaException ignored) { Main.showWarningAndContinue(i18n("fatal.samba")); } catch (IOException e) { - LOG.log(Level.SEVERE, "Failed to load config", e); + LOG.error("Failed to load config", e); checkConfigInTempDir(); checkConfigOwner(); Main.showErrorAndExit(i18n("fatal.config_loading_failure", ConfigHolder.configLocation().getParent())); @@ -165,7 +164,7 @@ public final class Launcher extends Application { private static void checkConfigInTempDir() { if (ConfigHolder.isNewlyCreated() && isConfigInTempDir() && showAlert(AlertType.WARNING, i18n("fatal.config_in_temp_dir"), ButtonType.YES, ButtonType.NO) == ButtonType.NO) { - System.exit(0); + Main.exit(0); } } @@ -178,7 +177,7 @@ public final class Launcher extends Application { try { owner = Files.getOwner(ConfigHolder.configLocation()).getName(); } catch (IOException ioe) { - LOG.log(Level.WARNING, "Failed to get file owner", ioe); + LOG.warning("Failed to get file owner", ioe); return; } @@ -203,17 +202,18 @@ public final class Launcher extends Application { Clipboard.getSystemClipboard() .setContent(Collections.singletonMap(DataFormat.PLAIN_TEXT, command)); } - System.exit(1); + Main.exit(1); } @Override public void stop() throws Exception { - super.stop(); Controllers.onApplicationStop(); + LOG.shutdown(); } public static void main(String[] args) { if (UpdateHandler.processArguments(args)) { + LOG.shutdown(); return; } @@ -231,6 +231,7 @@ public final class Launcher extends Application { LOG.info("Current Directory: " + System.getProperty("user.dir")); LOG.info("HMCL Directory: " + Metadata.HMCL_DIRECTORY); LOG.info("HMCL Jar Path: " + Lang.requireNonNullElse(JarUtils.thisJarPath(), "Not Found")); + LOG.info("HMCL Log File: " + Lang.requireNonNullElse(LOG.getLogFile(), "In Memory")); LOG.info("Memory: " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "MB"); LOG.info("Physical memory: " + OperatingSystem.TOTAL_MEMORY + " MB"); LOG.info("Metaspace: " + ManagementFactory.getMemoryPoolMXBeans().stream() diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index 1dee2d390..96ea37979 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -21,7 +21,6 @@ import javafx.application.Platform; import javafx.scene.control.Alert; import org.jackhuang.hmcl.ui.AwtUtils; import org.jackhuang.hmcl.util.FractureiserDetector; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.SelfDependencyPatcher; import org.jackhuang.hmcl.ui.SwingUtils; import org.jackhuang.hmcl.util.platform.JavaVersion; @@ -43,10 +42,9 @@ import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.util.Collections; import java.util.concurrent.CancellationException; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.thread; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Main { @@ -59,6 +57,8 @@ public final class Main { System.getProperties().putIfAbsent("javafx.autoproxy.disable", "true"); System.getProperties().putIfAbsent("http.agent", "HMCL/" + Metadata.VERSION); + LOG.start(Metadata.HMCL_DIRECTORY.resolve("logs")); + checkDirectoryPath(); if (JavaVersion.CURRENT_JAVA.getParsedVersion() < 9) @@ -68,8 +68,6 @@ public final class Main { if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX) initIcon(); - Logging.start(Metadata.HMCL_DIRECTORY.resolve("logs")); - checkJavaFX(); verifyJavaFX(); detectFractureiser(); @@ -77,6 +75,11 @@ public final class Main { Launcher.main(args); } + public static void exit(int exitCode) { + LOG.shutdown(); + System.exit(exitCode); + } + private static void initIcon() { java.awt.Image image = java.awt.Toolkit.getDefaultToolkit().getImage(Main.class.getResource("/assets/img/icon@8x.png")); AwtUtils.setAppleIcon(image); @@ -93,7 +96,7 @@ public final class Main { private static void detectFractureiser() { if (FractureiserDetector.detect()) { - LOG.log(Level.SEVERE, "Detected that this computer is infected by fractureiser"); + LOG.error("Detected that this computer is infected by fractureiser"); showErrorAndExit(i18n("fatal.fractureiser")); } } @@ -102,14 +105,14 @@ public final class Main { try { SelfDependencyPatcher.patch(); } catch (SelfDependencyPatcher.PatchException e) { - LOG.log(Level.SEVERE, "unable to patch JVM", e); + LOG.error("unable to patch JVM", e); showErrorAndExit(i18n("fatal.javafx.missing")); } catch (SelfDependencyPatcher.IncompatibleVersionException e) { - LOG.log(Level.SEVERE, "unable to patch JVM", e); + LOG.error("unable to patch JVM", e); showErrorAndExit(i18n("fatal.javafx.incompatible")); } catch (CancellationException e) { - LOG.log(Level.SEVERE, "User cancels downloading JavaFX", e); - System.exit(0); + LOG.error("User cancels downloading JavaFX", e); + exit(0); } } @@ -136,13 +139,13 @@ public final class Main { try { if (Platform.isFxApplicationThread()) { new Alert(Alert.AlertType.ERROR, message).showAndWait(); - System.exit(1); + exit(1); } } catch (Throwable ignored) { } SwingUtils.showErrorDialog(message); - System.exit(1); + exit(1); } /** @@ -192,7 +195,7 @@ public final class Main { LOG.info("Added Lets Encrypt root certificates as additional trust"); } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | KeyManagementException e) { - LOG.log(Level.SEVERE, "Failed to load lets encrypt certificate. Expect problems", e); + LOG.error("Failed to load lets encrypt certificate. Expect problems", e); } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java b/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java index 66668719b..a18d405f7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java @@ -1,7 +1,6 @@ package org.jackhuang.hmcl.countly; import org.jackhuang.hmcl.Metadata; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.OperatingSystem; @@ -13,6 +12,7 @@ import java.util.Map; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Pair.pair; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class CrashReport { @@ -59,7 +59,7 @@ public class CrashReport { pair("_ram_current", getMemoryAvailable()), pair("_ram_total", Runtime.getRuntime().maxMemory() / BYTES_IN_MB), pair("_error", stackTrace), - pair("_logs", Logging.getLogs()), + pair("_logs", LOG.getLogs()), pair("_name", throwable.getLocalizedMessage()), pair("_nonfatal", nonFatal) ); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameLauncher.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameLauncher.java index 2034f8ac5..fd2751db0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameLauncher.java @@ -21,7 +21,6 @@ import org.jackhuang.hmcl.Metadata; import org.jackhuang.hmcl.auth.AuthInfo; import org.jackhuang.hmcl.launch.DefaultLauncher; import org.jackhuang.hmcl.launch.ProcessListener; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.platform.ManagedProcess; @@ -30,7 +29,8 @@ import org.jackhuang.hmcl.util.versioning.GameVersionNumber; import java.io.File; import java.io.IOException; import java.util.Map; -import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author huangyuhui @@ -96,7 +96,7 @@ public final class HMCLGameLauncher extends DefaultLauncher { try { FileUtils.writeText(optionsFile, String.format("lang:%s\n", lang)); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Unable to generate options.txt", e); + LOG.warning("Unable to generate options.txt", e); } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 41b502af7..4cbff8d75 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -50,12 +50,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; import java.util.*; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.jackhuang.hmcl.setting.ConfigHolder.config; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; public class HMCLGameRepository extends DefaultGameRepository { @@ -124,7 +123,7 @@ public class HMCLGameRepository extends DefaultGameRepository { if (!file.exists() && !versions.isEmpty()) FileUtils.writeText(file, PROFILE); } catch (IOException ex) { - LOG.log(Level.WARNING, "Unable to create launcher_profiles.json, Forge/LiteLoader installer will not work.", ex); + LOG.warning("Unable to create launcher_profiles.json, Forge/LiteLoader installer will not work.", ex); } // https://github.com/HMCL-dev/HMCL/issues/938 @@ -319,7 +318,7 @@ public class HMCLGameRepository extends DefaultGameRepository { try (InputStream inputStream = new FileInputStream(iconFile.get())) { return new Image(inputStream); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to load version icon of " + id, e); + LOG.warning("Failed to load version icon of " + id, e); } } @@ -358,7 +357,7 @@ public class HMCLGameRepository extends DefaultGameRepository { FileUtils.writeText(file, GSON.toJson(localVersionSettings.get(id))); return true; } catch (IOException e) { - LOG.log(Level.SEVERE, "Unable to save version setting of " + id, e); + LOG.error("Unable to save version setting of " + id, e); return false; } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index a73dbe374..1ad8fbf86 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -60,13 +60,12 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; -import java.util.logging.Level; import java.util.stream.Collectors; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.util.Lang.resolveException; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -112,7 +111,7 @@ public final class LauncherHelper { public void launch() { FXUtils.checkFxUserThread(); - Logging.LOG.info("Launching game version: " + selectedVersion); + LOG.info("Launching game version: " + selectedVersion); Controllers.dialog(launchingStepsPane); launch0(); @@ -389,7 +388,7 @@ public final class LauncherHelper { future.complete(downloadedJavaVersion); }) .exceptionally(throwable -> { - LOG.log(Level.WARNING, "Failed to download java", throwable); + LOG.warning("Failed to download java", throwable); Controllers.confirm(i18n("launch.failed.no_accepted_java"), i18n("message.warning"), MessageType.WARNING, continueAction, () -> { future.completeExceptionally(new CancellationException("No accepted java")); }); @@ -452,7 +451,7 @@ public final class LauncherHelper { future.complete(downloadedJavaVersion); }, Schedulers.javafx()) .whenCompleteAsync((result, throwable) -> { - LOG.log(Level.WARNING, "Failed to download java", throwable); + LOG.warning("Failed to download java", throwable); breakAction.run(); }, Schedulers.javafx()); return Task.fromCompletableFuture(future); @@ -605,7 +604,7 @@ public final class LauncherHelper { .thenAcceptAsync(future::complete) .exceptionally(throwable -> { Throwable resolvedException = resolveException(throwable); - LOG.log(Level.WARNING, "Failed to download java", throwable); + LOG.warning("Failed to download java", throwable); if (!(resolvedException instanceof CancellationException)) { Controllers.dialog(DownloadProviders.localizeErrorMessage(resolvedException), i18n("install.failed")); } @@ -644,11 +643,11 @@ public final class LauncherHelper { try { return Task.completed(account.logIn()); } catch (CredentialExpiredException e) { - LOG.log(Level.INFO, "Credential has expired", e); + LOG.info("Credential has expired", e); return Task.completed(DialogController.logIn(account)); } catch (AuthenticationException e) { - LOG.log(Level.WARNING, "Authentication failed, try skipping refresh", e); + LOG.warning("Authentication failed, try skipping refresh", e); CompletableFuture> future = new CompletableFuture<>(); runInFX(() -> { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java index fbd57914e..fc934b1fb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java @@ -27,10 +27,9 @@ import org.jackhuang.hmcl.util.StringUtils; import java.io.IOException; import java.nio.file.Path; import java.util.*; -import java.util.logging.Level; import java.util.stream.Stream; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public abstract class LocalizedRemoteModRepository implements RemoteModRepository { private static final int CONTAIN_CHINESE_WEIGHT = 10; @@ -69,7 +68,7 @@ public abstract class LocalizedRemoteModRepository implements RemoteModRepositor SearchResult searchResult = getBackedRemoteModRepository().search(gameVersion, category, pageOffset, pageSize, String.join(" ", englishSearchFiltersSet), getBackedRemoteModRepositorySortOrder(), sortOrder); for (Iterator iterator = searchResult.getUnsortedResults().iterator(); iterator.hasNext(); ) { if (chineseIndex > englishIndex) { - LOG.log(Level.WARNING, "Too many search results! Are the backed remote mod repository broken? Or are the API broken?"); + LOG.warning("Too many search results! Are the backed remote mod repository broken? Or are the API broken?"); continue; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java index f5de09062..4474750e3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java @@ -17,7 +17,7 @@ */ package org.jackhuang.hmcl.game; -import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.Zipper; @@ -35,9 +35,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class LogExporter { private LogExporter() { @@ -70,9 +69,9 @@ public final class LogExporter { processLogs(runDirectory, "*.log", "runDirectory", zipper); processLogs(runDirectory.resolve("crash-reports"), "*.txt", "crash-reports", zipper); - zipper.putTextFile(Logging.getLogs(), "hmcl.log"); + zipper.putTextFile(LOG.getLogs(), "hmcl.log"); zipper.putTextFile(logs, "minecraft.log"); - zipper.putTextFile(Logging.filterForbiddenToken(launchScript), OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS ? "launch.bat" : "launch.sh"); + zipper.putTextFile(Logger.filterForbiddenToken(launchScript), OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS ? "launch.bat" : "launch.sh"); for (String id : versions) { Path versionJson = baseDirectory.resolve("versions").resolve(id).resolve(id + ".json"); @@ -95,16 +94,16 @@ public final class LogExporter { FileTime time = Files.readAttributes(file, BasicFileAttributes.class).lastModifiedTime(); if (time.toMillis() >= processStartTime) { try { - String crashLog = Logging.filterForbiddenToken(FileUtils.readText(file, OperatingSystem.NATIVE_CHARSET)); + String crashLog = Logger.filterForbiddenToken(FileUtils.readText(file, OperatingSystem.NATIVE_CHARSET)); zipper.putTextFile(crashLog, file.getFileName().toString()); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to read log file: " + file, e); + LOG.warning("Failed to read log file: " + file, e); } } } } } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to find any log on " + logDirectory, e); + LOG.warning("Failed to find any log on " + logDirectory, e); } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/OAuthServer.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/OAuthServer.java index 7f309ec99..de7849c3a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/OAuthServer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/OAuthServer.java @@ -23,7 +23,6 @@ import org.jackhuang.hmcl.auth.OAuth; import org.jackhuang.hmcl.event.Event; import org.jackhuang.hmcl.event.EventManager; import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.io.JarUtils; @@ -34,10 +33,10 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.thread; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class OAuthServer extends NanoHTTPD implements OAuth.Session { @@ -80,7 +79,7 @@ public final class OAuthServer extends NanoHTTPD implements OAuth.Session { try { session.parseBody(files); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to read post data", e); + LOG.warning("Failed to read post data", e); return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_HTML, ""); } catch (ResponseException re) { return newFixedLengthResponse(re.getStatus(), MIME_PLAINTEXT, re.getMessage()); @@ -97,7 +96,7 @@ public final class OAuthServer extends NanoHTTPD implements OAuth.Session { idToken = query.get("id_token"); future.complete(query.get("code")); } else { - Logging.LOG.warning("Error: " + parameters); + LOG.warning("Error: " + parameters); future.completeExceptionally(new AuthenticationException("failed to authenticate")); } @@ -106,7 +105,7 @@ public final class OAuthServer extends NanoHTTPD implements OAuth.Session { html = IOUtils.readFullyAsString(OAuthServer.class.getResourceAsStream("/assets/microsoft_auth.html")) .replace("%close-page%", i18n("account.methods.microsoft.close_page")); } catch (IOException e) { - Logging.LOG.log(Level.SEVERE, "Failed to load html"); + LOG.error("Failed to load html", e); return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_HTML, ""); } thread(() -> { @@ -114,7 +113,7 @@ public final class OAuthServer extends NanoHTTPD implements OAuth.Session { Thread.sleep(1000); stop(); } catch (InterruptedException e) { - Logging.LOG.log(Level.SEVERE, "Failed to sleep for 1 second"); + LOG.error("Failed to sleep for 1 second"); } }); return newFixedLengthResponse(Response.Status.OK, "text/html; charset=UTF-8", html); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java index 764396e35..d314869ee 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java @@ -52,13 +52,12 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; import static java.util.Objects.requireNonNull; import static org.jackhuang.hmcl.util.Lang.threadPool; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author yushijinhun @@ -116,7 +115,7 @@ public final class TexturesLoader { } catch (Exception e) { if (Files.isRegularFile(file)) { // concurrency conflict? - LOG.log(Level.WARNING, "Failed to download texture " + texture.getUrl() + ", but the file is available", e); + LOG.warning("Failed to download texture " + texture.getUrl() + ", but the file is available", e); } else { throw new IOException("Failed to download texture " + texture.getUrl()); } @@ -175,7 +174,7 @@ public final class TexturesLoader { try { return YggdrasilService.getTextures(it); } catch (ServerResponseMalformedException e) { - LOG.log(Level.WARNING, "Failed to parse texture payload", e); + LOG.warning("Failed to parse texture payload", e); return Optional.empty(); } }) @@ -188,7 +187,7 @@ public final class TexturesLoader { try { return loadTexture(texture); } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to load texture " + texture.getUrl() + ", using fallback texture", e); + LOG.warning("Failed to load texture " + texture.getUrl() + ", using fallback texture", e); return uuidFallback; } }, POOL); @@ -212,7 +211,7 @@ public final class TexturesLoader { if (skin != null) { skin.load(username).setExecutor(POOL).whenComplete(Schedulers.javafx(), (result, exception) -> { if (exception != null) { - LOG.log(Level.WARNING, "Failed to load texture", exception); + LOG.warning("Failed to load texture", exception); } else if (result != null && result.getSkin() != null && result.getSkin().getImage() != null) { Map metadata; if (result.getModel() != null) { @@ -243,7 +242,7 @@ public final class TexturesLoader { try { return loadTexture(texture); } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to load texture " + texture.getUrl() + ", using fallback texture", e); + LOG.warning("Failed to load texture " + texture.getUrl() + ", using fallback texture", e); return uuidFallback; } }, POOL); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index fa240c8e2..c96b56cfa 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -47,7 +47,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.logging.Level; import static java.util.stream.Collectors.toList; import static javafx.collections.FXCollections.observableArrayList; @@ -55,7 +54,7 @@ import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; import static org.jackhuang.hmcl.util.Lang.immutableListOf; import static org.jackhuang.hmcl.util.Lang.mapOf; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -72,7 +71,7 @@ public final class Accounts { try { ((AuthlibInjectorDownloader) AUTHLIB_INJECTOR_DOWNLOADER).checkUpdate(); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to check update for authlib-injector", e); + LOG.warning("Failed to check update for authlib-injector", e); } }); } @@ -178,7 +177,7 @@ public final class Accounts { Config.CONFIG_GSON.fromJson(reader, new TypeToken>>() { }.getType())); } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to load global accounts", e); + LOG.warning("Failed to load global accounts", e); } } @@ -190,7 +189,7 @@ public final class Accounts { FileUtils.saveSafely(globalAccountsFile, json); } } catch (IOException e) { - LOG.log(Level.SEVERE, "Failed to save global accounts", e); + LOG.error("Failed to save global accounts", e); } } }); @@ -209,7 +208,7 @@ public final class Accounts { try { return factory.fromStorage(storage); } catch (Exception e) { - LOG.log(Level.WARNING, "Failed to load account: " + storage, e); + LOG.warning("Failed to load account: " + storage, e); return null; } } @@ -321,7 +320,7 @@ public final class Accounts { try { finalSelected.logIn(); } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to log " + finalSelected + " in", e); + LOG.warning("Failed to log " + finalSelected + " in", e); } }); } @@ -335,7 +334,7 @@ public final class Accounts { try { server.fetchMetadataResponse(); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to fetch authlib-injector server metdata: " + server, e); + LOG.warning("Failed to fetch authlib-injector server metdata: " + server, e); } }); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java index 3d765399a..d059c6484 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java @@ -34,10 +34,9 @@ import java.nio.file.Paths; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; -import java.util.logging.Level; import static org.jackhuang.hmcl.setting.ConfigHolder.config; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class AuthlibInjectorServers implements Validation { @@ -77,7 +76,7 @@ public final class AuthlibInjectorServers implements Validation { String content = FileUtils.readText(configLocation); configInstance = JsonUtils.GSON.fromJson(content, AuthlibInjectorServers.class); } catch (IOException | JsonParseException e) { - LOG.log(Level.WARNING, "Malformed authlib-injectors.json", e); + LOG.warning("Malformed authlib-injectors.json", e); return; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index 8011acfb4..cbd034e95 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -29,9 +29,8 @@ import org.jackhuang.hmcl.util.platform.OperatingSystem; import java.io.IOException; import java.nio.file.*; import java.util.Locale; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class ConfigHolder { @@ -81,7 +80,7 @@ public final class ConfigHolder { configLocation = locateConfig(); - LOG.log(Level.INFO, "Config location: " + configLocation); + LOG.info("Config location: " + configLocation); configInstance = loadConfig(); configInstance.addListener(source -> markConfigDirty()); @@ -91,6 +90,7 @@ public final class ConfigHolder { Locale.setDefault(config().getLocalization().getLocale()); I18n.setLocale(configInstance.getLocalization()); + LOG.setLogRetention(globalConfig().getLogRetention()); Settings.init(); if (newlyCreated) { @@ -101,7 +101,7 @@ public final class ConfigHolder { try { Files.setAttribute(configLocation, "dos:hidden", true); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to set hidden attribute of " + configLocation, e); + LOG.warning("Failed to set hidden attribute of " + configLocation, e); } } } @@ -161,7 +161,7 @@ public final class ConfigHolder { ownerChanged = true; } } catch (IOException e1) { - LOG.log(Level.WARNING, "Failed to get owner"); + LOG.warning("Failed to get owner"); } try { String content = FileUtils.readText(configLocation); @@ -173,7 +173,7 @@ public final class ConfigHolder { return deserialized; } } catch (JsonParseException e) { - LOG.log(Level.WARNING, "Malformed config.", e); + LOG.warning("Malformed config.", e); } } @@ -186,7 +186,7 @@ public final class ConfigHolder { try { writeToConfig(content); } catch (IOException e) { - LOG.log(Level.SEVERE, "Failed to save config", e); + LOG.error("Failed to save config", e); } }); @@ -218,7 +218,7 @@ public final class ConfigHolder { return deserialized; } } catch (JsonParseException e) { - LOG.log(Level.WARNING, "Malformed config.", e); + LOG.warning("Malformed config.", e); } } @@ -230,7 +230,7 @@ public final class ConfigHolder { try { writeToGlobalConfig(content); } catch (IOException e) { - LOG.log(Level.SEVERE, "Failed to save config", e); + LOG.error("Failed to save config", e); } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java index 1a034979c..cade4d8c7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java @@ -23,10 +23,9 @@ import org.jackhuang.hmcl.util.StringUtils; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.tryCast; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; final class ConfigUpgrader { private ConfigUpgrader() { @@ -48,12 +47,12 @@ final class ConfigUpgrader { } if (configVersion > CURRENT_VERSION) { - LOG.log(Level.WARNING, String.format("Current HMCL only support the configuration version up to %d. However, the version now is %d.", CURRENT_VERSION, configVersion)); + LOG.warning(String.format("Current HMCL only support the configuration version up to %d. However, the version now is %d.", CURRENT_VERSION, configVersion)); deserialized.setConfigVersion(CURRENT_VERSION); return; } - LOG.log(Level.INFO, String.format("Updating configuration from %d to %d.", configVersion, CURRENT_VERSION)); + LOG.info(String.format("Updating configuration from %d to %d.", configVersion, CURRENT_VERSION)); Map rawJson = Collections.unmodifiableMap(new Gson().>fromJson(rawContent, Map.class)); if (configVersion < 1) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java index 13d209555..07153f399 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java @@ -49,6 +49,8 @@ public final class GlobalConfig implements Cloneable, Observable { private final IntegerProperty platformPromptVersion = new SimpleIntegerProperty(); + private final IntegerProperty logRetention = new SimpleIntegerProperty(); + private final Map unknownFields = new HashMap<>(); private final transient ObservableHelper helper = new ObservableHelper(this); @@ -100,10 +102,23 @@ public final class GlobalConfig implements Cloneable, Observable { this.platformPromptVersion.set(platformPromptVersion); } + public int getLogRetention() { + return logRetention.get(); + } + + public IntegerProperty logRetentionProperty() { + return logRetention; + } + + public void setLogRetention(int logRetention) { + this.logRetention.set(logRetention); + } + public static final class Serializer implements JsonSerializer, JsonDeserializer { private static final Set knownFields = new HashSet<>(Arrays.asList( "agreementVersion", - "platformPromptVersion" + "platformPromptVersion", + "logRetention" )); @Override @@ -115,6 +130,7 @@ public final class GlobalConfig implements Cloneable, Observable { JsonObject jsonObject = new JsonObject(); jsonObject.add("agreementVersion", context.serialize(src.getAgreementVersion())); jsonObject.add("platformPromptVersion", context.serialize(src.getPlatformPromptVersion())); + jsonObject.add("logRetention", context.serialize(src.getLogRetention())); for (Map.Entry entry : src.unknownFields.entrySet()) { jsonObject.add(entry.getKey(), context.serialize(entry.getValue())); } @@ -131,6 +147,7 @@ public final class GlobalConfig implements Cloneable, Observable { GlobalConfig config = new GlobalConfig(); config.setAgreementVersion(Optional.ofNullable(obj.get("agreementVersion")).map(JsonElement::getAsInt).orElse(0)); config.setPlatformPromptVersion(Optional.ofNullable(obj.get("platformPromptVersion")).map(JsonElement::getAsInt).orElse(0)); + config.setLogRetention(Optional.ofNullable(obj.get("logRetention")).map(JsonElement::getAsInt).orElse(20)); for (Map.Entry entry : obj.entrySet()) { if (!knownFields.contains(entry.getKey())) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java index e5eddfd72..aa67a6ea1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -29,7 +29,7 @@ import java.net.Proxy; import java.net.Proxy.Type; import static org.jackhuang.hmcl.setting.ConfigHolder.config; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class ProxyManager { private ProxyManager() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java index 2f14a5834..a37f0cef2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java @@ -25,7 +25,6 @@ import javafx.beans.binding.ObjectBinding; import javafx.scene.paint.Color; import javafx.scene.text.Font; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.IOUtils; @@ -40,11 +39,11 @@ import java.nio.file.Paths; import java.util.Locale; import java.util.Objects; import java.util.Optional; -import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; import static org.jackhuang.hmcl.setting.ConfigHolder.config; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; @JsonAdapter(Theme.TypeAdapter.class) public class Theme { @@ -183,7 +182,7 @@ public class Theme { temp.deleteOnExit(); css = temp.toURI().toString(); } catch (IOException | NullPointerException e) { - Logging.LOG.log(Level.SEVERE, "Unable to create theme stylesheet. Fallback to blue theme.", e); + LOG.error("Unable to create theme stylesheet. Fallback to blue theme.", e); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index 9975f47d2..af9c01d4a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -61,6 +61,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import static org.jackhuang.hmcl.setting.ConfigHolder.*; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Controllers { @@ -165,7 +166,7 @@ public final class Controllers { } public static void initialize(Stage stage) { - Logging.LOG.info("Start initializing application"); + LOG.info("Start initializing application"); Controllers.stage = stage; @@ -298,7 +299,7 @@ public final class Controllers { }); JFXButton noButton = new JFXButton(i18n("launcher.agreement.decline")); noButton.getStyleClass().add("dialog-cancel"); - noButton.setOnAction(e -> System.exit(1)); + noButton.setOnAction(e -> javafx.application.Platform.exit()); agreementPane.setActions(agreementLink, yesButton, noButton); Controllers.dialog(agreementPane); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java index a3f85c619..c1f7158d4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java @@ -72,7 +72,7 @@ public class CrashWindow extends Stage { FXUtils.setIcon(this); setTitle(i18n("message.error")); - setOnCloseRequest(e -> System.exit(1)); + setOnCloseRequest(e -> javafx.application.Platform.exit()); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index 557db5c4c..0cb5c433f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -55,7 +55,6 @@ import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.animation.AnimationUtils; import org.jackhuang.hmcl.ui.construct.JFXHyperlink; import org.jackhuang.hmcl.util.Holder; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.ResourceNotFoundError; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.javafx.ExtendedProperties; @@ -88,12 +87,11 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Function; -import java.util.logging.Level; import java.util.stream.Collectors; import static org.jackhuang.hmcl.util.Lang.thread; import static org.jackhuang.hmcl.util.Lang.tryCast; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class FXUtils { @@ -110,7 +108,7 @@ public final class FXUtils { try { Files.deleteIfExists(entry.getValue()); } catch (IOException e) { - LOG.log(Level.WARNING, String.format("Failed to delete cache file %s.", entry.getValue()), e); + LOG.warning(String.format("Failed to delete cache file %s.", entry.getValue()), e); } remoteImageCache.remove(entry.getKey()); } @@ -337,7 +335,7 @@ public final class FXUtils { Tooltip.class.getMethod("setHideDelay", Duration.class).invoke(tooltip, new Duration(closeDelay)); } catch (ReflectiveOperationException e2) { e.addSuppressed(e2); - Logging.LOG.log(Level.SEVERE, "Cannot install tooltip", e); + LOG.error("Cannot install tooltip", e); } Tooltip.install(node, tooltip); } @@ -370,7 +368,7 @@ public final class FXUtils { public static void openFolder(File file) { if (!FileUtils.makeDirectory(file)) { - LOG.log(Level.SEVERE, "Unable to make directory " + file); + LOG.error("Unable to make directory " + file); return; } @@ -397,7 +395,7 @@ public final class FXUtils { else LOG.warning("Open " + path + " failed with code " + exitCode); } catch (Throwable e) { - LOG.log(Level.WARNING, "Unable to open " + path + " by executing " + openCommand, e); + LOG.warning("Unable to open " + path + " by executing " + openCommand, e); } } @@ -405,7 +403,7 @@ public final class FXUtils { try { java.awt.Desktop.getDesktop().open(file); } catch (Throwable e) { - LOG.log(Level.SEVERE, "Unable to open " + path + " by java.awt.Desktop.getDesktop()::open", e); + LOG.error("Unable to open " + path + " by java.awt.Desktop.getDesktop()::open", e); } }); } @@ -432,7 +430,7 @@ public final class FXUtils { else LOG.warning("Show " + path + " in explorer failed with code " + exitCode); } catch (Throwable e) { - LOG.log(Level.WARNING, "Unable to show " + path + " in explorer", e); + LOG.warning("Unable to show " + path + " in explorer", e); } // Fallback to open folder @@ -469,7 +467,7 @@ public final class FXUtils { Runtime.getRuntime().exec(new String[]{"rundll32.exe", "url.dll,FileProtocolHandler", link}); return; } catch (Throwable e) { - LOG.log(Level.WARNING, "An exception occurred while calling rundll32", e); + LOG.warning("An exception occurred while calling rundll32", e); } } if (OperatingSystem.CURRENT_OS.isLinuxOrBSD()) { @@ -481,7 +479,7 @@ public final class FXUtils { } } catch (Throwable ignored) { } - Logging.LOG.log(Level.WARNING, "No known browser found"); + LOG.warning("No known browser found"); } } try { @@ -491,9 +489,9 @@ public final class FXUtils { try { Runtime.getRuntime().exec(new String[]{"/usr/bin/open", link}); } catch (IOException ex) { - Logging.LOG.log(Level.WARNING, "Unable to open link: " + link, ex); + LOG.warning("Unable to open link: " + link, ex); } - Logging.LOG.log(Level.WARNING, "Failed to open link: " + link, e); + LOG.warning("Failed to open link: " + link, e); } }); } @@ -509,7 +507,7 @@ public final class FXUtils { stage.setTitle(title); stage.showAndWait(); } catch (NoClassDefFoundError | UnsatisfiedLinkError e) { - LOG.log(Level.WARNING, "WebView is missing or initialization failed, use JEditorPane replaced", e); + LOG.warning("WebView is missing or initialization failed, use JEditorPane replaced", e); SwingUtils.initLookAndFeel(); SwingUtilities.invokeLater(() -> { @@ -761,7 +759,7 @@ public final class FXUtils { try (InputStream inputStream = Files.newInputStream(currentPath)) { return new Image(inputStream, requestedWidth, requestedHeight, preserveRatio, smooth); } catch (IOException e) { - LOG.log(Level.WARNING, "An exception encountered while reading data from cached image file.", e); + LOG.warning("An exception encountered while reading data from cached image file.", e); } } @@ -771,7 +769,7 @@ public final class FXUtils { try { Files.deleteIfExists(currentPath); } catch (IOException e) { - LOG.log(Level.WARNING, "An exception encountered while deleting broken cached image file.", e); + LOG.warning("An exception encountered while deleting broken cached image file.", e); } } @@ -968,7 +966,7 @@ public final class FXUtils { } return texts; } catch (SAXException | ParserConfigurationException | IOException e) { - LOG.log(Level.WARNING, "Failed to parse xml", e); + LOG.warning("Failed to parse xml", e); return Collections.singletonList(new Text(segment)); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index 969deecf2..e23194547 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -44,7 +44,7 @@ import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.construct.TwoLineListItem; import org.jackhuang.hmcl.util.Log4jLevel; -import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.Pair; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -61,14 +61,13 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -132,7 +131,7 @@ public class GameCrashWindow extends Stage { try { crashReport = CrashReportAnalyzer.findCrashReport(rawLog); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to read crash report", e); + LOG.warning("Failed to read crash report", e); } if (crashReport == null) { crashReport = CrashReportAnalyzer.extractCrashReport(rawLog); @@ -149,7 +148,7 @@ public class GameCrashWindow extends Stage { try { log = FileUtils.readText(latestLog); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to read logs/latest.log", e); + LOG.warning("Failed to read logs/latest.log", e); return pair(new HashSet(), new HashSet()); } @@ -158,7 +157,7 @@ public class GameCrashWindow extends Stage { loading.set(false); if (exception != null) { - LOG.log(Level.WARNING, "Failed to analyze crash report", exception); + LOG.warning("Failed to analyze crash report", exception); reasonTextFlow.getChildren().setAll(FXUtils.parseSegment(i18n("game.crash.reason.unknown"), Controllers::onHyperlinkAction)); } else { EnumMap results = new EnumMap<>(CrashReportAnalyzer.Rule.class); @@ -172,7 +171,7 @@ public class GameCrashWindow extends Stage { List segments = new ArrayList<>(FXUtils.parseSegment(i18n("game.crash.feedback"), Controllers::onHyperlinkAction)); - LOG.log(Level.INFO, "Number of reasons: " + results.size()); + LOG.info("Number of reasons: " + results.size()); if (results.size() > 1) { segments.add(new Text("\n")); segments.addAll(FXUtils.parseSegment(i18n("game.crash.reason.multiple"), Controllers::onHyperlinkAction)); @@ -204,7 +203,7 @@ public class GameCrashWindow extends Stage { case PERFORMANT_FOREST_OPTIFINE: case JADE_FOREST_OPTIFINE: message = i18n("game.crash.reason.mod", "OptiFine"); - LOG.log(Level.INFO, "Crash cause: " + result.getRule() + ": " + i18n("game.crash.reason.mod", "OptiFine")); + LOG.info("Crash cause: " + result.getRule() + ": " + i18n("game.crash.reason.mod", "OptiFine")); break; default: message = i18n("game.crash.reason." + result.getRule().name().toLowerCase(Locale.ROOT), @@ -212,17 +211,17 @@ public class GameCrashWindow extends Stage { .toArray()); break; } - LOG.log(Level.INFO, "Crash cause: " + result.getRule() + ": " + message); + LOG.info("Crash cause: " + result.getRule() + ": " + message); segments.addAll(FXUtils.parseSegment(message, Controllers::onHyperlinkAction)); segments.add(new Text("\n\n")); } if (results.isEmpty()) { if (!keywords.isEmpty()) { reasonTextFlow.getChildren().setAll(new Text(i18n("game.crash.reason.stacktrace", String.join(", ", keywords)))); - LOG.log(Level.INFO, "Crash reason unknown, but some log keywords have been found: " + String.join(", ", keywords)); + LOG.info("Crash reason unknown, but some log keywords have been found: " + String.join(", ", keywords)); } else { reasonTextFlow.getChildren().setAll(FXUtils.parseSegment(i18n("game.crash.reason.unknown"), Controllers::onHyperlinkAction)); - LOG.log(Level.INFO, "Crash reason unknown"); + LOG.info("Crash reason unknown"); } } else { feedbackTextFlow.setVisible(false); @@ -264,7 +263,7 @@ public class GameCrashWindow extends Stage { private void showLogWindow() { LogWindow logWindow = new LogWindow(managedProcess); - logWindow.logLine(Logging.filterForbiddenToken("Command: " + new CommandBuilder().addAll(managedProcess.getCommands())), Log4jLevel.INFO); + logWindow.logLine(Logger.filterForbiddenToken("Command: " + new CommandBuilder().addAll(managedProcess.getCommands())), Log4jLevel.INFO); if (managedProcess.getClasspath() != null) logWindow.logLine("ClassPath: " + managedProcess.getClasspath(), Log4jLevel.INFO); for (Map.Entry entry : logs) @@ -287,7 +286,7 @@ public class GameCrashWindow extends Stage { FXUtils.showFileInExplorer(logFile); alert = new Alert(Alert.AlertType.INFORMATION, i18n("settings.launcher.launcher_log.export.success", logFile)); } else { - LOG.log(Level.WARNING, "Failed to export game crash info", exception); + LOG.warning("Failed to export game crash info", exception); alert = new Alert(Alert.AlertType.WARNING, i18n("settings.launcher.launcher_log.export.failed") + "\n" + StringUtils.getStackTrace(exception)); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java index 694e700fc..c216bb74a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -55,13 +55,12 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Consumer; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.IntStream; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.util.Lang.thread; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.StringUtils.parseEscapeSequence; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -210,7 +209,7 @@ public final class LogWindow extends Stage { try { Files.write(logFile, logs.stream().map(x -> x.log).collect(Collectors.toList())); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to export logs", e); + LOG.warning("Failed to export logs", e); return; } @@ -238,7 +237,7 @@ public final class LogWindow extends Stage { FXUtils.showFileInExplorer(dumpFile); } } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to create minecraft jstack dump", e); + LOG.warning("Failed to create minecraft jstack dump", e); Platform.runLater(() -> { Alert alert = new Alert(Alert.AlertType.ERROR, i18n("logwindow.export_dump.dependency_ok.button")); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/UpgradeDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/UpgradeDialog.java index b43133a1c..e8602e394 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/UpgradeDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/UpgradeDialog.java @@ -27,11 +27,10 @@ import org.jackhuang.hmcl.Metadata; import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.upgrade.RemoteVersion; -import java.util.logging.Level; import static org.jackhuang.hmcl.Metadata.CHANGELOG_URL; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class UpgradeDialog extends JFXDialogLayout { @@ -56,7 +55,7 @@ public class UpgradeDialog extends JFXDialogLayout { }); setBody(webView); } catch (NoClassDefFoundError | UnsatisfiedLinkError e) { - LOG.log(Level.WARNING, "WebView is missing or initialization failed", e); + LOG.warning("WebView is missing or initialization failed", e); FXUtils.openLink(url); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java index 765bd323e..22a0b39f9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java @@ -54,11 +54,10 @@ import java.io.IOException; import java.util.Optional; import java.util.Set; import java.util.concurrent.CancellationException; -import java.util.logging.Level; import static java.util.Collections.emptySet; import static javafx.beans.binding.Bindings.createBooleanBinding; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class AccountListItem extends RadioButton { @@ -109,11 +108,11 @@ public class AccountListItem extends RadioButton { } catch (CancellationException e1) { // ignore cancellation } catch (Exception e1) { - LOG.log(Level.WARNING, "Failed to refresh " + account + " with password", e1); + LOG.warning("Failed to refresh " + account + " with password", e1); throw e1; } } catch (AuthenticationException e) { - LOG.log(Level.WARNING, "Failed to refresh " + account + " with token", e); + LOG.warning("Failed to refresh " + account + " with token", e); throw e; } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListPage.java index 67b93e31e..ddfcfa056 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListPage.java @@ -44,10 +44,9 @@ import org.jackhuang.hmcl.util.javafx.BindingMapping; import org.jackhuang.hmcl.util.javafx.MappedObservableList; import java.net.URI; -import java.util.logging.Level; import static org.jackhuang.hmcl.ui.versions.VersionPage.wrap; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.javafx.ExtendedProperties.createSelectedItemPropertyFor; @@ -137,7 +136,7 @@ public class AccountListPage extends DecoratorAnimatedPage implements DecoratorP try { host = URI.create(server.getUrl()).getHost(); } catch (IllegalArgumentException e) { - LOG.log(Level.WARNING, "Unparsable authlib-injector server url " + server.getUrl(), e); + LOG.warning("Unparsable authlib-injector server url " + server.getUrl(), e); } item.subtitleProperty().set(host); Tooltip tooltip = new Tooltip(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAuthlibInjectorServerPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAuthlibInjectorServerPane.java index 0f3063b56..914046649 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAuthlibInjectorServerPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AddAuthlibInjectorServerPane.java @@ -35,11 +35,10 @@ import org.jackhuang.hmcl.util.io.NetworkUtils; import javax.net.ssl.SSLException; import java.io.IOException; -import java.util.logging.Level; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class AddAuthlibInjectorServerPane extends TransitionPane implements DialogAware { @@ -201,7 +200,7 @@ public final class AddAuthlibInjectorServerPane extends TransitionPane implement this.setContent(confirmServerPane, ContainerAnimations.SWIPE_LEFT.getAnimationProducer()); } else { - LOG.log(Level.WARNING, "Failed to resolve auth server: " + url, exception); + LOG.warning("Failed to resolve auth server: " + url, exception); lblCreationWarning.setText(resolveFetchExceptionMessage(exception)); } }).start(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/ClassicAccountLoginDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/ClassicAccountLoginDialog.java index 8d44a8390..19bd4510e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/ClassicAccountLoginDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/ClassicAccountLoginDialog.java @@ -36,10 +36,9 @@ import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; import org.jackhuang.hmcl.ui.construct.RequiredValidator; import java.util.function.Consumer; -import java.util.logging.Level; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class ClassicAccountLoginDialog extends StackPane { @@ -109,7 +108,7 @@ public class ClassicAccountLoginDialog extends StackPane { fireEvent(new DialogCloseEvent()); progressBar.setVisible(false); }, e -> { - LOG.log(Level.INFO, "Failed to login with password: " + oldAccount, e); + LOG.info("Failed to login with password: " + oldAccount, e); if (e instanceof NoSelectedCharacterException) { fireEvent(new DialogCloseEvent()); } else { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OAuthAccountLoginDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OAuthAccountLoginDialog.java index 1272a3654..bf9f98bce 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OAuthAccountLoginDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OAuthAccountLoginDialog.java @@ -21,9 +21,8 @@ import org.jackhuang.hmcl.ui.construct.JFXHyperlink; import org.jackhuang.hmcl.ui.construct.MessageDialogPane; import java.util.function.Consumer; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class OAuthAccountLoginDialog extends DialogPane { @@ -96,7 +95,7 @@ public class OAuthAccountLoginDialog extends DialogPane { success.accept(authInfo); onSuccess(); } else { - LOG.log(Level.INFO, "Failed to login when credentials expired: " + account, exception); + LOG.info("Failed to login when credentials expired: " + account, exception); onFailure(Accounts.localizeErrorMessage(exception)); } }).start(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java index a85f0f384..c143c60b9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java @@ -43,11 +43,10 @@ import org.jackhuang.hmcl.ui.construct.*; import java.io.File; import java.util.Arrays; import java.util.UUID; -import java.util.logging.Level; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class OfflineAccountSkinPane extends StackPane { @@ -134,7 +133,7 @@ public class OfflineAccountSkinPane extends StackPane { getSkin().load(account.getUsername()) .whenComplete(Schedulers.javafx(), (result, exception) -> { if (exception != null) { - LOG.log(Level.WARNING, "Failed to load skin", exception); + LOG.warning("Failed to load skin", exception); Controllers.showToast(i18n("message.failed")); } else { UUID uuid = this.account.getUUID(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java index 068664ea1..209c893f7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java @@ -31,11 +31,11 @@ import org.jackhuang.hmcl.ui.animation.AnimationProducer; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.TransitionPane; import org.jackhuang.hmcl.ui.wizard.Navigation; -import org.jackhuang.hmcl.util.Logging; import java.util.Optional; import java.util.Stack; -import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class Navigator extends TransitionPane { private static final String PROPERTY_DIALOG_CLOSE_HANDLER = Navigator.class.getName() + ".closeListener"; @@ -65,7 +65,7 @@ public class Navigator extends TransitionPane { if (from == node) return; - Logging.LOG.info("Navigate to " + node); + LOG.info("Navigate to " + node); stack.push(node); backable.set(canGoBack()); @@ -104,11 +104,11 @@ public class Navigator extends TransitionPane { if (stack.peek() != from) { // Allow page to be closed multiple times. - Logging.LOG.log(Level.INFO, "Closing already closed page: " + from, new Throwable()); + LOG.info("Closing already closed page: " + from, new Throwable()); return; } - Logging.LOG.info("Closed page " + from); + LOG.info("Closed page " + from); Node poppedNode = stack.pop(); NavigationEvent exited = new NavigationEvent(this, poppedNode, Navigation.NavigationDirection.PREVIOUS, NavigationEvent.EXITED); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/StackContainerPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/StackContainerPane.java index 27713b2a1..fca0814b5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/StackContainerPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/StackContainerPane.java @@ -19,11 +19,12 @@ package org.jackhuang.hmcl.ui.construct; import javafx.scene.Node; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.util.Logging; import java.util.Optional; import java.util.Stack; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + public class StackContainerPane extends StackPane { private final Stack stack = new Stack<>(); @@ -39,7 +40,7 @@ public class StackContainerPane extends StackPane { stack.push(node); getChildren().setAll(node); - Logging.LOG.info(this + " " + stack); + LOG.info(this + " " + stack); } public void pop(Node node) { @@ -49,7 +50,7 @@ public class StackContainerPane extends StackPane { else getChildren().setAll(stack.peek()); - Logging.LOG.info(this + " " + stack + ", removed: " + flag + ", object: " + node); + LOG.info(this + " " + stack + ", removed: " + flag + ", object: " + node); } public boolean isEmpty() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java index 5bac81caa..9b0723999 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java @@ -62,15 +62,13 @@ import java.util.Locale; import java.util.Optional; import java.util.Random; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; import java.util.stream.Stream; -import static java.util.logging.Level.WARNING; import static java.util.stream.Collectors.toList; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.newBuiltinImage; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.io.FileUtils.getExtension; public class DecoratorController { @@ -186,7 +184,7 @@ public class DecoratorController { } } } catch (Exception e) { - LOG.log(WARNING, "Couldn't load background image", e); + LOG.warning("Couldn't load background image", e); } } break; @@ -234,7 +232,7 @@ public class DecoratorController { }) .collect(toList()); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to list files in ./bg", e); + LOG.warning("Failed to list files in ./bg", e); return Optional.empty(); } @@ -263,12 +261,12 @@ public class DecoratorController { try { img = new Image(url); } catch (IllegalArgumentException e) { - LOG.log(WARNING, "Couldn't load background image", e); + LOG.warning("Couldn't load background image", e); return Optional.empty(); } if (img.getException() != null) { - LOG.log(WARNING, "Couldn't load background image", img.getException()); + LOG.warning("Couldn't load background image", img.getException()); return Optional.empty(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java index 88a68f273..54480e552 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java @@ -42,10 +42,9 @@ import java.io.File; import java.nio.charset.Charset; import java.util.Map; import java.util.Optional; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.tryCast; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class LocalModpackPage extends ModpackPage { @@ -121,7 +120,7 @@ public final class LocalModpackPage extends ModpackPage { controller.getSettings().put(MODPACK_MANUALLY_CREATED, true); } else if (exception != null) { - LOG.log(Level.WARNING, "Failed to read modpack manifest", exception); + LOG.warning("Failed to read modpack manifest", exception); Controllers.dialog(i18n("modpack.task.install.error"), i18n("message.error"), MessageDialogPane.MessageType.ERROR); Platform.runLater(controller::onEnd); } else { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java index df64048e2..e919424ed 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java @@ -57,11 +57,10 @@ import org.jackhuang.hmcl.util.Holder; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; import java.util.stream.Collectors; import static org.jackhuang.hmcl.ui.ToolbarListPageSkin.wrap; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.formatDateTime; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -232,7 +231,7 @@ public final class VersionsPage extends BorderPane implements WizardPage, Refres } }); } else { - LOG.log(Level.WARNING, "Failed to fetch versions list", exception); + LOG.warning("Failed to fetch versions list", exception); Platform.runLater(() -> { if (versionList != currentVersionList) return; root.setContent(failedPane, ContainerAnimations.FADE.getAnimationProducer()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java index 9ef6da0f4..abf24d6ce 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java @@ -54,12 +54,11 @@ import java.time.Instant; import java.util.Comparator; import java.util.List; import java.util.Locale; -import java.util.logging.Level; import java.util.stream.Collectors; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.ui.versions.VersionPage.wrap; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class RootPage extends DecoratorAnimatedPage implements DecoratorPage { @@ -102,7 +101,7 @@ public class RootPage extends DecoratorAnimatedPage implements DecoratorPage { try { Controllers.navigate(new NBTEditorPage(file)); } catch (Throwable e) { - LOG.log(Level.WARNING, "Fail to open nbt file", e); + LOG.warning("Fail to open nbt file", e); Controllers.dialog(i18n("nbt.open.failed") + "\n\n" + StringUtils.getStackTrace(e), i18n("message.error"), MessageDialogPane.MessageType.ERROR); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java index 1e6975e4d..90df9e610 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java @@ -31,24 +31,23 @@ import org.jackhuang.hmcl.upgrade.RemoteVersion; import org.jackhuang.hmcl.upgrade.UpdateChannel; import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.upgrade.UpdateHandler; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.i18n.Locales; import org.jackhuang.hmcl.util.io.FileUtils; import java.io.File; import java.io.IOException; +import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Optional; -import java.util.logging.Level; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.util.Lang.thread; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.javafx.ExtendedProperties.selectedItemPropertyFor; @@ -130,11 +129,11 @@ public final class SettingsPage extends SettingsView { Path logFile = Paths.get("hmcl-exported-logs-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss")) + ".log").toAbsolutePath(); LOG.info("Exporting logs to " + logFile); - try { - Files.write(logFile, Logging.getRawLogs()); + try (OutputStream output = Files.newOutputStream(logFile)) { + LOG.exportLogs(output); } catch (IOException e) { Platform.runLater(() -> Controllers.dialog(i18n("settings.launcher.launcher_log.export.failed") + "\n" + StringUtils.getStackTrace(e), null, MessageType.ERROR)); - LOG.log(Level.WARNING, "Failed to export logs", e); + LOG.warning("Failed to export logs", e); return; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java index 3840c693d..3874102d3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTEditorPage.java @@ -18,10 +18,9 @@ import org.jackhuang.hmcl.util.StringUtils; import java.io.*; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class NBTEditorPage extends BorderPane implements DecoratorPage { @@ -53,7 +52,7 @@ public class NBTEditorPage extends BorderPane implements DecoratorPage { try { save(); } catch (IOException ex) { - LOG.log(Level.WARNING, "Failed to save NBT file", ex); + LOG.warning("Failed to save NBT file", ex); Controllers.dialog(i18n("nbt.save.failed") + "\n\n" + StringUtils.getStackTrace(ex)); } }); @@ -73,7 +72,7 @@ public class NBTEditorPage extends BorderPane implements DecoratorPage { }, Schedulers.javafx()) .handleAsync((result, e) -> { if (e != null) { - LOG.log(Level.WARNING, "Fail to open nbt file", e); + LOG.warning("Fail to open nbt file", e); Controllers.dialog(i18n("nbt.open.failed") + "\n\n" + StringUtils.getStackTrace(e), null, MessageDialogPane.MessageType.WARNING, cancelButton::fire); } return null; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java index e40e4f1ce..bdef92f51 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java @@ -29,7 +29,6 @@ import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.ListPageBase; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.javafx.MappedObservableList; @@ -38,8 +37,8 @@ import java.io.IOException; import java.nio.file.Path; import java.util.List; import java.util.Objects; -import java.util.logging.Level; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class DatapackListPage extends ListPageBase implements DecoratorPage { @@ -71,7 +70,7 @@ public class DatapackListPage extends ListPageBase implements VersionPage.VersionLoadable, PageAware { @@ -65,7 +64,7 @@ public final class ModListPage extends ListPageBase { Pattern pattern = Pattern.compile(queryString.substring("regex:".length())); predicate = s -> pattern.matcher(s).find(); } catch (Throwable e) { - LOG.log(Level.WARNING, "Illegal regular expression", e); + LOG.warning("Illegal regular expression", e); return; } } else { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java index df7cb2d5c..feddeea04 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java @@ -24,10 +24,9 @@ import org.jackhuang.hmcl.util.io.IOUtils; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.logging.Level; import java.util.stream.Collectors; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; /** @@ -127,7 +126,7 @@ public enum ModTranslations { mods = Arrays.stream(modData.split("\n")).filter(line -> !line.startsWith("#")).map(Mod::new).collect(Collectors.toList()); return true; } catch (Exception e) { - LOG.log(Level.WARNING, "Failed to load " + resourceName, e); + LOG.warning("Failed to load " + resourceName, e); return false; } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackDownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackDownloadListPage.java index f1d255719..cf430a476 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackDownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackDownloadListPage.java @@ -24,9 +24,8 @@ import org.jackhuang.hmcl.mod.modrinth.ModrinthRemoteModRepository; import org.jackhuang.hmcl.util.i18n.I18n; import java.util.MissingResourceException; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class ResourcePackDownloadListPage extends DownloadListPage { @@ -81,7 +80,7 @@ public class ResourcePackDownloadListPage extends DownloadListPage { try { return I18n.getResourceBundle().getString(key); } catch (MissingResourceException e) { - LOG.log(Level.WARNING, "Cannot find key " + key + " in resource bundle", e); + LOG.warning("Cannot find key " + key + " in resource bundle", e); return category; } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java index 4b02955db..106dfcc11 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java @@ -31,12 +31,11 @@ import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.construct.DialogPane; import org.jackhuang.hmcl.ui.construct.RipplerContainer; -import org.jackhuang.hmcl.util.Logging; import java.io.File; import java.io.IOException; -import java.util.logging.Level; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class VersionIconDialog extends DialogPane { @@ -85,7 +84,7 @@ public class VersionIconDialog extends DialogPane { onAccept(); } catch (IOException | IllegalArgumentException e) { - Logging.LOG.log(Level.SEVERE, "Failed to set icon file: " + selectedFile, e); + LOG.error("Failed to set icon file: " + selectedFile, e); } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/Versions.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/Versions.java index d14a898b4..5b1857170 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/Versions.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/Versions.java @@ -41,7 +41,6 @@ import org.jackhuang.hmcl.ui.construct.PromptDialogPane; import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.download.ModpackInstallWizardProvider; import org.jackhuang.hmcl.ui.export.ExportWizardProvider; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.TaskCancellationAction; import org.jackhuang.hmcl.util.io.FileUtils; @@ -55,8 +54,8 @@ import java.nio.file.Path; import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; -import java.util.logging.Level; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Versions { @@ -184,7 +183,7 @@ public final class Versions { try { profile.getRepository().clean(id); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Unable to clean game directory", e); + LOG.warning("Unable to clean game directory", e); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java index 46c18998f..d7ab4e186 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java @@ -27,9 +27,8 @@ import java.text.DecimalFormat; import java.time.Instant; import java.util.Arrays; import java.util.Locale; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.formatDateTime; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -421,7 +420,7 @@ public final class WorldInfoPage extends StackPane implements DecoratorPage { try { this.world.writeLevelDat(levelDat); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to save level.dat of world " + world.getWorldName(), e); + LOG.warning("Failed to save level.dat of world " + world.getWorldName(), e); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java index e411cc7f8..b00783978 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java @@ -28,7 +28,6 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.*; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.io.FileUtils; import java.io.File; @@ -39,10 +38,10 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class WorldListPage extends ListPageBase implements VersionPage.VersionLoadable { @@ -139,7 +138,7 @@ public class WorldListPage extends ListPageBase implements Versio }).start(); }, world.getWorldName()); }, e -> { - Logging.LOG.log(Level.WARNING, "Unable to parse world file " + zipFile, e); + LOG.warning("Unable to parse world file " + zipFile, e); Controllers.dialog(i18n("world.import.invalid")); }).start(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/WizardController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/WizardController.java index 3b6332f59..9dbbf156e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/WizardController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/WizardController.java @@ -19,10 +19,11 @@ package org.jackhuang.hmcl.ui.wizard; import javafx.scene.Node; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Logging; import java.util.*; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + public class WizardController implements Navigation { private final WizardDisplayer displayer; private WizardProvider provider = null; @@ -71,7 +72,7 @@ public class WizardController implements Navigation { displayer.onStart(); - Logging.LOG.info("Navigating to " + page + ", pages: " + pages); + LOG.info("Navigating to " + page + ", pages: " + pages); displayer.navigateTo(page, NavigationDirection.START); } @@ -90,7 +91,7 @@ public class WizardController implements Navigation { if (page instanceof WizardPage) ((WizardPage) page).onNavigate(settings); - Logging.LOG.info("Navigating to " + page + ", pages: " + pages); + LOG.info("Navigating to " + page + ", pages: " + pages); displayer.navigateTo(page, NavigationDirection.NEXT); } @@ -113,7 +114,7 @@ public class WizardController implements Navigation { if (prevPage instanceof WizardPage) ((WizardPage) prevPage).onNavigate(settings); - Logging.LOG.info("Navigating to " + prevPage + ", pages: " + pages); + LOG.info("Navigating to " + prevPage + ", pages: " + pages); displayer.navigateTo(prevPage, NavigationDirection.PREVIOUS); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java index d03600e2e..510a59c8a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java @@ -31,12 +31,11 @@ import java.security.spec.X509EncodedKeySpec; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; -import java.util.logging.Level; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * A class that checks the integrity of HMCL. @@ -132,7 +131,7 @@ public final class IntegrityChecker { LOG.info("Successfully verified current JAR"); selfVerified = true; } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to verify myself, is the JAR corrupt?", e); + LOG.warning("Failed to verify myself, is the JAR corrupt?", e); selfVerified = false; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index eb9f896cb..b4663b0f2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -27,11 +27,10 @@ import org.jackhuang.hmcl.util.io.NetworkUtils; import org.jackhuang.hmcl.util.versioning.VersionNumber; import java.io.IOException; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.thread; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; public final class UpdateChecker { @@ -112,7 +111,7 @@ public final class UpdateChecker { result = checkUpdate(channel); LOG.info("Latest version (" + channel + ") is " + result); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to check for update", e); + LOG.warning("Failed to check for update", e); } RemoteVersion finalResult = result; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java index eb2d179a8..d0dccc4f7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java @@ -42,13 +42,12 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; import java.util.concurrent.CancellationException; -import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; import static org.jackhuang.hmcl.ui.FXUtils.checkFxUserThread; import static org.jackhuang.hmcl.util.Lang.thread; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class UpdateHandler { @@ -66,7 +65,7 @@ public final class UpdateHandler { try { performMigration(); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to perform migration", e); + LOG.warning("Failed to perform migration", e); SwingUtils.showErrorDialog(i18n("fatal.apply_update_failure", Metadata.PUBLISH_URL) + "\n" + StringUtils.getStackTrace(e)); } return true; @@ -81,7 +80,7 @@ public final class UpdateHandler { try { applyUpdate(Paths.get(args[1])); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to apply update", e); + LOG.warning("Failed to apply update", e); SwingUtils.showErrorDialog(i18n("fatal.apply_update_failure", Metadata.PUBLISH_URL) + "\n" + StringUtils.getStackTrace(e)); } return true; @@ -108,7 +107,7 @@ public final class UpdateHandler { try { downloaded = Files.createTempFile("hmcl-update-", ".jar"); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to create temp file", e); + LOG.warning("Failed to create temp file", e); return; } @@ -127,15 +126,15 @@ public final class UpdateHandler { } requestUpdate(downloaded, getCurrentLocation()); - System.exit(0); + Main.exit(0); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to update to " + version, e); + LOG.warning("Failed to update to " + version, e); Platform.runLater(() -> Controllers.dialog(StringUtils.getStackTrace(e), i18n("update.failed"), MessageType.ERROR)); } } else { Exception e = executor.getException(); - LOG.log(Level.WARNING, "Failed to update to " + version, e); + LOG.warning("Failed to update to " + version, e); if (e instanceof CancellationException) { Platform.runLater(() -> Controllers.showToast(i18n("message.cancelled"))); } else { @@ -162,7 +161,7 @@ public final class UpdateHandler { Files.move(target, newFilename.get()); target = newFilename.get(); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to move target", e); + LOG.warning("Failed to move target", e); } } @@ -273,7 +272,7 @@ public final class UpdateHandler { LOG.info("Successfully broke the force update feature"); } } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to break the force update feature", e); + LOG.warning("Failed to break the force update feature", e); } catch (JsonParseException e) { hmclVersionJson.toFile().delete(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java index f1d00548f..ad3121b5b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java @@ -29,9 +29,8 @@ import org.jackhuang.hmcl.util.io.NetworkUtils; import java.io.IOException; import java.util.HashMap; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -67,14 +66,14 @@ public final class CrashReporter implements Thread.UncaughtExceptionHandler { if (s.contains(entry.getKey())) { if (StringUtils.isNotBlank(entry.getValue())) { String info = entry.getValue(); - LOG.severe(info); + LOG.error(info); try { Alert alert = new Alert(AlertType.INFORMATION, info); alert.setTitle(i18n("message.info")); alert.setHeaderText(i18n("message.info")); alert.showAndWait(); } catch (Throwable t) { - LOG.log(Level.SEVERE, "Unable to show message", t); + LOG.error("Unable to show message", t); } } return false; @@ -90,14 +89,14 @@ public final class CrashReporter implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { - LOG.log(Level.SEVERE, "Uncaught exception in thread " + t.getName(), e); + LOG.error("Uncaught exception in thread " + t.getName(), e); try { CrashReport report = new CrashReport(t, e); if (!report.shouldBeReport()) return; - LOG.log(Level.SEVERE, report.getDisplayText()); + LOG.error(report.getDisplayText()); Platform.runLater(() -> { if (checkThrowable(e)) { if (showCrashWindow) { @@ -109,8 +108,10 @@ public final class CrashReporter implements Thread.UncaughtExceptionHandler { } }); } catch (Throwable handlingException) { - LOG.log(Level.SEVERE, "Unable to handle uncaught exception", handlingException); + LOG.error("Unable to handle uncaught exception", handlingException); } + + LOG.shutdown(); } private void reportToServer(CrashReport crashReport) { @@ -118,13 +119,13 @@ public final class CrashReporter implements Thread.UncaughtExceptionHandler { HashMap map = new HashMap<>(); map.put("crash_report", crashReport.getDisplayText()); map.put("version", Metadata.VERSION); - map.put("log", Logging.getLogs()); + map.put("log", LOG.getLogs()); try { String response = NetworkUtils.doPost(NetworkUtils.toURL("https://hmcl.huangyuhui.net/hmcl/crash.php"), map); if (StringUtils.isNotBlank(response)) - LOG.log(Level.SEVERE, "Crash server response: " + response); + LOG.error("Crash server response: " + response); } catch (IOException ex) { - LOG.log(Level.SEVERE, "Unable to post HMCL server.", ex); + LOG.error("Unable to post HMCL server.", ex); } }); t.setDaemon(true); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java index cb7efb4cb..e870d5c56 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/JavaFXPatcher.java @@ -20,7 +20,7 @@ package org.jackhuang.hmcl.util; import java.nio.file.Path; import java.util.Set; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * Utility for Adding JavaFX to module path. diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java index 463fddd20..58a1fd9aa 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -15,10 +15,9 @@ import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.*; -import java.util.logging.Level; import java.util.stream.Collectors; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class NativePatcher { private NativePatcher() { @@ -37,7 +36,7 @@ public final class NativePatcher { return natives.getOrDefault(p.toString(), Collections.emptyMap()); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to load native library list", e); + LOG.warning("Failed to load native library list", e); return Collections.emptyMap(); } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java index 9763fa0d1..d6a8aa77e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/SelfDependencyPatcher.java @@ -43,6 +43,7 @@ package org.jackhuang.hmcl.util; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import org.jackhuang.hmcl.Main; import org.jackhuang.hmcl.ui.SwingUtils; import org.jackhuang.hmcl.util.io.ChecksumMismatchException; import org.jackhuang.hmcl.util.io.IOUtils; @@ -62,12 +63,11 @@ import java.util.List; import java.util.*; import java.util.concurrent.CancellationException; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.logging.Level; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.stream.Collectors.toSet; import static org.jackhuang.hmcl.Metadata.HMCL_DIRECTORY; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.platform.JavaVersion.CURRENT_JAVA; @@ -121,7 +121,7 @@ public final class SelfDependencyPatcher { Class.forName("netscape.javascript.JSObject", false, classLoader); Class.forName("org.w3c.dom.html.HTMLDocument", false, classLoader); } catch (Throwable e) { - LOG.log(Level.WARNING, "Disable javafx.web because JRE is incomplete", e); + LOG.warning("Disable javafx.web because JRE is incomplete", e); dependencies.removeIf(it -> "javafx.web".equals(it.module) || "javafx.media".equals(it.module)); } @@ -250,7 +250,7 @@ public final class SelfDependencyPatcher { } } else { LOG.info("User choose not to download JavaFX"); - System.exit(0); + Main.exit(0); } throw new AssertionError(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java index 4f839b8f9..a36c66c26 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java @@ -23,9 +23,8 @@ import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class I18n { @@ -58,9 +57,9 @@ public final class I18n { try { return String.format(getResourceBundle().getString(key), formatArgs); } catch (MissingResourceException e) { - LOG.log(Level.SEVERE, "Cannot find key " + key + " in resource bundle", e); + LOG.error("Cannot find key " + key + " in resource bundle", e); } catch (IllegalFormatException e) { - LOG.log(Level.SEVERE, "Illegal format string, key=" + key + ", args=" + Arrays.toString(formatArgs), e); + LOG.error("Illegal format string, key=" + key + ", args=" + Arrays.toString(formatArgs), e); } return key + Arrays.toString(formatArgs); @@ -70,7 +69,7 @@ public final class I18n { try { return getResourceBundle().getString(key); } catch (MissingResourceException e) { - LOG.log(Level.SEVERE, "Cannot find key " + key + " in resource bundle", e); + LOG.error("Cannot find key " + key + " in resource bundle", e); return key; } } diff --git a/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java b/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java new file mode 100644 index 000000000..89547137f --- /dev/null +++ b/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java @@ -0,0 +1,23 @@ +package org.jackhuang.hmcl.util.logging; + +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; + +/** + * @author Glavo + */ +final class CallerFinder { + private static final StackWalker WALKER = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + private static final String PACKAGE_PREFIX = CallerFinder.class.getPackageName() + "."; + private static final Predicate PREDICATE = stackFrame -> !stackFrame.getClassName().startsWith(PACKAGE_PREFIX); + private static final Function, Optional> FUNCTION = stream -> stream.filter(PREDICATE).findFirst(); + + static String getCaller() { + return WALKER.walk(FUNCTION).map(it -> it.getClassName() + "." + it.getMethodName()).orElse(null); + } + + private CallerFinder() { + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java index 917fa8146..0964a6e1d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorDownloader.java @@ -32,9 +32,8 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class AuthlibInjectorDownloader implements AuthlibInjectorArtifactProvider { @@ -139,7 +138,7 @@ public class AuthlibInjectorDownloader implements AuthlibInjectorArtifactProvide try { return Optional.of(AuthlibInjectorArtifactInfo.from(path)); } catch (IOException e) { - LOG.log(Level.WARNING, "Bad authlib-injector artifact", e); + LOG.warning("Bad authlib-injector artifact", e); return Optional.empty(); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java index d547a7387..93e8987f3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java @@ -19,7 +19,7 @@ package org.jackhuang.hmcl.auth.authlibinjector; import static java.util.Collections.emptyMap; import static org.jackhuang.hmcl.util.Lang.tryCast; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import java.io.IOException; import java.lang.reflect.Type; @@ -29,7 +29,6 @@ import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.Optional; -import java.util.logging.Level; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilService; import org.jackhuang.hmcl.util.io.HttpRequest; @@ -254,7 +253,7 @@ public class AuthlibInjectorServer implements Observable { try { instance.setMetadataResponse(jsonObj.get("metadataResponse").getAsString(), jsonObj.get("metadataTimestamp").getAsLong()); } catch (JsonParseException e) { - LOG.log(Level.WARNING, "Ignoring malformed metadata response cache: " + jsonObj.get("metadataResponse"), e); + LOG.warning("Ignoring malformed metadata response cache: " + jsonObj.get("metadataResponse"), e); } } return instance; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/SimpleAuthlibInjectorArtifactProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/SimpleAuthlibInjectorArtifactProvider.java index 9cae9626b..f359fc6b3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/SimpleAuthlibInjectorArtifactProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/SimpleAuthlibInjectorArtifactProvider.java @@ -17,12 +17,11 @@ */ package org.jackhuang.hmcl.auth.authlibinjector; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import java.io.IOException; import java.nio.file.Path; import java.util.Optional; -import java.util.logging.Level; public class SimpleAuthlibInjectorArtifactProvider implements AuthlibInjectorArtifactProvider { @@ -42,7 +41,7 @@ public class SimpleAuthlibInjectorArtifactProvider implements AuthlibInjectorArt try { return Optional.of(getArtifactInfo()); } catch (IOException e) { - LOG.log(Level.WARNING, "Bad authlib-injector artifact", e); + LOG.warning("Bad authlib-injector artifact", e); return Optional.empty(); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java index d9eb451a7..774178a72 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java @@ -28,10 +28,9 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.UUID; -import java.util.logging.Level; import static java.util.Objects.requireNonNull; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class MicrosoftAccount extends OAuthAccount { @@ -142,7 +141,7 @@ public class MicrosoftAccount extends OAuthAccount { try { return YggdrasilService.getTextures(it); } catch (ServerResponseMalformedException e) { - LOG.log(Level.WARNING, "Failed to parse texture payload", e); + LOG.warning("Failed to parse texture payload", e); return Optional.empty(); } })); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java index ca2f3b1a1..410f942da 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java @@ -39,13 +39,12 @@ import java.net.URL; import java.util.*; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; import static java.net.HttpURLConnection.HTTP_NOT_FOUND; import static java.util.Objects.requireNonNull; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.threadPool; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; public class MicrosoftService { @@ -62,7 +61,7 @@ public class MicrosoftService { this.profileRepository = new ObservableOptionalCache<>(uuid -> { LOG.info("Fetching properties of " + uuid); return getCompleteGameProfile(uuid); - }, (uuid, e) -> LOG.log(Level.WARNING, "Failed to fetch properties of " + uuid, e), POOL); + }, (uuid, e) -> LOG.warning("Failed to fetch properties of " + uuid, e), POOL); } public ObservableOptionalCache getProfileRepository() { @@ -97,7 +96,7 @@ public class MicrosoftService { } if (response.displayClaims == null || response.displayClaims.xui == null || response.displayClaims.xui.size() == 0 || !response.displayClaims.xui.get(0).containsKey("uhs")) { - LOG.log(Level.WARNING, "Unrecognized xbox authorization response " + GSON.toJson(response)); + LOG.warning("Unrecognized xbox authorization response " + GSON.toJson(response)); throw new NoXuiException(); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java index f1705d52b..22fd566b1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java @@ -18,7 +18,7 @@ package org.jackhuang.hmcl.auth.microsoft; import org.jackhuang.hmcl.auth.AuthInfo; -import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.gson.UUIDTypeAdapter; import java.util.Map; @@ -45,7 +45,7 @@ public class MicrosoftSession { this.user = user; this.profile = profile; - if (accessToken != null) Logging.registerAccessToken(accessToken); + if (accessToken != null) Logger.registerAccessToken(accessToken); } public String getTokenType() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java index 1e0953c67..db0f06fde 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java @@ -24,10 +24,9 @@ import org.jackhuang.hmcl.util.javafx.BindingMapping; import java.nio.file.Path; import java.util.*; -import java.util.logging.Level; import static java.util.Objects.requireNonNull; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public abstract class YggdrasilAccount extends ClassicAccount { @@ -197,7 +196,7 @@ public abstract class YggdrasilAccount extends ClassicAccount { try { return YggdrasilService.getTextures(it); } catch (ServerResponseMalformedException e) { - LOG.log(Level.WARNING, "Failed to parse texture payload", e); + LOG.warning("Failed to parse texture payload", e); return Optional.empty(); } })); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java index c6fa3098d..3e3b71e5e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java @@ -40,13 +40,12 @@ import java.nio.file.Path; import java.util.*; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.unmodifiableList; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.threadPool; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; public class YggdrasilService { @@ -63,7 +62,7 @@ public class YggdrasilService { LOG.info("Fetching properties of " + uuid + " from " + provider); return getCompleteGameProfile(uuid); }, - (uuid, e) -> LOG.log(Level.WARNING, "Failed to fetch properties of " + uuid + " from " + provider, e), + (uuid, e) -> LOG.warning("Failed to fetch properties of " + uuid + " from " + provider, e), POOL); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java index f9f668ef0..3954cdd01 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilSession.java @@ -20,7 +20,7 @@ package org.jackhuang.hmcl.auth.yggdrasil; import com.google.gson.Gson; import org.jackhuang.hmcl.auth.AuthInfo; import org.jackhuang.hmcl.util.Immutable; -import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.gson.UUIDTypeAdapter; import org.jetbrains.annotations.Nullable; @@ -48,7 +48,7 @@ public class YggdrasilSession { this.availableProfiles = availableProfiles; this.userProperties = userProperties; - if (accessToken != null) Logging.registerAccessToken(accessToken); + if (accessToken != null) Logger.registerAccessToken(accessToken); } public String getClientToken() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java index b00a5b736..153ba1bdf 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultCacheRepository.java @@ -36,9 +36,10 @@ import java.util.*; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.logging.Level; import java.util.stream.Collectors; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + public class DefaultCacheRepository extends CacheRepository { private Path librariesDir; private Path indexFile; @@ -67,7 +68,7 @@ public class DefaultCacheRepository extends CacheRepository { else index = new Index(); } catch (IOException | JsonParseException e) { - Logging.LOG.log(Level.WARNING, "Unable to read index file", e); + LOG.warning("Unable to read index file", e); index = new Index(); } finally { lock.writeLock().unlock(); @@ -105,7 +106,7 @@ public class DefaultCacheRepository extends CacheRepository { // or we will not cache the library } } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Unable to calc hash value of file " + jar, e); + LOG.warning("Unable to calc hash value of file " + jar, e); } } @@ -200,7 +201,7 @@ public class DefaultCacheRepository extends CacheRepository { try { FileUtils.writeText(indexFile, JsonUtils.GSON.toJson(index)); } catch (IOException e) { - Logging.LOG.log(Level.SEVERE, "Unable to save index.json", e); + LOG.error("Unable to save index.json", e); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java index b78f15f74..85a0455e6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java @@ -19,7 +19,6 @@ package org.jackhuang.hmcl.download; import org.jackhuang.hmcl.game.*; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.SimpleMultimap; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; @@ -33,11 +32,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.*; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.*; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class MaintainTask extends Task { private final GameRepository repository; @@ -164,7 +163,7 @@ public class MaintainTask extends Task { Files.createDirectories(libraryPath.getParent()); Files.copy(input, libraryPath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Unable to unpack HMCLTransformerDiscoveryService", e); + LOG.warning("Unable to unpack HMCLTransformerDiscoveryService", e); } }); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MultipleSourceVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MultipleSourceVersionList.java index 9e0672d50..cde656bf3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MultipleSourceVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MultipleSourceVersionList.java @@ -19,9 +19,8 @@ package org.jackhuang.hmcl.download; import java.util.Arrays; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class MultipleSourceVersionList extends VersionList { @@ -71,7 +70,7 @@ public class MultipleSourceVersionList extends VersionList { return future; } - LOG.log(Level.WARNING, "Failed to fetch versions list and try to fetch from other source", e); + LOG.warning("Failed to fetch versions list and try to fetch from other source", e); return refreshAsync(gameVersion, sourceIndex + 1); }).thenCompose(it -> it); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java index 3ffd7d5ea..d63d7d156 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java @@ -32,11 +32,10 @@ import java.time.Instant; import java.time.format.DateTimeParseException; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.wrap; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; public final class ForgeBMCLVersionList extends VersionList { @@ -104,7 +103,7 @@ public final class ForgeBMCLVersionList extends VersionList try { releaseDate = Instant.parse(version.getModified()); } catch (DateTimeParseException e) { - LOG.log(Level.WARNING, "Failed to parse instant " + version.getModified(), e); + LOG.warning("Failed to parse instant " + version.getModified(), e); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallTask.java index 8c96ba321..4c63f7e9c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallTask.java @@ -60,7 +60,7 @@ import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.zip.ZipException; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.gson.JsonUtils.fromNonNullJson; public class ForgeNewInstallTask extends Task { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java index 4a01aaea8..3f4a242c9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java @@ -26,7 +26,6 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.CacheRepository; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -37,7 +36,8 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @@ -100,7 +100,7 @@ public final class GameAssetDownloadTask extends Task { if (!download && integrityCheck && !assetObject.validateChecksum(file, true)) download = true; } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Unable to calc hash value of file " + file, e); + LOG.warning("Unable to calc hash value of file " + file, e); } if (download) { List urls = dependencyManager.getDownloadProvider().getAssetObjectCandidates(assetObject.getLocation()); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java index 83aec6c24..cb7fcc709 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java @@ -34,9 +34,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * This task is to download asset index file provided in minecraft.json. @@ -82,7 +81,7 @@ public final class GameAssetIndexDownloadTask extends Task { if (actualSum.equalsIgnoreCase(assetIndexInfo.getSha1())) return; } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to calculate sha1sum of file " + assetIndexInfo, e); + LOG.warning("Failed to calculate sha1sum of file " + assetIndexInfo, e); // continue downloading } } else { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java index a3837e6d6..3090917b2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java @@ -23,7 +23,6 @@ import org.jackhuang.hmcl.game.Library; import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.io.FileUtils; import java.io.File; @@ -31,7 +30,8 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * This task is to download game libraries. @@ -98,7 +98,7 @@ public final class GameLibrariesTask extends Task { } } } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Unable to calc hash value of file " + jar, e); + LOG.warning("Unable to calc hash value of file " + jar, e); } return false; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java index 112ec98e9..4e8340990 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java @@ -39,9 +39,8 @@ import java.util.*; import java.util.concurrent.CancellationException; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class LibraryDownloadTask extends Task { private FileDownloadTask task; @@ -111,7 +110,7 @@ public class LibraryDownloadTask extends Task { cached = true; return; } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to copy file from cache", e); + LOG.warning("Failed to copy file from cache", e); // We cannot copy cached file to current location // so we try to download a new one. } @@ -137,7 +136,7 @@ public class LibraryDownloadTask extends Task { try { cacheRepository.cacheLibrary(library, jar.toPath(), false); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to cache downloaded library " + library, e); + LOG.warning("Failed to cache downloaded library " + library, e); } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDownloadTask.java index 25956b71c..9742ac106 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDownloadTask.java @@ -42,7 +42,7 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.*; import java.util.stream.Collectors; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class JavaDownloadTask extends Task { private final GameJavaVersion javaVersion; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java index e121960f1..10f08fdce 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java @@ -17,10 +17,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.Consumer; -import java.util.logging.Level; import java.util.stream.Stream; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class JavaRepository { private JavaRepository() { @@ -80,7 +79,7 @@ public final class JavaRepository { findJavaHomeInComponentDir(platform, component).ifPresent(javaHomes::add); } } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to list java-runtime directory " + runtimeDir, e); + LOG.warning("Failed to list java-runtime directory " + runtimeDir, e); } }; getSystemJavaPlatform().ifPresent(action); @@ -124,7 +123,7 @@ public final class JavaRepository { return Optional.of(dir); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to verify Java in " + component, e); + LOG.warning("Failed to verify Java in " + component, e); return Optional.empty(); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOldInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOldInstallTask.java index 3de56d9df..838232fe8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOldInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOldInstallTask.java @@ -56,7 +56,7 @@ import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.zip.ZipException; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.gson.JsonUtils.fromNonNullJson; public class NeoForgeOldInstallTask extends Task { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java index e371269fd..6da4da74e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java @@ -17,10 +17,10 @@ */ package org.jackhuang.hmcl.event; -import org.jackhuang.hmcl.util.Logging; - import java.util.concurrent.ConcurrentHashMap; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + /** * * @author huangyuhui @@ -36,7 +36,7 @@ public final class EventBus { @SuppressWarnings("unchecked") public Event.Result fireEvent(Event obj) { - Logging.LOG.info(obj + " gets fired"); + LOG.info(obj + " gets fired"); return channel((Class) obj.getClass()).fireEvent(obj); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java index 73df906d1..4aaa59775 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -53,10 +53,9 @@ import java.util.Objects; import java.util.Optional; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; import java.util.stream.Stream; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * An implementation of classic Minecraft game repository. @@ -232,7 +231,7 @@ public class DefaultGameRepository implements GameRepository { } return true; } catch (IOException | JsonParseException | VersionNotFoundException | InvalidPathException e) { - LOG.log(Level.WARNING, "Unable to rename version " + from + " to " + to, e); + LOG.warning("Unable to rename version " + from + " to " + to, e); return false; } } @@ -267,7 +266,7 @@ public class DefaultGameRepository implements GameRepository { try { FileUtils.deleteDirectory(removedFile); } catch (IOException e) { - LOG.log(Level.WARNING, "Unable to remove version folder: " + file, e); + LOG.warning("Unable to remove version folder: " + file, e); } return true; } finally { @@ -317,7 +316,7 @@ public class DefaultGameRepository implements GameRepository { try { version = readVersionJson(json); } catch (Exception e) { - LOG.log(Level.WARNING, "Malformed version json " + id, e); + LOG.warning("Malformed version json " + id, e); // JsonSyntaxException or IOException or NullPointerException(!!) if (EventBus.EVENT_BUS.fireEvent(new GameJsonParseFailedEvent(this, json, id)) != Event.Result.ALLOW) return Stream.empty(); @@ -325,7 +324,7 @@ public class DefaultGameRepository implements GameRepository { try { version = readVersionJson(json); } catch (Exception e2) { - LOG.log(Level.SEVERE, "User corrected version json is still malformed", e2); + LOG.error("User corrected version json is still malformed", e2); return Stream.empty(); } } @@ -355,7 +354,7 @@ public class DefaultGameRepository implements GameRepository { throw e; } } catch (IOException e) { - LOG.log(Level.WARNING, "Ignoring version " + version.getId() + " because version id does not match folder name " + id + ", and we cannot correct it.", e); + LOG.warning("Ignoring version " + version.getId() + " because version id does not match folder name " + id + ", and we cannot correct it.", e); return Stream.empty(); } } @@ -371,7 +370,7 @@ public class DefaultGameRepository implements GameRepository { EventBus.EVENT_BUS.fireEvent(new LoadedOneVersionEvent(this, resolved)) != Event.Result.DENY) versions.put(version.getId(), version); } catch (VersionNotFoundException e) { - LOG.log(Level.WARNING, "Ignoring version " + version.getId() + " because it inherits from a nonexistent version."); + LOG.warning("Ignoring version " + version.getId() + " because it inherits from a nonexistent version."); } } @@ -402,7 +401,7 @@ public class DefaultGameRepository implements GameRepository { try { return reconstructAssets(version, assetId); } catch (IOException | JsonParseException e) { - LOG.log(Level.SEVERE, "Unable to reconstruct asset directory", e); + LOG.error("Unable to reconstruct asset directory", e); return getAssetDirectory(version, assetId); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameDumpGenerator.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameDumpGenerator.java index 984cdfd79..36ab72ee2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameDumpGenerator.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameDumpGenerator.java @@ -20,7 +20,7 @@ package org.jackhuang.hmcl.game; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.VirtualMachine; -import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.platform.OperatingSystem; @@ -28,9 +28,8 @@ import java.io.*; import java.nio.CharBuffer; import java.nio.file.Files; import java.nio.file.Path; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * Generate a JVM dump on a process. @@ -78,7 +77,7 @@ public final class GameDumpGenerator { execute(vm, "VM.command_line", stringBuilder); writeDumpHeadKeyValueTo( "VM Command Line", - Logging.filterForbiddenToken(stringBuilder.toString()), + Logger.filterForbiddenToken(stringBuilder.toString()), writer, true ); @@ -137,7 +136,7 @@ public final class GameDumpGenerator { try { return VirtualMachine.attach(lvmid); } catch (Throwable e) { - LOG.log(Level.WARNING, "An exception encountered while attaching vm " + lvmid, e); + LOG.warning("An exception encountered while attaching vm " + lvmid, e); writer.write(StringUtils.getStackTrace(e)); writer.write('\n'); Thread.sleep(3000); @@ -158,7 +157,7 @@ public final class GameDumpGenerator { target.append(cb, 0, len); } } catch (Throwable throwable) { - LOG.log(Level.WARNING, "An exception encountered while executing jcmd " + vm.id(), throwable); + LOG.warning("An exception encountered while executing jcmd " + vm.id(), throwable); target.append(StringUtils.getStackTrace(throwable)); target.append('\n'); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameVersion.java index 7ea3635da..063c90240 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/GameVersion.java @@ -30,14 +30,13 @@ import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.StreamSupport; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import static org.jackhuang.hmcl.util.Lang.tryCast; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author huangyuhui @@ -51,7 +50,7 @@ final class GameVersion { Map version = JsonUtils.fromNonNullJsonFully(versionJson, Map.class); return tryCast(version.get("id"), String.class); } catch (IOException | JsonParseException e) { - LOG.log(Level.WARNING, "Failed to parse version.json", e); + LOG.warning("Failed to parse version.json", e); return Optional.empty(); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java index 994886117..f77767f69 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java @@ -21,7 +21,6 @@ import com.google.gson.JsonParseException; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Immutable; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.ToStringBuilder; import org.jackhuang.hmcl.util.gson.JsonMap; @@ -38,9 +37,10 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.logging.Level; import java.util.stream.Collectors; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + /** * * @author huangyuhui @@ -287,7 +287,7 @@ public class Version implements Comparable, Validation { } else { // To maximize the compatibility. if (!resolvedSoFar.add(id)) { - Logging.LOG.log(Level.WARNING, "Found circular dependency versions: " + resolvedSoFar); + LOG.warning("Found circular dependency versions: " + resolvedSoFar); thisVersion = this.jar == null ? this.setJar(id) : this; } else { // It is supposed to auto install an version in getVersion. @@ -331,7 +331,7 @@ public class Version implements Comparable, Validation { } else { // To maximize the compatibility. if (!resolvedSoFar.add(id)) { - Logging.LOG.log(Level.WARNING, "Found circular dependency versions: " + resolvedSoFar); + LOG.warning("Found circular dependency versions: " + resolvedSoFar); // keep thisVersion } else { // It is supposed to auto install an version in getVersion. diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java index 65ba38697..2c6ed74c8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java @@ -22,7 +22,6 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.LongTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; -import org.jackhuang.hmcl.util.*; import org.jackhuang.hmcl.util.io.CompressingUtils; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.Unzipper; @@ -33,12 +32,13 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.file.*; import java.util.List; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + public class World { private final Path file; @@ -237,13 +237,13 @@ public class World { try { return Stream.of(new World(world)); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to read world " + world, e); + LOG.warning("Failed to read world " + world, e); return Stream.empty(); } }); } } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to read saves", e); + LOG.warning("Failed to read saves", e); } return Stream.empty(); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 2375d762a..2d27b5623 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -40,10 +40,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; import java.util.function.Supplier; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.mapOf; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; /** @@ -147,7 +146,7 @@ public class DefaultLauncher extends Launcher { try { encoding = Charset.forName(fileEncoding.substring("-Dfile.encoding=".length())); } catch (Throwable ex) { - LOG.log(Level.WARNING, "Bad file encoding", ex); + LOG.warning("Bad file encoding", ex); } } @@ -705,7 +704,7 @@ public class DefaultLauncher extends Launcher { builder.environment().putAll(getEnvVars()); SystemUtils.callExternalProcess(builder); } catch (Throwable e) { - LOG.log(Level.WARNING, "An Exception happened while running exit command.", e); + LOG.warning("An Exception happened while running exit command.", e); } } }), "exit-waiter", isDaemon)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/StreamPump.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/StreamPump.java index 34f3e4dc1..e2ba96f51 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/StreamPump.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/StreamPump.java @@ -17,8 +17,6 @@ */ package org.jackhuang.hmcl.launch; -import org.jackhuang.hmcl.util.Logging; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -26,7 +24,8 @@ import java.io.InputStreamReader; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.function.Consumer; -import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * Pump the given input stream. @@ -68,7 +67,7 @@ public final class StreamPump implements Runnable { callback.accept(line); } } catch (IOException e) { - Logging.LOG.log(Level.SEVERE, "An error occurred when reading stream", e); + LOG.error("An error occurred when reading stream", e); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java index 4506179e5..be4be93b0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java @@ -24,7 +24,6 @@ import javafx.beans.property.SimpleBooleanProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import org.jackhuang.hmcl.mod.modinfo.PackMcMeta; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.CompressingUtils; @@ -34,7 +33,8 @@ import org.jackhuang.hmcl.util.io.Unzipper; import java.io.IOException; import java.nio.file.*; import java.util.*; -import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class Datapack { private boolean isMultiple; @@ -133,7 +133,7 @@ public class Datapack { PackMcMeta pack = JsonUtils.fromNonNullJson(FileUtils.readText(mcmeta), PackMcMeta.class); Platform.runLater(() -> info.add(new Pack(path, FileUtils.getNameWithoutExtension(path), pack.getPackInfo().getDescription(), this))); } catch (IOException | JsonParseException e) { - Logging.LOG.log(Level.WARNING, "Failed to read datapack " + path, e); + LOG.warning("Failed to read datapack " + path, e); } } else { throw new IOException("Malformed datapack zip"); @@ -145,7 +145,7 @@ public class Datapack { try { loadFromDir(path); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to read datapacks " + path, e); + LOG.warning("Failed to read datapacks " + path, e); } } @@ -169,7 +169,7 @@ public class Datapack { : JsonUtils.fromNonNullJson(FileUtils.readText(mcmetaDisabled), PackMcMeta.class); info.add(new Pack(enabled ? mcmeta : mcmetaDisabled, FileUtils.getName(subDir), pack.getPackInfo().getDescription(), this)); } catch (IOException | JsonParseException e) { - Logging.LOG.log(Level.WARNING, "Failed to read datapack " + subDir, e); + LOG.warning("Failed to read datapack " + subDir, e); } } else if (Files.isRegularFile(subDir)) { try (FileSystem fs = CompressingUtils.createReadOnlyZipFileSystem(subDir)) { @@ -189,7 +189,7 @@ public class Datapack { PackMcMeta pack = JsonUtils.fromNonNullJson(FileUtils.readText(mcmeta), PackMcMeta.class); info.add(new Pack(subDir, name, pack.getPackInfo().getDescription(), this)); } catch (IOException | JsonParseException e) { - Logging.LOG.log(Level.WARNING, "Failed to read datapack " + subDir, e); + LOG.warning("Failed to read datapack " + subDir, e); } } } @@ -226,7 +226,7 @@ public class Datapack { Pack.this.file = newF; } catch (IOException e) { // Mod file is occupied. - Logging.LOG.warning("Unable to rename file " + f + " to " + newF); + LOG.warning("Unable to rename file " + f + " to " + newF); } } }; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/LocalModFile.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/LocalModFile.java index d43dc843f..0f05a684b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/LocalModFile.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/LocalModFile.java @@ -19,15 +19,15 @@ package org.jackhuang.hmcl.mod; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.io.FileUtils; import java.io.IOException; import java.nio.file.Path; import java.util.*; -import java.util.logging.Level; import java.util.stream.Collectors; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + /** * * @author huangyuhui @@ -76,7 +76,7 @@ public final class LocalModFile implements Comparable { else LocalModFile.this.file = modManager.disableMod(path); } catch (IOException e) { - Logging.LOG.log(Level.SEVERE, "Unable to invert state of mod file " + path, e); + LOG.error("Unable to invert state of mod file " + path, e); } } }; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseCompletionTask.java index d40699219..125ab422a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseCompletionTask.java @@ -25,7 +25,6 @@ import org.jackhuang.hmcl.mod.ModpackCompletionException; import org.jackhuang.hmcl.mod.RemoteMod; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -37,10 +36,11 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + /** * Complete the CurseForge version. * @@ -89,7 +89,7 @@ public final class CurseCompletionTask extends Task { if (manifestFile.exists()) this.manifest = JsonUtils.GSON.fromJson(FileUtils.readText(manifestFile), CurseManifest.class); } catch (Exception e) { - Logging.LOG.log(Level.WARNING, "Unable to read CurseForge modpack manifest.json", e); + LOG.warning("Unable to read CurseForge modpack manifest.json", e); } setStage("hmcl.modpack.download"); @@ -123,11 +123,11 @@ public final class CurseCompletionTask extends Task { RemoteMod.File remoteFile = CurseForgeRemoteModRepository.MODS.getModFile(Integer.toString(file.getProjectID()), Integer.toString(file.getFileID())); return file.withFileName(remoteFile.getFilename()).withURL(remoteFile.getUrl()); } catch (FileNotFoundException fof) { - Logging.LOG.log(Level.WARNING, "Could not query api.curseforge.com for deleted mods: " + file.getProjectID() + ", " + file.getFileID(), fof); + LOG.warning("Could not query api.curseforge.com for deleted mods: " + file.getProjectID() + ", " + file.getFileID(), fof); notFound.set(true); return file; } catch (IOException | JsonParseException e) { - Logging.LOG.log(Level.WARNING, "Unable to fetch the file name projectID=" + file.getProjectID() + ", fileID=" + file.getFileID(), e); + LOG.warning("Unable to fetch the file name projectID=" + file.getProjectID() + ", fileID=" + file.getFileID(), e); allNameKnown.set(false); return file; } @@ -156,7 +156,7 @@ public final class CurseCompletionTask extends Task { task.setCaching(true); return Stream.of(task.withCounter("hmcl.modpack.download")); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Could not query api.curseforge.com for mod: " + f.getProjectID() + ", " + f.getFileID(), e); + LOG.warning("Could not query api.curseforge.com for mod: " + f.getProjectID() + ", " + f.getFileID(), e); return Stream.empty(); // Ignore this file. } finally { updateProgress(finished.incrementAndGet(), newManifest.getFiles().size()); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackCompletionTask.java index 78456f462..93be7eb00 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackCompletionTask.java @@ -27,7 +27,6 @@ import org.jackhuang.hmcl.mod.ModpackCompletionException; import org.jackhuang.hmcl.mod.curse.CurseMetaMod; import org.jackhuang.hmcl.task.*; import org.jackhuang.hmcl.util.DigestUtils; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -46,12 +45,12 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.jackhuang.hmcl.util.Lang.wrap; import static org.jackhuang.hmcl.util.Lang.wrapConsumer; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class McbbsModpackCompletionTask extends CompletableFutureTask { @@ -211,7 +210,7 @@ public class McbbsModpackCompletionTask extends CompletableFutureTask { CurseMetaMod mod = JsonUtils.fromNonNullJson(result, CurseMetaMod.class); return file.withFileName(mod.getFileNameOnDisk()).withURL(mod.getDownloadURL()); } catch (FileNotFoundException fof) { - Logging.LOG.log(Level.WARNING, "Could not query cursemeta for deleted mods: " + file.getUrl(), fof); + LOG.warning("Could not query cursemeta for deleted mods: " + file.getUrl(), fof); notFound.set(true); return file; } catch (IOException | JsonParseException e2) { @@ -220,13 +219,13 @@ public class McbbsModpackCompletionTask extends CompletableFutureTask { CurseMetaMod mod = JsonUtils.fromNonNullJson(result, CurseMetaMod.class); return file.withFileName(mod.getFileName()).withURL(mod.getDownloadURL()); } catch (FileNotFoundException fof) { - Logging.LOG.log(Level.WARNING, "Could not query forgesvc for deleted mods: " + file.getUrl(), fof); + LOG.warning("Could not query forgesvc for deleted mods: " + file.getUrl(), fof); notFound.set(true); return file; } catch (IOException | JsonParseException e3) { - Logging.LOG.log(Level.WARNING, "Unable to fetch the file name of URL: " + file.getUrl(), e); - Logging.LOG.log(Level.WARNING, "Unable to fetch the file name of URL: " + file.getUrl(), e2); - Logging.LOG.log(Level.WARNING, "Unable to fetch the file name of URL: " + file.getUrl(), e3); + LOG.warning("Unable to fetch the file name of URL: " + file.getUrl(), e); + LOG.warning("Unable to fetch the file name of URL: " + file.getUrl(), e2); + LOG.warning("Unable to fetch the file name of URL: " + file.getUrl(), e3); allNameKnown.set(false); return file; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java index 23d22fd12..ee31a96d7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java @@ -28,7 +28,6 @@ import org.jackhuang.hmcl.mod.curse.CurseManifestMinecraft; import org.jackhuang.hmcl.mod.curse.CurseManifestModLoader; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.DigestUtils; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.Zipper; @@ -42,6 +41,7 @@ import java.util.Collections; import java.util.List; import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.*; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class McbbsModpackExportTask extends Task { private final DefaultGameRepository repository; @@ -65,7 +65,7 @@ public class McbbsModpackExportTask extends Task { ArrayList blackList = new ArrayList<>(ModAdviser.MODPACK_BLACK_LIST); blackList.add(version + ".jar"); blackList.add(version + ".json"); - Logging.LOG.info("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); + LOG.info("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); try (Zipper zip = new Zipper(modpackFile.toPath())) { Path runDirectory = repository.getRunDirectory(version).toPath(); List files = new ArrayList<>(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeNewModMetadata.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeNewModMetadata.java index 28be57527..1d27bdbf1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeNewModMetadata.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeNewModMetadata.java @@ -17,9 +17,8 @@ import java.util.HashMap; import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; @Immutable public final class ForgeNewModMetadata { @@ -129,7 +128,7 @@ public final class ForgeNewModMetadata { Manifest manifest = new Manifest(is); jarVersion = manifest.getMainAttributes().getValue(Attributes.Name.IMPLEMENTATION_VERSION); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to parse MANIFEST.MF in file " + modFile); + LOG.warning("Failed to parse MANIFEST.MF in file " + modFile); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java index ada140bd3..3150a3457 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java @@ -22,7 +22,6 @@ import org.jackhuang.hmcl.game.DefaultGameRepository; import org.jackhuang.hmcl.mod.ModpackCompletionException; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -35,7 +34,8 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class ModrinthCompletionTask extends Task { @@ -78,7 +78,7 @@ public class ModrinthCompletionTask extends Task { if (manifestFile.exists()) this.manifest = JsonUtils.GSON.fromJson(FileUtils.readText(manifestFile), ModrinthManifest.class); } catch (Exception e) { - Logging.LOG.log(Level.WARNING, "Unable to read Modrinth modpack manifest.json", e); + LOG.warning("Unable to read Modrinth modpack manifest.json", e); } setStage("hmcl.modpack.download"); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java index 9d90dacc2..99ff9ab35 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java @@ -23,7 +23,6 @@ import org.jackhuang.hmcl.mod.ModAdviser; import org.jackhuang.hmcl.mod.Modpack; import org.jackhuang.hmcl.mod.ModpackExportInfo; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.Zipper; @@ -34,6 +33,7 @@ import java.util.ArrayList; import java.util.List; import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.*; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * Export the game to a mod pack file. @@ -66,7 +66,7 @@ public class MultiMCModpackExportTask extends Task { ArrayList blackList = new ArrayList<>(ModAdviser.MODPACK_BLACK_LIST); blackList.add(versionId + ".jar"); blackList.add(versionId + ".json"); - Logging.LOG.info("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); + LOG.info("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); try (Zipper zip = new Zipper(output.toPath())) { zip.putDirectory(repository.getRunDirectory(versionId).toPath(), ".minecraft", path -> Modpack.acceptFile(path, blackList, whitelist)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackCompletionTask.java index 97dd85121..9f7ddfb95 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackCompletionTask.java @@ -27,7 +27,6 @@ import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.DigestUtils; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -40,9 +39,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.function.Function; -import java.util.logging.Level; import java.util.stream.Collectors; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + public class ServerModpackCompletionTask extends Task { private final DefaultDependencyManager dependencyManager; @@ -70,7 +70,7 @@ public class ServerModpackCompletionTask extends Task { }.getType()); } } catch (Exception e) { - Logging.LOG.log(Level.WARNING, "Unable to read Server modpack manifest.json", e); + LOG.warning("Unable to read Server modpack manifest.json", e); } } else { this.manifest = manifest; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java index 5261c8e1b..e172f1850 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java @@ -25,7 +25,6 @@ import org.jackhuang.hmcl.mod.ModpackConfiguration; import org.jackhuang.hmcl.mod.ModpackExportInfo; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.DigestUtils; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.Zipper; @@ -38,6 +37,7 @@ import java.util.ArrayList; import java.util.List; import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.*; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class ServerModpackExportTask extends Task { private final DefaultGameRepository repository; @@ -61,7 +61,7 @@ public class ServerModpackExportTask extends Task { ArrayList blackList = new ArrayList<>(ModAdviser.MODPACK_BLACK_LIST); blackList.add(versionId + ".jar"); blackList.add(versionId + ".json"); - Logging.LOG.info("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); + LOG.info("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); try (Zipper zip = new Zipper(modpackFile.toPath())) { Path runDirectory = repository.getRunDirectory(versionId).toPath(); List files = new ArrayList<>(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/AsyncTaskExecutor.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/AsyncTaskExecutor.java index fb8277b82..71ae7cfd1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/AsyncTaskExecutor.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/AsyncTaskExecutor.java @@ -19,14 +19,13 @@ package org.jackhuang.hmcl.task; import com.google.gson.JsonParseException; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.Logging; import java.util.Collection; import java.util.Collections; import java.util.concurrent.*; -import java.util.logging.Level; import static org.jackhuang.hmcl.util.Lang.*; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @@ -49,7 +48,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { if (!success) { // We log exception stacktrace because some of exceptions occurred because of bugs. - Logging.LOG.log(Level.WARNING, "An exception occurred in task execution", exception); + LOG.warning("An exception occurred in task execution", exception); Throwable resolvedException = resolveException(exception); if (resolvedException instanceof RuntimeException && @@ -82,7 +81,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { } catch (ExecutionException ignore) { // We have dealt with ExecutionException in exception handling and uncaught exception handler. } catch (CancellationException e) { - Logging.LOG.log(Level.INFO, "Task " + firstTask + " has been cancelled.", e); + LOG.info("Task " + firstTask + " has been cancelled.", e); } return false; } @@ -141,7 +140,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { task.setStage(parentTask.getStage()); if (task.getSignificance().shouldLog()) - Logging.LOG.log(Level.FINE, "Executing task: " + task.getName()); + LOG.trace("Executing task: " + task.getName()); taskListeners.forEach(it -> it.onReady(task)); @@ -161,7 +160,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { checkCancellation(); if (task.getSignificance().shouldLog()) { - Logging.LOG.log(Level.FINER, "Task finished: " + task.getName()); + LOG.trace("Task finished: " + task.getName()); } task.setResult(result); @@ -179,7 +178,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { if (e instanceof InterruptedException || e instanceof CancellationException) { task.setException(null); if (task.getSignificance().shouldLog()) { - Logging.LOG.log(Level.FINE, "Task aborted: " + task.getName()); + LOG.trace("Task aborted: " + task.getName()); } task.onDone().fireEvent(new TaskEvent(this, task, true)); taskListeners.forEach(it -> it.onFailed(task, e)); @@ -187,7 +186,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { task.setException(e); exception = e; if (task.getSignificance().shouldLog()) { - Logging.LOG.log(Level.FINE, "Task failed: " + task.getName(), e); + LOG.trace("Task failed: " + task.getName(), e); } task.onDone().fireEvent(new TaskEvent(this, task, true)); taskListeners.forEach(it -> it.onFailed(task, e)); @@ -215,7 +214,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { task.setNotifyPropertiesChanged(() -> taskListeners.forEach(it -> it.onPropertiesUpdate(task))); if (task.getSignificance().shouldLog()) - Logging.LOG.log(Level.FINE, "Executing task: " + task.getName()); + LOG.trace("Executing task: " + task.getName()); taskListeners.forEach(it -> it.onReady(task)); @@ -266,7 +265,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { boolean isDependenciesSucceeded = dependenciesException == null; if (!isDependenciesSucceeded) { - Logging.LOG.severe("Subtasks failed for " + task.getName()); + LOG.error("Subtasks failed for " + task.getName()); task.setException(dependenciesException); if (task.isRelyingOnDependencies()) { rethrow(dependenciesException); @@ -276,7 +275,7 @@ public final class AsyncTaskExecutor extends TaskExecutor { checkCancellation(); if (task.getSignificance().shouldLog()) { - Logging.LOG.log(Level.FINER, "Task finished: " + task.getName()); + LOG.trace("Task finished: " + task.getName()); } task.onDone().fireEvent(new TaskEvent(this, task, false)); @@ -294,11 +293,11 @@ public final class AsyncTaskExecutor extends TaskExecutor { exception = e; if (e instanceof CancellationException) { if (task.getSignificance().shouldLog()) { - Logging.LOG.log(Level.FINE, "Task aborted: " + task.getName()); + LOG.trace("Task aborted: " + task.getName()); } } else { if (task.getSignificance().shouldLog()) { - Logging.LOG.log(Level.FINE, "Task failed: " + task.getName(), e); + LOG.trace("Task failed: " + task.getName(), e); } } task.onDone().fireEvent(new TaskEvent(this, task, true)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java index 18e5855c8..a8c95a4cc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java @@ -20,7 +20,6 @@ package org.jackhuang.hmcl.task; import org.jackhuang.hmcl.event.Event; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.util.CacheRepository; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.ToStringBuilder; import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.io.NetworkUtils; @@ -37,10 +36,10 @@ import java.nio.file.Path; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; import java.util.stream.Collectors; import static org.jackhuang.hmcl.util.Lang.threadPool; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public abstract class FetchTask extends Task { protected final List urls; @@ -116,7 +115,7 @@ public abstract class FetchTask extends Task { useCachedResult(cache); return; } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Unable to use cached file, redownload " + url, e); + LOG.warning("Unable to use cached file, redownload " + url, e); repository.removeRemoteEntry(conn); // Now we must reconnect the server since 304 may result in empty content, // if we want to redownload the file, we must reconnect the server without etag settings. @@ -167,13 +166,13 @@ public abstract class FetchTask extends Task { } catch (FileNotFoundException ex) { failedURL = url; exception = ex; - Logging.LOG.log(Level.WARNING, "Failed to download " + url + ", not found" + ((redirects == null || redirects.isEmpty()) ? "" : ", redirects: " + redirects), ex); + LOG.warning("Failed to download " + url + ", not found" + ((redirects == null || redirects.isEmpty()) ? "" : ", redirects: " + redirects), ex); break; // we will not try this URL again } catch (IOException ex) { failedURL = url; exception = ex; - Logging.LOG.log(Level.WARNING, "Failed to download " + url + ", repeat times: " + (++repeat) + ((redirects == null || redirects.isEmpty()) ? "" : ", redirects: " + redirects), ex); + LOG.warning("Failed to download " + url + ", repeat times: " + (++repeat) + ((redirects == null || redirects.isEmpty()) ? "" : ", redirects: " + redirects), ex); } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java index 1b4664130..622daf110 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FileDownloadTask.java @@ -18,7 +18,6 @@ package org.jackhuang.hmcl.task; import org.jackhuang.hmcl.util.Hex; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.io.ChecksumMismatchException; import org.jackhuang.hmcl.util.io.CompressingUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -33,10 +32,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.security.MessageDigest; import java.util.*; -import java.util.logging.Level; import static java.util.Objects.requireNonNull; import static org.jackhuang.hmcl.util.DigestUtils.getDigest; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * A task that can download a file online. @@ -166,10 +165,10 @@ public class FileDownloadTask extends FetchTask { if (cache.isPresent()) { try { FileUtils.copyFile(cache.get().toFile(), file); - Logging.LOG.log(Level.FINER, "Successfully verified file " + file + " from " + urls.get(0)); + LOG.trace("Successfully verified file " + file + " from " + urls.get(0)); return EnumCheckETag.CACHED; } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to copy cache files", e); + LOG.warning("Failed to copy cache files", e); } } return EnumCheckETag.NOT_CHECK_E_TAG; @@ -180,7 +179,7 @@ public class FileDownloadTask extends FetchTask { @Override protected void beforeDownload(URL url) { - Logging.LOG.log(Level.FINER, "Downloading " + url + " to " + file); + LOG.trace("Downloading " + url + " to " + file); } @Override @@ -209,14 +208,14 @@ public class FileDownloadTask extends FetchTask { try { rFile.close(); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to close file: " + rFile, e); + LOG.warning("Failed to close file: " + rFile, e); } if (!isSuccess()) { try { Files.delete(temp); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to delete file: " + rFile, e); + LOG.warning("Failed to delete file: " + rFile, e); } return; } @@ -244,7 +243,7 @@ public class FileDownloadTask extends FetchTask { try { repository.cacheFile(file.toPath(), integrityCheck.getAlgorithm(), integrityCheck.getChecksum()); } catch (IOException e) { - Logging.LOG.log(Level.WARNING, "Failed to cache file", e); + LOG.warning("Failed to cache file", e); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java index d40dc870b..d51f001a6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java @@ -18,11 +18,11 @@ package org.jackhuang.hmcl.task; import javafx.application.Platform; -import org.jackhuang.hmcl.util.Logging; import java.util.concurrent.*; import static org.jackhuang.hmcl.util.Lang.threadPool; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @@ -65,7 +65,7 @@ public final class Schedulers { } public static synchronized void shutdown() { - Logging.LOG.info("Shutting down executor services."); + LOG.info("Shutting down executor services."); // shutdownNow will interrupt all threads. // So when we want to close the app, no threads need to be waited for finish. diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java index 779148b83..3e2fe9e51 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java @@ -24,7 +24,6 @@ import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.ReadOnlyStringWrapper; import org.jackhuang.hmcl.event.EventManager; import org.jackhuang.hmcl.util.InvocationDispatcher; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.ReflectionHelper; import org.jackhuang.hmcl.util.function.ExceptionalConsumer; import org.jackhuang.hmcl.util.function.ExceptionalFunction; @@ -39,9 +38,10 @@ import java.util.concurrent.Executor; import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Supplier; -import java.util.logging.Level; import java.util.stream.Collectors; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + /** * Disposable task. * @@ -359,7 +359,7 @@ public abstract class Task { public final T run() throws Exception { if (getSignificance().shouldLog()) - Logging.LOG.log(Level.FINE, "Executing task: " + getName()); + LOG.trace("Executing task: " + getName()); for (Task task : getDependents()) doSubTask(task); @@ -776,7 +776,7 @@ public abstract class Task { try { success.run(); } catch (Exception e) { - Logging.LOG.log(Level.WARNING, "Failed to execute " + success, e); + LOG.warning("Failed to execute " + success, e); if (failure != null) failure.accept(e); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java index 2a735e2ba..89082d4cc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java @@ -43,11 +43,10 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.BiFunction; -import java.util.logging.Level; import java.util.stream.Stream; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class CacheRepository { private Path commonDirectory; @@ -77,7 +76,7 @@ public class CacheRepository { } else index = new HashMap<>(); } catch (IOException | JsonParseException e) { - LOG.log(Level.WARNING, "Unable to read index file", e); + LOG.warning("Unable to read index file", e); index = new HashMap<>(); } finally { lock.writeLock().unlock(); @@ -263,7 +262,7 @@ public class CacheRepository { try { Files.deleteIfExists(cached); } catch (IOException e) { - LOG.log(Level.WARNING, "Cannot delete old file"); + LOG.warning("Cannot delete old file"); } return newItem; } else { @@ -417,7 +416,7 @@ public class CacheRepository { }.getType())); } } catch (IOException | JsonParseException e) { - LOG.log(Level.WARNING, "Unable to read storage {" + name + "} file"); + LOG.warning("Unable to read storage {" + name + "} file"); } finally { lock.writeLock().unlock(); } @@ -438,7 +437,7 @@ public class CacheRepository { lock.release(); } } catch (IOException e) { - LOG.log(Level.WARNING, "Unable to write storage {" + name + "} file"); + LOG.warning("Unable to write storage {" + name + "} file"); } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java deleted file mode 100644 index 48f58f6fc..000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2021 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.util; - -import org.jackhuang.hmcl.util.io.IOUtils; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.logging.*; - -/** - * @author huangyuhui - */ -public final class Logging { - private Logging() { - } - - public static final Logger LOG = Logger.getLogger("HMCL"); - private static final ByteArrayOutputStream storedLogs = new ByteArrayOutputStream(IOUtils.DEFAULT_BUFFER_SIZE); - - private static volatile String[] accessTokens = new String[0]; - - public static synchronized void registerAccessToken(String token) { - final String[] oldAccessTokens = accessTokens; - final String[] newAccessTokens = Arrays.copyOf(oldAccessTokens, oldAccessTokens.length + 1); - - newAccessTokens[oldAccessTokens.length] = token; - - accessTokens = newAccessTokens; - } - - public static String filterForbiddenToken(String message) { - for (String token : accessTokens) - message = message.replace(token, ""); - return message; - } - - public static void start(Path logFolder) { - LOG.setLevel(Level.ALL); - LOG.setUseParentHandlers(false); - LOG.setFilter(record -> { - record.setMessage(format(record)); - return true; - }); - - DefaultFormatter formatter = new DefaultFormatter(); - try { - if (Files.isRegularFile(logFolder)) - Files.delete(logFolder); - - Files.createDirectories(logFolder); - FileHandler fileHandler = new FileHandler(logFolder.resolve("hmcl.log").toAbsolutePath().toString()); - fileHandler.setLevel(Level.FINEST); - fileHandler.setFormatter(formatter); - fileHandler.setEncoding("UTF-8"); - LOG.addHandler(fileHandler); - } catch (IOException e) { - System.err.println("Unable to create hmcl.log\n" + StringUtils.getStackTrace(e)); - } - - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setFormatter(formatter); - consoleHandler.setLevel(Level.FINER); - LOG.addHandler(consoleHandler); - - StreamHandler streamHandler = new StreamHandler(storedLogs, formatter) { - @Override - public synchronized void publish(LogRecord record) { - super.publish(record); - flush(); - } - }; - try { - streamHandler.setEncoding("UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - streamHandler.setLevel(Level.ALL); - LOG.addHandler(streamHandler); - } - - public static void initForTest() { - LOG.setLevel(Level.ALL); - LOG.setUseParentHandlers(false); - - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setFormatter(new DefaultFormatter()); - consoleHandler.setLevel(Level.FINER); - LOG.addHandler(consoleHandler); - } - - public static byte[] getRawLogs() { - return storedLogs.toByteArray(); - } - - public static String getLogs() { - try { - return storedLogs.toString("UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new InternalError(e); - } - } - - private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.systemDefault()); - - private static String format(LogRecord record) { - String message = filterForbiddenToken(record.getMessage()); - - StringBuilder builder = new StringBuilder(128 + message.length()); - builder.append('['); - TIME_FORMATTER.formatTo(Instant.ofEpochMilli(record.getMillis()), builder); - builder.append(']'); - - builder.append(" [") - .append(record.getSourceClassName()) - .append('.') - .append(record.getSourceMethodName()) - .append('/') - .append(record.getLevel().getName()) - .append("] ") - .append(message) - .append('\n'); - - - Throwable thrown = record.getThrown(); - if (thrown == null) { - return builder.toString(); - } else { - StringWriter writer = new StringWriter(builder.length() + 2048); - writer.getBuffer().append(builder); - try (PrintWriter printWriter = new PrintWriter(writer)) { - thrown.printStackTrace(printWriter); - } - - return writer.toString(); - } - } - - private static final class DefaultFormatter extends Formatter { - @Override - public String format(LogRecord record) { - return record.getMessage(); - } - } -} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java index 16aa2c10d..39090df69 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Pack200Utils.java @@ -24,9 +24,8 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.jar.JarOutputStream; -import java.util.logging.Level; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author Glavo @@ -73,7 +72,7 @@ public final class Pack200Utils { unpack = lookup.findVirtual(unpackerClass, "unpack", MethodType.methodType(void.class, InputStream.class, JarOutputStream.class)); unpackFile = lookup.findVirtual(unpackerClass, "unpack", MethodType.methodType(void.class, File.class, JarOutputStream.class)); } catch (Throwable e) { - LOG.log(Level.WARNING, "Failed to find pack200 methods", e); + LOG.warning("Failed to find pack200 methods", e); } if (newUnpacker != null) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java index 2a3e830c6..ce0230b23 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java @@ -36,10 +36,9 @@ import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; -import java.util.logging.Level; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author huang @@ -369,7 +368,7 @@ public final class FileUtils { FileUtils.writeText(infoFile, "[Trash Info]\nPath=" + file.getAbsolutePath() + "\nDeletionDate=" + time + "\n"); FileUtils.forceDelete(file); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to move " + file + " to trash", e); + LOG.warning("Failed to move " + file + " to trash", e); return false; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpServer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpServer.java index 541af0253..dd2d7ae0b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpServer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpServer.java @@ -19,7 +19,6 @@ package org.jackhuang.hmcl.util.io; import com.google.gson.JsonParseException; import fi.iki.elonen.NanoHTTPD; -import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.function.ExceptionalFunction; import org.jackhuang.hmcl.util.gson.JsonUtils; @@ -27,11 +26,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; import static org.jackhuang.hmcl.util.Lang.mapOf; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class HttpServer extends NanoHTTPD { private int traceId = 0; @@ -54,7 +53,7 @@ public class HttpServer extends NanoHTTPD { } protected static Response ok(Object response) { - Logging.LOG.info(String.format("Response %s", JsonUtils.GSON.toJson(response))); + LOG.info(String.format("Response %s", JsonUtils.GSON.toJson(response))); return newFixedLengthResponse(Response.Status.OK, "text/json", JsonUtils.GSON.toJson(response)); } @@ -77,7 +76,7 @@ public class HttpServer extends NanoHTTPD { @Override public Response serve(IHTTPSession session) { int currentId = traceId++; - Logging.LOG.info(String.format("[%d] %s --> %s", currentId, session.getMethod().name(), + LOG.info(String.format("[%d] %s --> %s", currentId, session.getMethod().name(), session.getUri() + Optional.ofNullable(session.getQueryParameterString()).map(s -> "?" + s).orElse(""))); Response response = null; @@ -92,7 +91,7 @@ public class HttpServer extends NanoHTTPD { } if (response == null) response = notFound(); - Logging.LOG.info(String.format("[%d] %s <--", currentId, response.getStatus())); + LOG.info(String.format("[%d] %s <--", currentId, response.getStatus())); return response; } @@ -131,7 +130,7 @@ public class HttpServer extends NanoHTTPD { } catch (JsonParseException e) { return badRequest(); } catch (Exception e) { - Logging.LOG.log(Level.SEVERE, "Error handling " + request.getSession().getUri(), e); + LOG.error("Error handling " + request.getSession().getUri(), e); return internalError(); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/CallerFinder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/CallerFinder.java new file mode 100644 index 000000000..c6b99f7ba --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/CallerFinder.java @@ -0,0 +1,29 @@ +package org.jackhuang.hmcl.util.logging; + +/** + * @author Glavo + */ +final class CallerFinder { + static String getCaller() { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + + int i = 0; + while (i++ < stackTrace.length) { + if (stackTrace[i].getClassName().equals(Logger.CLASS_NAME)) + break; + } + + while (i++ < stackTrace.length) { + StackTraceElement element = stackTrace[i]; + String cname = element.getClassName(); + if (!cname.equals(Logger.CLASS_NAME) && !cname.startsWith("java.lang.reflect.") && !cname.startsWith("sun.reflect.")) { + return cname + '.' + element.getMethodName(); + } + } + + return null; + } + + private CallerFinder() { + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/Level.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/Level.java new file mode 100644 index 000000000..e1a584726 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/Level.java @@ -0,0 +1,8 @@ +package org.jackhuang.hmcl.util.logging; + +/** + * @author Glavo + */ +public enum Level { + ERROR, WARNING, INFO, DEBUG, TRACE +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/LogEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/LogEvent.java new file mode 100644 index 000000000..dcacdb756 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/LogEvent.java @@ -0,0 +1,44 @@ +package org.jackhuang.hmcl.util.logging; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.concurrent.CountDownLatch; + +/** + * @author Glavo + */ +abstract class LogEvent { + static final class DoLog extends LogEvent { + final long time; + final String caller; + final Level level; + final String message; + final Throwable exception; + + DoLog(long time, String caller, Level level, String message, Throwable exception) { + this.time = time; + this.caller = caller; + this.level = level; + this.message = message; + this.exception = exception; + } + } + + static final class ExportLog extends LogEvent { + final CountDownLatch latch = new CountDownLatch(1); + + final OutputStream output; + IOException exception; + + ExportLog(OutputStream output) { + this.output = output; + } + + void await() throws InterruptedException { + latch.await(); + } + } + + static final class Shutdown extends LogEvent { + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/Logger.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/Logger.java new file mode 100644 index 000000000..be813ee5e --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/logging/Logger.java @@ -0,0 +1,349 @@ +package org.jackhuang.hmcl.util.logging; + +import org.jackhuang.hmcl.util.Pair; +import org.tukaani.xz.LZMA2Options; +import org.tukaani.xz.XZOutputStream; + +import java.io.*; +import java.nio.file.*; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.nio.file.StandardOpenOption.CREATE_NEW; + +/** + * @author Glavo + */ +public final class Logger { + public static final Logger LOG = new Logger(); + + private static volatile String[] accessTokens = new String[0]; + + public static synchronized void registerAccessToken(String token) { + final String[] oldAccessTokens = accessTokens; + final String[] newAccessTokens = Arrays.copyOf(oldAccessTokens, oldAccessTokens.length + 1); + + newAccessTokens[oldAccessTokens.length] = token; + + accessTokens = newAccessTokens; + } + + public static String filterForbiddenToken(String message) { + for (String token : accessTokens) + message = message.replace(token, ""); + return message; + } + + + static final String CLASS_NAME = Logger.class.getName(); + + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.systemDefault()); + + private final BlockingQueue queue = new LinkedBlockingQueue<>(); + private final StringBuilder builder = new StringBuilder(512); + + private Path logFile; + private ByteArrayOutputStream rawLogs; + private PrintWriter logWriter; + + private Thread loggerThread; + + private boolean shutdown = false; + + private int logRetention = 0; + + public void setLogRetention(int logRetention) { + this.logRetention = Math.max(0, logRetention); + } + + private String format(LogEvent.DoLog event) { + StringBuilder builder = this.builder; + builder.setLength(0); + builder.append('['); + TIME_FORMATTER.formatTo(Instant.ofEpochMilli(event.time), builder); + builder.append("] [") + .append(event.caller) + .append('/') + .append(event.level) + .append("] ") + .append(filterForbiddenToken(event.message)); + return builder.toString(); + } + + private void handle(LogEvent event) { + if (event instanceof LogEvent.DoLog) { + String log = format((LogEvent.DoLog) event); + Throwable exception = ((LogEvent.DoLog) event).exception; + + System.out.println(log); + if (exception != null) + exception.printStackTrace(System.out); + + logWriter.println(log); + if (exception != null) + exception.printStackTrace(logWriter); + } else if (event instanceof LogEvent.ExportLog) { + LogEvent.ExportLog exportEvent = (LogEvent.ExportLog) event; + logWriter.flush(); + try { + if (logFile != null) { + Files.copy(logFile, exportEvent.output); + } else { + rawLogs.writeTo(exportEvent.output); + } + } catch (IOException e) { + exportEvent.exception = e; + } finally { + exportEvent.latch.countDown(); + } + } else if (event instanceof LogEvent.Shutdown) { + shutdown = true; + } else { + throw new AssertionError("Unknown event: " + event); + } + } + + private void onShutdown() { + try { + loggerThread.join(); + } catch (InterruptedException ignored) { + } + + String caller = CLASS_NAME + ".onShutdown"; + + if (logRetention > 0 && logFile != null) { + List> list = new ArrayList<>(); + Pattern fileNamePattern = Pattern.compile("(?\\d{4})-(?\\d{2})-(?\\d{2})T(?\\d{2})-(?\\d{2})-(?\\d{2})(\\.(?\\d+))?\\.log(\\.(gz|xz))?"); + Path dir = logFile.getParent(); + try (DirectoryStream stream = Files.newDirectoryStream(dir)) { + for (Path path : stream) { + Matcher matcher = fileNamePattern.matcher(path.getFileName().toString()); + if (matcher.matches() && Files.isRegularFile(path)) { + int year = Integer.parseInt(matcher.group("year")); + int month = Integer.parseInt(matcher.group("month")); + int day = Integer.parseInt(matcher.group("day")); + int hour = Integer.parseInt(matcher.group("hour")); + int minute = Integer.parseInt(matcher.group("minute")); + int second = Integer.parseInt(matcher.group("second")); + int n = Optional.ofNullable(matcher.group("n")).map(Integer::parseInt).orElse(0); + + list.add(Pair.pair(path, new int[]{year, month, day, hour, minute, second, n})); + } + } + } catch (IOException e) { + log(Level.WARNING, caller, "Failed to list log files in " + dir, e); + } + + if (list.size() <= logRetention) { + return; + } + + list.sort((a, b) -> { + int[] v1 = a.getValue(); + int[] v2 = b.getValue(); + + assert v1.length == v2.length; + + for (int i = 0; i < v1.length; i++) { + int c = Integer.compare(v1[i], v2[i]); + if (c != 0) + return c; + } + + return 0; + }); + + for (int i = 0, end = list.size() - logRetention; i < end; i++) { + Path file = list.get(i).getKey(); + + try { + if (!Files.isSameFile(file, logFile)) { + log(Level.INFO, caller, "Delete old log file " + file, null); + Files.delete(file); + } + } catch (IOException e) { + log(Level.WARNING, caller, "Failed to delete log file " + file, e); + } + } + } + + ArrayList logs = new ArrayList<>(); + queue.drainTo(logs); + for (LogEvent log : logs) { + handle(log); + } + + if (logFile == null) { + return; + } + + boolean failed = false; + Path xzFile = logFile.resolveSibling(logFile.getFileName() + ".xz"); + try (XZOutputStream output = new XZOutputStream(Files.newOutputStream(xzFile), new LZMA2Options())) { + logWriter.flush(); + Files.copy(logFile, output); + } catch (IOException e) { + failed = true; + handle(new LogEvent.DoLog(System.currentTimeMillis(), caller, Level.WARNING, "Failed to dump log file to xz format", e)); + } finally { + logWriter.close(); + } + + if (!failed) + try { + Files.delete(logFile); + } catch (IOException e) { + System.err.println("An exception occurred while deleting raw log file"); + e.printStackTrace(System.err); + } + } + + public void start(Path logFolder) { + if (logFolder != null) { + String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss")); + try { + for (int n = 0; ; n++) { + Path file = logFolder.resolve(time + (n == 0 ? "" : "." + n) + ".log").toAbsolutePath().normalize(); + try { + logWriter = new PrintWriter(Files.newBufferedWriter(file, UTF_8, CREATE_NEW)); + logFile = file; + break; + } catch (FileAlreadyExistsException ignored) { + } + } + } catch (IOException e) { + log(Level.WARNING, CLASS_NAME + ".start", "Failed to create log file", e); + } + } + + if (logWriter == null) { + rawLogs = new ByteArrayOutputStream(256 * 1024); + logWriter = new PrintWriter(new OutputStreamWriter(rawLogs, UTF_8)); + } + + loggerThread = new Thread(() -> { + ArrayList logs = new ArrayList<>(); + try { + while (!shutdown) { + if (queue.drainTo(logs) > 0) { + for (LogEvent log : logs) { + handle(log); + } + logs.clear(); + } else { + logWriter.flush(); + handle(queue.take()); + } + } + + while (queue.drainTo(logs) > 0) { + for (LogEvent log : logs) { + handle(log); + } + logs.clear(); + } + } catch (InterruptedException e) { + throw new AssertionError("This thread cannot be interrupted", e); + } + }); + loggerThread.setName("HMCL Logger Thread"); + loggerThread.start(); + + Thread cleanerThread = new Thread(this::onShutdown); + cleanerThread.setName("HMCL Logger Shutdown Hook"); + Runtime.getRuntime().addShutdownHook(cleanerThread); + } + + public void shutdown() { + queue.add(new LogEvent.Shutdown()); + } + + public Path getLogFile() { + return logFile; + } + + public void exportLogs(OutputStream output) throws IOException { + Objects.requireNonNull(output); + LogEvent.ExportLog event = new LogEvent.ExportLog(output); + try { + queue.put(event); + event.await(); + } catch (InterruptedException e) { + throw new AssertionError("This thread cannot be interrupted", e); + } + if (event.exception != null) { + throw event.exception; + } + } + + public String getLogs() { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + try { + exportLogs(output); + return output.toString("UTF-8"); + } catch (IOException e) { + log(Level.WARNING, CLASS_NAME + ".getLogs", "Failed to export logs", e); + return ""; + } + } + + private void log(Level level, String caller, String msg, Throwable exception) { + queue.add(new LogEvent.DoLog(System.currentTimeMillis(), caller, level, msg, exception)); + } + + public void log(Level level, String msg) { + log(level, CallerFinder.getCaller(), msg, null); + } + + public void log(Level level, String msg, Throwable exception) { + log(level, CallerFinder.getCaller(), msg, exception); + } + + public void error(String msg) { + log(Level.ERROR, CallerFinder.getCaller(), msg, null); + } + + public void error(String msg, Throwable exception) { + log(Level.ERROR, CallerFinder.getCaller(), msg, exception); + } + + public void warning(String msg) { + log(Level.WARNING, CallerFinder.getCaller(), msg, null); + } + + public void warning(String msg, Throwable exception) { + log(Level.WARNING, CallerFinder.getCaller(), msg, exception); + } + + public void info(String msg) { + log(Level.INFO, CallerFinder.getCaller(), msg, null); + } + + public void info(String msg, Throwable exception) { + log(Level.INFO, CallerFinder.getCaller(), msg, exception); + } + + public void debug(String msg) { + log(Level.DEBUG, CallerFinder.getCaller(), msg, null); + } + + public void debug(String msg, Throwable exception) { + log(Level.DEBUG, CallerFinder.getCaller(), msg, exception); + } + + public void trace(String msg) { + log(Level.TRACE, CallerFinder.getCaller(), msg, null); + } + + public void trace(String msg, Throwable exception) { + log(Level.TRACE, CallerFinder.getCaller(), msg, exception); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/CommandBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/CommandBuilder.java index 3eff05996..fd7034dbf 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/CommandBuilder.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/CommandBuilder.java @@ -26,7 +26,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class CommandBuilder { private static final Pattern UNSTABLE_OPTION_PATTERN = Pattern.compile("-XX:(?[a-zA-Z0-9]+)=(?.*)"); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java index eec4df7a3..9097960ed 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java @@ -30,13 +30,12 @@ import java.io.InputStreamReader; import java.nio.file.*; import java.util.*; import java.util.concurrent.*; -import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; import static java.util.stream.Collectors.toList; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * Represents a Java installation. @@ -222,7 +221,7 @@ public final class JavaVersion { try { currentExecutable = currentExecutable.toRealPath(); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to resolve current Java path: " + currentExecutable, e); + LOG.warning("Failed to resolve current Java path: " + currentExecutable, e); } CURRENT_JAVA = new JavaVersion( currentExecutable, @@ -250,7 +249,7 @@ public final class JavaVersion { try (Stream stream = searchPotentialJavaExecutables()) { javaVersions = lookupJavas(stream); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to search Java homes", e); + LOG.warning("Failed to search Java homes", e); javaVersions = new ArrayList<>(); } @@ -262,7 +261,7 @@ public final class JavaVersion { JAVAS = Collections.newSetFromMap(new ConcurrentHashMap<>()); JAVAS.addAll(javaVersions); - LOG.log(Level.FINE, "Finished Java installation lookup, found " + JAVAS.size()); + LOG.trace("Finished Java installation lookup, found " + JAVAS.size()); LATCH.countDown(); } @@ -274,7 +273,7 @@ public final class JavaVersion { try { return Stream.of(executable.toRealPath()); } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to lookup Java executable at " + executable, e); + LOG.warning("Failed to lookup Java executable at " + executable, e); return Stream.empty(); } }) @@ -284,13 +283,13 @@ public final class JavaVersion { return Stream.of(CURRENT_JAVA); } try { - LOG.log(Level.FINER, "Looking for Java:" + executable); + LOG.trace("Looking for Java:" + executable); Future future = Schedulers.io().submit(() -> fromExecutable(executable)); JavaVersion javaVersion = future.get(5, TimeUnit.SECONDS); - LOG.log(Level.FINE, "Found Java (" + javaVersion.getVersion() + ") " + javaVersion.getBinary().toString()); + LOG.trace("Found Java (" + javaVersion.getVersion() + ") " + javaVersion.getBinary().toString()); return Stream.of(javaVersion); } catch (ExecutionException | InterruptedException | TimeoutException e) { - LOG.log(Level.WARNING, "Failed to determine Java at " + executable, e); + LOG.warning("Failed to determine Java at " + executable, e); return Stream.empty(); } }) @@ -393,7 +392,7 @@ public final class JavaVersion { try { homes.add(Paths.get(home)); } catch (InvalidPathException e) { - LOG.log(Level.WARNING, "Invalid Java path in system registry: " + home); + LOG.warning("Invalid Java path in system registry: " + home); } } } @@ -439,15 +438,4 @@ public final class JavaVersion { } return null; } - // ==== - - public static void main(String[] args) { - try { - LOG.setLevel(Level.ALL); - initialize(); - LOG.info(JAVAS.toString()); - } catch (Throwable e) { - LOG.log(Level.WARNING, "Oops:", e); - } - } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/SystemUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/SystemUtils.java index 791170f00..92e74708f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/SystemUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/SystemUtils.java @@ -21,7 +21,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class SystemUtils { private SystemUtils() {}