Skip to content

Commit fadd958

Browse files
authored
优化打包日志逻辑 (#5108)
Fix #4587
1 parent 110a58b commit fadd958

2 files changed

Lines changed: 39 additions & 17 deletions

File tree

HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,19 @@
1717
*/
1818
package org.jackhuang.hmcl.game;
1919

20-
import org.jackhuang.hmcl.util.io.IOUtils;
21-
import org.jackhuang.hmcl.util.logging.Logger;
2220
import org.jackhuang.hmcl.util.StringUtils;
21+
import org.jackhuang.hmcl.util.io.IOUtils;
2322
import org.jackhuang.hmcl.util.io.Zipper;
23+
import org.jackhuang.hmcl.util.logging.Logger;
2424
import org.jackhuang.hmcl.util.platform.OperatingSystem;
2525

2626
import java.io.BufferedReader;
2727
import java.io.IOException;
2828
import java.io.UncheckedIOException;
29-
import java.lang.management.ManagementFactory;
3029
import java.nio.file.DirectoryStream;
3130
import java.nio.file.Files;
3231
import java.nio.file.Path;
33-
import java.nio.file.attribute.BasicFileAttributes;
34-
import java.nio.file.attribute.FileTime;
32+
import java.nio.file.PathMatcher;
3533
import java.util.ArrayList;
3634
import java.util.HashSet;
3735
import java.util.List;
@@ -43,7 +41,9 @@ public final class LogExporter {
4341
private LogExporter() {
4442
}
4543

46-
public static CompletableFuture<Void> exportLogs(Path zipFile, DefaultGameRepository gameRepository, String versionId, String logs, String launchScript) {
44+
public static CompletableFuture<Void> exportLogs(
45+
Path zipFile, DefaultGameRepository gameRepository, String versionId, String logs, String launchScript,
46+
PathMatcher logMatcher) {
4747
Path runDirectory = gameRepository.getRunDirectory(versionId);
4848
Path baseDirectory = gameRepository.getBaseDirectory();
4949
List<String> versions = new ArrayList<>();
@@ -65,10 +65,10 @@ public static CompletableFuture<Void> exportLogs(Path zipFile, DefaultGameReposi
6565

6666
return CompletableFuture.runAsync(() -> {
6767
try (Zipper zipper = new Zipper(zipFile)) {
68-
processLogs(runDirectory.resolve("liteconfig"), "*.log", "liteconfig", zipper);
69-
processLogs(runDirectory.resolve("logs"), "*.log", "logs", zipper);
70-
processLogs(runDirectory, "*.log", "runDirectory", zipper);
71-
processLogs(runDirectory.resolve("crash-reports"), "*.txt", "crash-reports", zipper);
68+
processLogs(runDirectory.resolve("liteconfig"), "*.log", "liteconfig", zipper, logMatcher);
69+
processLogs(runDirectory.resolve("logs"), "*.log", "logs", zipper, logMatcher);
70+
processLogs(runDirectory, "*.log", "runDirectory", zipper, logMatcher);
71+
processLogs(runDirectory.resolve("crash-reports"), "*.txt", "crash-reports", zipper, logMatcher);
7272

7373
zipper.putTextFile(LOG.getLogs(), "hmcl.log");
7474
zipper.putTextFile(logs, "minecraft.log");
@@ -86,14 +86,11 @@ public static CompletableFuture<Void> exportLogs(Path zipFile, DefaultGameReposi
8686
});
8787
}
8888

89-
private static void processLogs(Path directory, String fileExtension, String logDirectory, Zipper zipper) {
89+
private static void processLogs(Path directory, String fileExtension, String logDirectory, Zipper zipper, PathMatcher logMatcher) {
9090
try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory, fileExtension)) {
91-
long processStartTime = ManagementFactory.getRuntimeMXBean().getStartTime();
92-
9391
for (Path file : stream) {
9492
if (Files.isRegularFile(file)) {
95-
FileTime time = Files.readAttributes(file, BasicFileAttributes.class).lastModifiedTime();
96-
if (time.toMillis() >= processStartTime) {
93+
if (logMatcher == null || logMatcher.matches(file)) {
9794
try (BufferedReader reader = IOUtils.newBufferedReaderMaybeNativeEncoding(file)) {
9895
zipper.putLines(reader.lines().map(Logger::filterForbiddenToken), file.getFileName().toString());
9996
} catch (IOException e) {

HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,12 @@
5050
import org.jackhuang.hmcl.util.platform.*;
5151

5252
import java.io.IOException;
53+
import java.lang.management.ManagementFactory;
5354
import java.nio.file.Files;
5455
import java.nio.file.Path;
5556
import java.nio.file.Paths;
57+
import java.nio.file.attribute.FileTime;
58+
import java.time.Instant;
5659
import java.time.LocalDateTime;
5760
import java.time.format.DateTimeFormatter;
5861
import java.util.*;
@@ -269,8 +272,30 @@ private void exportGameCrashInfo() {
269272

270273
CompletableFuture.supplyAsync(() ->
271274
logs.stream().map(Log::getLog).collect(Collectors.joining("\n")))
272-
.thenComposeAsync(logs ->
273-
LogExporter.exportLogs(logFile, repository, launchOptions.getVersionName(), logs, new CommandBuilder().addAll(managedProcess.getCommands()).toString()))
275+
.thenComposeAsync(logs -> {
276+
long processStartTime = managedProcess.getProcess().info()
277+
.startInstant()
278+
.map(Instant::toEpochMilli).orElseGet(() -> {
279+
try {
280+
return ManagementFactory.getRuntimeMXBean().getStartTime();
281+
} catch (Throwable e) {
282+
LOG.warning("Failed to get process start time", e);
283+
return 0L;
284+
}
285+
});
286+
287+
return LogExporter.exportLogs(logFile, repository, launchOptions.getVersionName(), logs,
288+
new CommandBuilder().addAll(managedProcess.getCommands()).toString(),
289+
path -> {
290+
try {
291+
FileTime lastModifiedTime = Files.getLastModifiedTime(path);
292+
return lastModifiedTime.toMillis() >= processStartTime;
293+
} catch (Throwable e) {
294+
LOG.warning("Failed to read file attributes", e);
295+
return false;
296+
}
297+
});
298+
})
274299
.handleAsync((result, exception) -> {
275300
Alert alert;
276301

0 commit comments

Comments
 (0)