refactored BufferedLog

* rename to EventualLogger
* adhere to slf4j API
* ensure single instance
This commit is contained in:
Armin Schrenk
2026-01-21 15:33:26 +01:00
parent c198adaf3f
commit 046372f95b
5 changed files with 138 additions and 91 deletions

View File

@@ -2,7 +2,6 @@ package org.cryptomator.launcher;
import org.apache.commons.lang3.SystemUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -37,7 +36,7 @@ import java.util.Set;
*/
class AdminPropertiesSetter {
private static final Logger LOG = LoggerFactory.getLogger(AdminPropertiesSetter.class);
private static final Logger LOG = EventualLogger.getInstance();
private static final String LINUX_DIR = "/etc/cryptomator";
private static final String MAC_DIR = "/Library/Application Support/Cryptomator";

View File

@@ -1,28 +0,0 @@
package org.cryptomator.launcher;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.List;
class BufferedLog {
private final static List<Entry> logMessages = new ArrayList<>();
private BufferedLog() {
}
record Entry(String className, String message, List<Object> messageInput) {}
synchronized static void log(String className, String message, List<Object> messageInput) {
logMessages.add(new Entry(className, message, messageInput));
}
synchronized static void flushTo(Logger log) {
logMessages.forEach(e -> {
var message = "PRE LOG INIT Event in %s: %s".formatted(e.className, e.message);
log.info(message, e.messageInput.toArray());
});
logMessages.clear();
}
}

View File

@@ -65,7 +65,7 @@ public class Cryptomator {
}
public static void main(String[] args) {
BufferedLog.flushTo(LOG);
EventualLogger.getInstance().drainTo(LOG);
var printVersion = Optional.ofNullable(args) //
.stream() //Streams either one element (the args-array) or zero elements
.flatMap(Arrays::stream) //

View File

@@ -0,0 +1,115 @@
package org.cryptomator.launcher;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.DefaultLoggingEvent;
import org.slf4j.event.Level;
import org.slf4j.event.LoggingEvent;
import org.slf4j.helpers.AbstractLogger;
import java.util.ArrayDeque;
import java.util.Queue;
class EventualLogger extends AbstractLogger {
static EventualLogger getInstance() {
return Wrapped.INSTANCE.get();
}
private final Queue<LoggingEvent> bufferedEvents = new ArrayDeque<>();
private EventualLogger() {
}
synchronized void drainTo(Logger gutter) {
for (var event : bufferedEvents) {
gutter.atLevel(event.getLevel()).log(event.getMessage(), event.getArgumentArray());
}
bufferedEvents.clear();
}
@Override
protected synchronized void handleNormalizedLoggingCall(Level level, Marker marker, String messagePattern, Object[] arguments, Throwable throwable) {
var event = new DefaultLoggingEvent(level, this);
if (marker != null) {
event.addMarker(marker);
}
event.setMessage(messagePattern);
for (var arg : arguments) {
event.addArgument(arg);
}
bufferedEvents.add(event);
}
//Unclear, unused and undocumented method of slf4j, see also https://github.com/qos-ch/slf4j/discussions/348
@Override
protected String getFullyQualifiedCallerName() {
return getClass().getCanonicalName();
}
@Override
public boolean isTraceEnabled() {
return true;
}
@Override
public boolean isTraceEnabled(Marker marker) {
return true;
}
@Override
public boolean isDebugEnabled() {
return true;
}
@Override
public boolean isDebugEnabled(Marker marker) {
return true;
}
@Override
public boolean isInfoEnabled() {
return true;
}
@Override
public boolean isInfoEnabled(Marker marker) {
return true;
}
@Override
public boolean isWarnEnabled() {
return true;
}
@Override
public boolean isWarnEnabled(Marker marker) {
return true;
}
@Override
public boolean isErrorEnabled() {
return true;
}
@Override
public boolean isErrorEnabled(Marker marker) {
return true;
}
private enum Wrapped {
INSTANCE;
EventualLogger actualInstance;
Wrapped() {
actualInstance = new EventualLogger();
}
public EventualLogger get() {
return actualInstance;
}
}
}