优化日志性能 (#2488)

* 优化日志性能

* update

* update

* update
This commit is contained in:
Glavo
2023-08-26 11:13:15 +08:00
committed by GitHub
parent 74118049ce
commit 413d962db0

View File

@@ -19,9 +19,7 @@ package org.jackhuang.hmcl.util;
import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.io.IOUtils;
import java.io.ByteArrayOutputStream; import java.io.*;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.text.MessageFormat; import java.text.MessageFormat;
@@ -60,10 +58,11 @@ public final class Logging {
LOG.setLevel(Level.ALL); LOG.setLevel(Level.ALL);
LOG.setUseParentHandlers(false); LOG.setUseParentHandlers(false);
LOG.setFilter(record -> { LOG.setFilter(record -> {
record.setMessage(filterForbiddenToken(record.getMessage())); record.setMessage(format(record));
return true; return true;
}); });
DefaultFormatter formatter = new DefaultFormatter();
try { try {
if (Files.isRegularFile(logFolder)) if (Files.isRegularFile(logFolder))
Files.delete(logFolder); Files.delete(logFolder);
@@ -71,7 +70,7 @@ public final class Logging {
Files.createDirectories(logFolder); Files.createDirectories(logFolder);
FileHandler fileHandler = new FileHandler(logFolder.resolve("hmcl.log").toAbsolutePath().toString()); FileHandler fileHandler = new FileHandler(logFolder.resolve("hmcl.log").toAbsolutePath().toString());
fileHandler.setLevel(Level.FINEST); fileHandler.setLevel(Level.FINEST);
fileHandler.setFormatter(DefaultFormatter.INSTANCE); fileHandler.setFormatter(formatter);
fileHandler.setEncoding("UTF-8"); fileHandler.setEncoding("UTF-8");
LOG.addHandler(fileHandler); LOG.addHandler(fileHandler);
} catch (IOException e) { } catch (IOException e) {
@@ -79,11 +78,11 @@ public final class Logging {
} }
ConsoleHandler consoleHandler = new ConsoleHandler(); ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(DefaultFormatter.INSTANCE); consoleHandler.setFormatter(formatter);
consoleHandler.setLevel(Level.FINER); consoleHandler.setLevel(Level.FINER);
LOG.addHandler(consoleHandler); LOG.addHandler(consoleHandler);
StreamHandler streamHandler = new StreamHandler(storedLogs, DefaultFormatter.INSTANCE) { StreamHandler streamHandler = new StreamHandler(storedLogs, formatter) {
@Override @Override
public synchronized void publish(LogRecord record) { public synchronized void publish(LogRecord record) {
super.publish(record); super.publish(record);
@@ -104,7 +103,7 @@ public final class Logging {
LOG.setUseParentHandlers(false); LOG.setUseParentHandlers(false);
ConsoleHandler consoleHandler = new ConsoleHandler(); ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(DefaultFormatter.INSTANCE); consoleHandler.setFormatter(new DefaultFormatter());
consoleHandler.setLevel(Level.FINER); consoleHandler.setLevel(Level.FINER);
LOG.addHandler(consoleHandler); LOG.addHandler(consoleHandler);
} }
@@ -121,23 +120,41 @@ public final class Logging {
} }
} }
private static final class DefaultFormatter extends Formatter { private static final MessageFormat FORMAT = new MessageFormat("[{0,date,HH:mm:ss}] [{1}.{2}/{3}] {4}\n");
static final DefaultFormatter INSTANCE = new DefaultFormatter(); private static String format(LogRecord record) {
private static final MessageFormat format = new MessageFormat("[{0,date,HH:mm:ss}] [{1}.{2}/{3}] {4}\n"); String message = filterForbiddenToken(record.getMessage());
@Override Throwable thrown = record.getThrown();
public String format(LogRecord record) {
String log = format.format(new Object[]{
new Date(record.getMillis()),
record.getSourceClassName(), record.getSourceMethodName(), record.getLevel().getName(),
record.getMessage()
}, new StringBuffer(128), null).toString();
if (record.getThrown() != null)
log += StringUtils.getStackTrace(record.getThrown());
return log; StringWriter writer;
StringBuffer buffer;
if (thrown == null) {
writer = null;
buffer = new StringBuffer(256);
} else {
writer = new StringWriter(1024);
buffer = writer.getBuffer();
} }
FORMAT.format(new Object[]{
new Date(record.getMillis()),
record.getSourceClassName(), record.getSourceMethodName(), record.getLevel().getName(),
message
}, buffer, null);
if (thrown != null) {
try (PrintWriter printWriter = new PrintWriter(writer)) {
thrown.printStackTrace(printWriter);
}
}
return buffer.toString();
}
private static final class DefaultFormatter extends Formatter {
@Override
public String format(LogRecord record) {
return record.getMessage();
}
} }
} }