Merge 77a5dea74561abe894309c032473c4c84341d245 into 9969dc60c5278340b6b9a4d7facdde620e99d1f5

This commit is contained in:
Zkitefly 2025-08-02 23:00:10 +08:00 committed by GitHub
commit 65daaeae1c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 56 additions and 18 deletions

View File

@ -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<Path> 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);
});
}

View File

@ -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();
}

View File

@ -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

View File

@ -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

View File

@ -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=ファイルマネージャーでログを表示する

View File

@ -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=Открыть папку журнала

View File

@ -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=開啟日誌目錄

View File

@ -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=打开日志文件夹