From be5b26c2dc18c49b12c298c4b94cbbf01363bd40 Mon Sep 17 00:00:00 2001 From: Zkitefly <64117916+zkitefly@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:17:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=89=80=E6=9C=89=E5=90=AF=E5=8A=A8=E5=99=A8=E6=97=A5=E5=BF=97?= =?UTF-8?q?=20=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/ui/main/SettingsPage.java | 38 +++++++++++++++++++ .../jackhuang/hmcl/ui/main/SettingsView.java | 10 ++++- .../resources/assets/lang/I18N.properties | 1 + .../resources/assets/lang/I18N_es.properties | 1 + .../resources/assets/lang/I18N_ja.properties | 1 + .../resources/assets/lang/I18N_ru.properties | 1 + .../resources/assets/lang/I18N_zh.properties | 1 + .../assets/lang/I18N_zh_CN.properties | 1 + 8 files changed, 53 insertions(+), 1 deletion(-) 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 90df9e610..cbec9307b 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 @@ -44,6 +44,8 @@ import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Optional; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.util.Lang.thread; @@ -142,6 +144,42 @@ public final class SettingsPage extends SettingsView { }); } + @Override + protected void onExportAllLogs() { + thread(() -> { + Path logDir = LOG.getLogFile().getParent(); + Path zipFile = Paths.get("hmcl-all-logs-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss")) + ".zip"); + + LOG.info("Exporting all logs to " + zipFile); + try { + try (OutputStream os = Files.newOutputStream(zipFile); + ZipOutputStream zos = new ZipOutputStream(os)) { + + Files.walk(logDir) + .filter(path -> !Files.isDirectory(path)) + .forEach(path -> { + try { + String zipEntryName = logDir.relativize(path).toString(); + zos.putNextEntry(new ZipEntry(zipEntryName)); + Files.copy(path, zos); + zos.closeEntry(); + } catch (IOException e) { + LOG.warning("Failed to add file to zip: " + path, e); + } + }); + } + + Platform.runLater(() -> { + Controllers.dialog(i18n("settings.launcher.launcher_log.export.success", zipFile)); + FXUtils.showFileInExplorer(zipFile); + }); + } catch (IOException e) { + Platform.runLater(() -> Controllers.dialog(i18n("settings.launcher.launcher_log.export.failed") + "\n" + StringUtils.getStackTrace(e), null, MessageType.ERROR)); + LOG.warning("Failed to export all logs", e); + } + }); + } + @Override protected void onSponsor() { FXUtils.openLink("https://github.com/HMCL-dev/HMCL"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java index 0dece1e9a..8428a285d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java @@ -202,9 +202,15 @@ public abstract class SettingsView extends StackPane { logButton.setOnAction(e -> onExportLogs()); logButton.getStyleClass().add("jfx-button-border"); + JFXButton exportAllLogsButton = new JFXButton(i18n("settings.launcher.launcher_log.export_all")); + exportAllLogsButton.setOnAction(e -> onExportAllLogs()); + exportAllLogsButton.getStyleClass().add("jfx-button-border"); + if (LOG.getLogFile() == null) + exportAllLogsButton.setDisable(true); + HBox buttonBox = new HBox(); buttonBox.setSpacing(10); - buttonBox.getChildren().addAll(openLogFolderButton, logButton); + buttonBox.getChildren().addAll(openLogFolderButton, logButton, exportAllLogsButton); BorderPane.setAlignment(buttonBox, Pos.CENTER_RIGHT); debugPane.setRight(buttonBox); @@ -228,4 +234,6 @@ public abstract class SettingsView extends StackPane { protected abstract void onSponsor(); protected abstract void clearCacheDirectory(); + + protected abstract void onExportAllLogs(); } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index f165673d1..5d4432f21 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1330,6 +1330,7 @@ settings.launcher.font=Font settings.launcher.general=General settings.launcher.language=Language (Applies After Restart) settings.launcher.launcher_log.export=Export Launcher Logs +settings.launcher.launcher_log.export_all=Export All Launcher Logs settings.launcher.launcher_log.export.failed=Failed to export logs. settings.launcher.launcher_log.export.success=Logs have been exported to "%s". settings.launcher.launcher_log.reveal=Reveal Logs in File Manager diff --git a/HMCL/src/main/resources/assets/lang/I18N_es.properties b/HMCL/src/main/resources/assets/lang/I18N_es.properties index e3bc310eb..6094b5cdb 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_es.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_es.properties @@ -1319,6 +1319,7 @@ settings.launcher.font=Fuente settings.launcher.general=General settings.launcher.language=Idioma settings.launcher.launcher_log.export=Exportar registros del launcher +settings.launcher.launcher_log.export_all=Exportar todos los registros del launcher settings.launcher.launcher_log.export.failed=No se han podido exportar los registros settings.launcher.launcher_log.export.success=Los registros se han exportado a «%s» settings.launcher.launcher_log.reveal=Abrir directorio de registro diff --git a/HMCL/src/main/resources/assets/lang/I18N_ja.properties b/HMCL/src/main/resources/assets/lang/I18N_ja.properties index 269328655..76c3a09ff 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ja.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ja.properties @@ -848,6 +848,7 @@ settings.launcher.font=フォント settings.launcher.general=全般的 settings.launcher.language=言語 settings.launcher.launcher_log.export=ランチャーログのエクスポート +settings.launcher.launcher_log.export_all=すべてのランチャーログをエクスポート settings.launcher.launcher_log.export.failed=ログのエクスポートに失敗しました settings.launcher.launcher_log.export.success=ログが %s にエクスポートされました settings.launcher.launcher_log.reveal=ファイルマネージャーでログを表示する diff --git a/HMCL/src/main/resources/assets/lang/I18N_ru.properties b/HMCL/src/main/resources/assets/lang/I18N_ru.properties index 8e9491cbb..fa2b9efca 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -1319,6 +1319,7 @@ settings.launcher.font=Шрифт settings.launcher.general=Общие settings.launcher.language=Язык (Применится после перезапуска) settings.launcher.launcher_log.export=Экспорт логов лаунчера +settings.launcher.launcher_log.export_all=Экспортировать все логи лаунчера settings.launcher.launcher_log.export.failed=Не удалось экспортировать логи settings.launcher.launcher_log.export.success=Логи экспортированы в %s settings.launcher.launcher_log.reveal=Открыть папку журнала diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 7e7a0e6d8..0d879385b 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1123,6 +1123,7 @@ settings.launcher.font=字體 settings.launcher.general=一般 settings.launcher.language=語言 (重啟後生效) settings.launcher.launcher_log.export=匯出啟動器日誌 +settings.launcher.launcher_log.export_all=匯出所有啟動器日誌 settings.launcher.launcher_log.export.failed=無法匯出日誌。 settings.launcher.launcher_log.export.success=日誌已儲存到「%s」。 settings.launcher.launcher_log.reveal=開啟日誌目錄 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 88ab02149..c8b6ff720 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1133,6 +1133,7 @@ settings.launcher.font=字体 settings.launcher.general=通用 settings.launcher.language=语言 (重启后生效) settings.launcher.launcher_log.export=导出启动器日志 +settings.launcher.launcher_log.export_all=导出所有启动器日志 settings.launcher.launcher_log.export.failed=无法导出日志 settings.launcher.launcher_log.export.success=日志已保存到“%s” settings.launcher.launcher_log.reveal=打开日志文件夹 From 77a5dea74561abe894309c032473c4c84341d245 Mon Sep 17 00:00:00 2001 From: Zkitefly <64117916+zkitefly@users.noreply.github.com> Date: Tue, 1 Jul 2025 01:50:42 +0800 Subject: [PATCH 2/2] update --- .../jackhuang/hmcl/ui/main/SettingsPage.java | 66 ++++++++----------- .../jackhuang/hmcl/ui/main/SettingsView.java | 18 ++--- .../resources/assets/lang/I18N.properties | 2 +- .../resources/assets/lang/I18N_es.properties | 2 +- .../resources/assets/lang/I18N_ja.properties | 2 +- .../resources/assets/lang/I18N_ru.properties | 2 +- .../resources/assets/lang/I18N_zh.properties | 2 +- .../assets/lang/I18N_zh_CN.properties | 2 +- 8 files changed, 41 insertions(+), 55 deletions(-) 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 cbec9307b..484b18355 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 @@ -43,7 +43,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.AbstractMap; +import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -124,49 +128,37 @@ public final class SettingsPage extends SettingsView { } @Override - protected void onExportLogs() { - // We cannot determine which file is JUL using. - // So we write all the logs to a new file. - thread(() -> { - 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 (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.warning("Failed to export logs", e); - return; - } - - Platform.runLater(() -> Controllers.dialog(i18n("settings.launcher.launcher_log.export.success", logFile))); - FXUtils.showFileInExplorer(logFile); - }); - } - - @Override - protected void onExportAllLogs() { + protected void onExportRecentLogs() { thread(() -> { Path logDir = LOG.getLogFile().getParent(); - Path zipFile = Paths.get("hmcl-all-logs-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss")) + ".zip"); + Path zipFile = Paths.get("hmcl-exported-logs-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss")) + ".zip"); - LOG.info("Exporting all logs to " + zipFile); + LOG.info("Exporting recent logs to " + zipFile); try { + // Get 5 most recent files + List recentFiles = Files.walk(logDir) + .filter(path -> !Files.isDirectory(path)) + .map(path -> { + try { + return new AbstractMap.SimpleEntry<>(path, Files.getLastModifiedTime(path).toMillis()); + } catch (IOException e) { + return new AbstractMap.SimpleEntry<>(path, 0L); + } + }) + .sorted((a, b) -> Long.compare(b.getValue(), a.getValue())) // Sort by newest first + .limit(5) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + try (OutputStream os = Files.newOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(os)) { - Files.walk(logDir) - .filter(path -> !Files.isDirectory(path)) - .forEach(path -> { - try { - String zipEntryName = logDir.relativize(path).toString(); - zos.putNextEntry(new ZipEntry(zipEntryName)); - Files.copy(path, zos); - zos.closeEntry(); - } catch (IOException e) { - LOG.warning("Failed to add file to zip: " + path, e); - } - }); + for (Path path : recentFiles) { + String zipEntryName = logDir.relativize(path).toString(); + zos.putNextEntry(new ZipEntry(zipEntryName)); + Files.copy(path, zos); + zos.closeEntry(); + } } Platform.runLater(() -> { @@ -175,7 +167,7 @@ public final class SettingsPage extends SettingsView { }); } catch (IOException e) { Platform.runLater(() -> Controllers.dialog(i18n("settings.launcher.launcher_log.export.failed") + "\n" + StringUtils.getStackTrace(e), null, MessageType.ERROR)); - LOG.warning("Failed to export all logs", e); + LOG.warning("Failed to export recent logs", e); } }); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java index 8428a285d..566f7bcaf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsView.java @@ -198,19 +198,15 @@ public abstract class SettingsView extends StackPane { if (LOG.getLogFile() == null) openLogFolderButton.setDisable(true); - JFXButton logButton = new JFXButton(i18n("settings.launcher.launcher_log.export")); - logButton.setOnAction(e -> onExportLogs()); - logButton.getStyleClass().add("jfx-button-border"); - - JFXButton exportAllLogsButton = new JFXButton(i18n("settings.launcher.launcher_log.export_all")); - exportAllLogsButton.setOnAction(e -> onExportAllLogs()); - exportAllLogsButton.getStyleClass().add("jfx-button-border"); + JFXButton exportRecentLogsButton = new JFXButton(i18n("settings.launcher.launcher_log.export_recent")); + exportRecentLogsButton.setOnAction(e -> onExportRecentLogs()); + exportRecentLogsButton.getStyleClass().add("jfx-button-border"); if (LOG.getLogFile() == null) - exportAllLogsButton.setDisable(true); + exportRecentLogsButton.setDisable(true); HBox buttonBox = new HBox(); buttonBox.setSpacing(10); - buttonBox.getChildren().addAll(openLogFolderButton, logButton, exportAllLogsButton); + buttonBox.getChildren().addAll(openLogFolderButton, exportRecentLogsButton); BorderPane.setAlignment(buttonBox, Pos.CENTER_RIGHT); debugPane.setRight(buttonBox); @@ -229,11 +225,9 @@ public abstract class SettingsView extends StackPane { protected abstract void onUpdate(); - protected abstract void onExportLogs(); - protected abstract void onSponsor(); protected abstract void clearCacheDirectory(); - protected abstract void onExportAllLogs(); + protected abstract void onExportRecentLogs(); } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 5d4432f21..b57ec8d7e 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1330,7 +1330,7 @@ settings.launcher.font=Font settings.launcher.general=General settings.launcher.language=Language (Applies After Restart) settings.launcher.launcher_log.export=Export Launcher Logs -settings.launcher.launcher_log.export_all=Export All Launcher Logs +settings.launcher.launcher_log.export_recent=Export Recent Launcher Logs settings.launcher.launcher_log.export.failed=Failed to export logs. settings.launcher.launcher_log.export.success=Logs have been exported to "%s". settings.launcher.launcher_log.reveal=Reveal Logs in File Manager diff --git a/HMCL/src/main/resources/assets/lang/I18N_es.properties b/HMCL/src/main/resources/assets/lang/I18N_es.properties index 6094b5cdb..6440878b7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_es.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_es.properties @@ -1319,7 +1319,7 @@ settings.launcher.font=Fuente settings.launcher.general=General settings.launcher.language=Idioma settings.launcher.launcher_log.export=Exportar registros del launcher -settings.launcher.launcher_log.export_all=Exportar todos los registros del launcher +settings.launcher.launcher_log.export_recent=Exportar registros recientes del launcher settings.launcher.launcher_log.export.failed=No se han podido exportar los registros settings.launcher.launcher_log.export.success=Los registros se han exportado a «%s» settings.launcher.launcher_log.reveal=Abrir directorio de registro diff --git a/HMCL/src/main/resources/assets/lang/I18N_ja.properties b/HMCL/src/main/resources/assets/lang/I18N_ja.properties index 76c3a09ff..6c56f8b9b 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ja.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ja.properties @@ -848,7 +848,7 @@ settings.launcher.font=フォント settings.launcher.general=全般的 settings.launcher.language=言語 settings.launcher.launcher_log.export=ランチャーログのエクスポート -settings.launcher.launcher_log.export_all=すべてのランチャーログをエクスポート +settings.launcher.launcher_log.export_recent=最近のランチャーログをエクスポート settings.launcher.launcher_log.export.failed=ログのエクスポートに失敗しました settings.launcher.launcher_log.export.success=ログが %s にエクスポートされました settings.launcher.launcher_log.reveal=ファイルマネージャーでログを表示する diff --git a/HMCL/src/main/resources/assets/lang/I18N_ru.properties b/HMCL/src/main/resources/assets/lang/I18N_ru.properties index fa2b9efca..376392001 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -1319,7 +1319,7 @@ settings.launcher.font=Шрифт settings.launcher.general=Общие settings.launcher.language=Язык (Применится после перезапуска) settings.launcher.launcher_log.export=Экспорт логов лаунчера -settings.launcher.launcher_log.export_all=Экспортировать все логи лаунчера +settings.launcher.launcher_log.export_recent=Экспортировать недавние логи лаунчера settings.launcher.launcher_log.export.failed=Не удалось экспортировать логи settings.launcher.launcher_log.export.success=Логи экспортированы в %s settings.launcher.launcher_log.reveal=Открыть папку журнала diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 0d879385b..fedd3c64d 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1123,7 +1123,7 @@ settings.launcher.font=字體 settings.launcher.general=一般 settings.launcher.language=語言 (重啟後生效) settings.launcher.launcher_log.export=匯出啟動器日誌 -settings.launcher.launcher_log.export_all=匯出所有啟動器日誌 +settings.launcher.launcher_log.export_recent=匯出最近的啟動器日誌 settings.launcher.launcher_log.export.failed=無法匯出日誌。 settings.launcher.launcher_log.export.success=日誌已儲存到「%s」。 settings.launcher.launcher_log.reveal=開啟日誌目錄 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index c8b6ff720..fc8a9f1b7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1133,7 +1133,7 @@ settings.launcher.font=字体 settings.launcher.general=通用 settings.launcher.language=语言 (重启后生效) settings.launcher.launcher_log.export=导出启动器日志 -settings.launcher.launcher_log.export_all=导出所有启动器日志 +settings.launcher.launcher_log.export_recent=导出最近的启动器日志 settings.launcher.launcher_log.export.failed=无法导出日志 settings.launcher.launcher_log.export.success=日志已保存到“%s” settings.launcher.launcher_log.reveal=打开日志文件夹