Fix #3400: 逐行过滤日志中的 token (#3856)

This commit is contained in:
Glavo
2025-04-27 15:41:09 +08:00
committed by GitHub
parent 8ba0e16dd9
commit e98c7dfef1
2 changed files with 26 additions and 8 deletions

View File

@@ -19,10 +19,10 @@ package org.jackhuang.hmcl.game;
import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.logging.Logger;
import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.StringUtils;
import org.jackhuang.hmcl.util.io.FileUtils;
import org.jackhuang.hmcl.util.io.Zipper; import org.jackhuang.hmcl.util.io.Zipper;
import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.platform.OperatingSystem;
import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException; import java.io.UncheckedIOException;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
@@ -93,9 +93,8 @@ public final class LogExporter {
if (Files.isRegularFile(file)) { if (Files.isRegularFile(file)) {
FileTime time = Files.readAttributes(file, BasicFileAttributes.class).lastModifiedTime(); FileTime time = Files.readAttributes(file, BasicFileAttributes.class).lastModifiedTime();
if (time.toMillis() >= processStartTime) { if (time.toMillis() >= processStartTime) {
try { try (BufferedReader reader = Files.newBufferedReader(file, OperatingSystem.NATIVE_CHARSET)) {
String crashLog = Logger.filterForbiddenToken(FileUtils.readText(file, OperatingSystem.NATIVE_CHARSET)); zipper.putLines(reader.lines().map(Logger::filterForbiddenToken), file.getFileName().toString());
zipper.putTextFile(crashLog, file.getFileName().toString());
} catch (IOException e) { } catch (IOException e) {
LOG.warning("Failed to read log file: " + file, e); LOG.warning("Failed to read log file: " + file, e);
} }

View File

@@ -19,14 +19,12 @@ package org.jackhuang.hmcl.util.io;
import org.jackhuang.hmcl.util.function.ExceptionalPredicate; import org.jackhuang.hmcl.util.function.ExceptionalPredicate;
import java.io.Closeable; import java.io.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.*; import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.stream.Stream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipException; import java.util.zip.ZipException;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -155,6 +153,27 @@ public final class Zipper implements Closeable {
zos.closeEntry(); zos.closeEntry();
} }
public void putLines(Stream<String> lines, String path) throws IOException {
zos.putNextEntry(new ZipEntry(normalize(path)));
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(zos));
lines.forEachOrdered(line -> {
try {
writer.write(line);
writer.write('\n');
} catch (IOException e) {
throw new UncheckedIOException(e);
}
});
writer.flush();
} catch (UncheckedIOException e) {
throw e.getCause();
} finally {
zos.closeEntry();
}
}
public void putTextFile(String text, String path) throws IOException { public void putTextFile(String text, String path) throws IOException {
putTextFile(text, StandardCharsets.UTF_8, path); putTextFile(text, StandardCharsets.UTF_8, path);
} }