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..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,13 @@ 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; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.util.Lang.thread; @@ -122,23 +128,47 @@ 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. + protected void onExportRecentLogs() { thread(() -> { - Path logFile = Paths.get("hmcl-exported-logs-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss")) + ".log").toAbsolutePath(); + Path logDir = LOG.getLogFile().getParent(); + Path zipFile = Paths.get("hmcl-exported-logs-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss")) + ".zip"); - LOG.info("Exporting logs to " + logFile); - try (OutputStream output = Files.newOutputStream(logFile)) { - LOG.exportLogs(output); + 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)) { + + for (Path path : recentFiles) { + String zipEntryName = logDir.relativize(path).toString(); + zos.putNextEntry(new ZipEntry(zipEntryName)); + Files.copy(path, zos); + zos.closeEntry(); + } + } + + 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 logs", e); - return; + LOG.warning("Failed to export recent logs", e); } - - Platform.runLater(() -> Controllers.dialog(i18n("settings.launcher.launcher_log.export.success", logFile))); - FXUtils.showFileInExplorer(logFile); }); } 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..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,13 +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 exportRecentLogsButton = new JFXButton(i18n("settings.launcher.launcher_log.export_recent")); + exportRecentLogsButton.setOnAction(e -> onExportRecentLogs()); + exportRecentLogsButton.getStyleClass().add("jfx-button-border"); + if (LOG.getLogFile() == null) + exportRecentLogsButton.setDisable(true); HBox buttonBox = new HBox(); buttonBox.setSpacing(10); - buttonBox.getChildren().addAll(openLogFolderButton, logButton); + buttonBox.getChildren().addAll(openLogFolderButton, exportRecentLogsButton); BorderPane.setAlignment(buttonBox, Pos.CENTER_RIGHT); debugPane.setRight(buttonBox); @@ -223,9 +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 onExportRecentLogs(); } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index a237e15b8..76252324b 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1334,6 +1334,7 @@ settings.launcher.font.anti_aliasing.lcd=Sub-pixel settings.launcher.general=General settings.launcher.language=Language (Applies After Restart) settings.launcher.launcher_log.export=Export 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 7e66815c2..f4f3a1537 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_es.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_es.properties @@ -1334,6 +1334,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_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 609bef992..266462390 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_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 3b80f79d7..647ae08a0 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -1334,6 +1334,7 @@ settings.launcher.font=Шрифт settings.launcher.general=Общие settings.launcher.language=Язык (Применится после перезапуска) settings.launcher.launcher_log.export=Экспорт логов лаунчера +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 90c3b63fd..9cae79c0f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1131,6 +1131,7 @@ settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.general=一般 settings.launcher.language=語言 (重啟後生效) settings.launcher.launcher_log.export=匯出啟動器日誌 +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 de1c55bcf..9a310269f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1141,6 +1141,7 @@ settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.general=通用 settings.launcher.language=语言 (重启后生效) settings.launcher.launcher_log.export=导出启动器日志 +settings.launcher.launcher_log.export_recent=导出最近的启动器日志 settings.launcher.launcher_log.export.failed=无法导出日志 settings.launcher.launcher_log.export.success=日志已保存到“%s” settings.launcher.launcher_log.reveal=打开日志文件夹