Add debug-log, improve logging in general and fix weblogger not closing correctly

This commit is contained in:
Lukas Rieger (Blue) 2023-07-01 09:44:19 +02:00
parent 63ece941ad
commit 1b2dc45b4b
No known key found for this signature in database
GPG Key ID: 2D09EC5ED2687FF2
27 changed files with 260 additions and 141 deletions

View File

@ -133,6 +133,8 @@ public class BlueMapConfigs implements BlueMapConfigProvider {
.setVariable("data", formatPath(defaultDataFolder))
.setVariable("implementation", "bukkit")
.setVariable("render-thread-count", Integer.toString(presetRenderThreadCount))
.setVariable("logfile", formatPath(defaultDataFolder.resolve("logs").resolve("debug.log")))
.setVariable("logfile-with-time", formatPath(defaultDataFolder.resolve("logs").resolve("debug_%1$tF_%1$tT.log")))
.build(),
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING
);

View File

@ -44,6 +44,8 @@ public class CoreConfig {
private boolean scanForModResources = true;
private LogConfig log = new LogConfig();
public boolean isAcceptDownload() {
return acceptDownload;
}
@ -69,4 +71,25 @@ public class CoreConfig {
return scanForModResources;
}
public LogConfig getLog() {
return log;
}
@DebugDump
@ConfigSerializable
public static class LogConfig {
private String file = null;
private boolean append = false;
public String getFile() {
return file;
}
public boolean isAppend() {
return append;
}
}
}

View File

@ -80,7 +80,7 @@ public class WebserverConfig {
public static class LogConfig {
private String file = null;
private boolean append = true;
private boolean append = false;
private String format = "%1$s \"%3$s %4$s %5$s\" %6$s %7$s";
public String getFile() {

View File

@ -73,6 +73,8 @@ public class Plugin implements ServerEventListener {
public static final String PLUGIN_ID = "bluemap";
public static final String PLUGIN_NAME = "BlueMap";
private static final String DEBUG_FILE_LOG_NAME = "file-debug-log";
private final InterruptableReentrantLock loadingLock = new InterruptableReentrantLock();
private final String implementationType;
@ -87,6 +89,7 @@ public class Plugin implements ServerEventListener {
private RenderManager renderManager;
private HttpServer webServer;
private Logger webLogger;
private BlueMapAPIImpl api;
@ -124,6 +127,17 @@ public class Plugin implements ServerEventListener {
WebappConfig webappConfig = getConfigs().getWebappConfig();
PluginConfig pluginConfig = getConfigs().getPluginConfig();
//apply new file-logger config
if (coreConfig.getLog().getFile() != null) {
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
Logger.global.put(DEBUG_FILE_LOG_NAME, () -> Logger.file(
Path.of(String.format(coreConfig.getLog().getFile(), zdt)),
coreConfig.getLog().isAppend()
));
} else {
Logger.global.remove(DEBUG_FILE_LOG_NAME);
}
//load plugin state
try {
GsonConfigurationLoader loader = GsonConfigurationLoader.builder()
@ -197,12 +211,13 @@ public class Plugin implements ServerEventListener {
webserverConfig.getLog().isAppend()
));
}
webLogger = Logger.combine(webLoggerList);
try {
webServer = new HttpServer(new LoggingRequestHandler(
routingRequestHandler,
webserverConfig.getLog().getFormat(),
Logger.combine(webLoggerList)
webLogger
));
webServer.bind(new InetSocketAddress(
webserverConfig.resolveIp(),
@ -409,6 +424,15 @@ public class Plugin implements ServerEventListener {
webServer = null;
}
if (webLogger != null) {
try {
webLogger.close();
} catch (Exception ex) {
Logger.global.logError("Failed to close the webserver-logger!", ex);
}
webLogger = null;
}
//close bluemap
if (blueMap != null) {
try {
@ -419,6 +443,9 @@ public class Plugin implements ServerEventListener {
}
blueMap = null;
// remove file-logger
Logger.global.remove(DEBUG_FILE_LOG_NAME);
//clear resources
worlds = null;
maps = null;

View File

@ -32,4 +32,17 @@ ${metrics<<
# An example report looks like this: {"implementation":"${implementation}","version":"${version}"}
# Default is true
metrics: true
>>}
>>}
# Config-section for debug-logging
log: {
# The file where the debug-log will be written to.
# Comment out to disable debug-logging completely.
# Java String formatting syntax can be used to add time, see: https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html
# Default is no logging
file: "${logfile}"
#file: "${logfile-with-time}"
# Whether the logger should append to an existing file, or overwrite it
# Default is false
append: false
}

View File

@ -21,14 +21,14 @@ port: 8100
log: {
# The file where all the webserver-activity will be logged to.
# Comment out to disable the logging completely.
# Java String formatting syntax can be used to add time
# Java String formatting syntax can be used to add time, see: https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html
# Default is no logging
file: "${logfile}"
#file: "${logfile-with-time}"
# Whether the logger should append to an existing file, or overwrite it
# Default is true
append: true
# Default is false
append: false
# The format of the webserver-acivity logs.
# The syntax is the java String formatting, see: https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html

View File

@ -24,6 +24,7 @@
*/
package de.bluecolored.bluemap.core.logger;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -65,4 +66,10 @@ public class JavaLogger extends AbstractLogger {
if (out.isLoggable(Level.FINE)) super.noFloodDebug(key, message);
}
@Override
public void close() throws Exception {
for (Handler handler : out.getHandlers())
handler.close();
}
}

View File

@ -30,11 +30,20 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.stream.StreamSupport;
public abstract class Logger {
public abstract class Logger implements AutoCloseable {
public static Logger global = stdOut();
@SuppressWarnings("StaticInitializerReferencesSubClass")
public static final MultiLogger global = new MultiLogger(stdOut());
static {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
global.close();
} catch (Exception ignore) {}
}));
}
public void logError(Throwable throwable) {
logError(throwable.getMessage(), throwable);
@ -103,6 +112,9 @@ public abstract class Logger {
noFloodDebug(message, message);
}
@Override
public void close() throws Exception {}
public abstract void clearNoFloodLog();
public abstract void removeNoFloodKey(String key);
@ -111,10 +123,13 @@ public abstract class Logger {
removeNoFloodKey(message);
}
public static Logger stdOut(){
public static Logger stdOut() {
return new PrintStreamLogger(System.out, System.err);
}
public static Logger stdOut(boolean debug){
return new PrintStreamLogger(System.out, System.err, debug);
}
public static Logger file(Path path) throws IOException {
return file(path, null);
@ -135,6 +150,7 @@ public abstract class Logger {
fileHandler.setFormatter(format == null ? new LogFormatter() : new LogFormatter(format));
java.util.logging.Logger javaLogger = java.util.logging.Logger.getAnonymousLogger();
javaLogger.setLevel(Level.ALL);
javaLogger.setUseParentHandlers(false);
javaLogger.addHandler(fileHandler);

View File

@ -1,96 +0,0 @@
/*
* This file is part of BlueMap, licensed under the MIT License (MIT).
*
* Copyright (c) Blue (Lukas Rieger) <https://bluecolored.de>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package de.bluecolored.bluemap.core.logger;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
import java.util.logging.*;
public class LoggerLogger extends AbstractLogger {
private static LoggerLogger instance = null;
private Logger logger;
private SimpleFormatter formatter;
private LoggerLogger() {
this.logger = Logger.getLogger("bluemap");
this.logger.setUseParentHandlers(false);
ConsoleHandler cHandler = new ConsoleHandler();
formatter = new SimpleFormatter() {
@Override
public synchronized String format(LogRecord record) {
String stackTrace = record.getThrown() == null ? "" : ExceptionUtils.getStackTrace(record.getThrown());
return String.format("[%1$s] %2$s%3$s%n", record.getLevel(), record.getMessage(), stackTrace);
}
};
cHandler.setFormatter(formatter);
this.logger.addHandler(cHandler);
}
public static LoggerLogger getInstance() {
if (instance == null) {
instance = new LoggerLogger();
}
return instance;
}
public void addFileHandler(String filename, boolean append) {
try {
File file = new File(filename);
FileUtils.forceMkdirParent(file);
FileHandler fHandler = new FileHandler(filename, append);
fHandler.setFormatter(formatter);
this.logger.addHandler(fHandler);
} catch (IOException e) {
de.bluecolored.bluemap.core.logger.Logger.global.logError("Error while opening log file!", e);
}
}
@Override
public void logError(String message, Throwable throwable) {
logger.log(Level.SEVERE, message, throwable);
}
@Override
public void logWarning(String message) {
logger.log(Level.WARNING, message);
}
@Override
public void logInfo(String message) {
logger.log(Level.INFO, message);
}
@Override
public void logDebug(String message) {
logger.log(Level.FINE, message);
}
}

View File

@ -24,37 +24,124 @@
*/
package de.bluecolored.bluemap.core.logger;
@SuppressWarnings("ForLoopReplaceableByForEach")
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MultiLogger extends AbstractLogger {
private final Logger[] logger;
private static final AtomicInteger LOGGER_INDEX = new AtomicInteger(0);
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final Map<String, Logger> logger;
public MultiLogger(Logger... logger) {
this.logger = logger;
this.logger = new HashMap<>();
for (Logger l : logger)
put(l);
}
public void put(Logger logger) {
put("anonymous-logger-" + LOGGER_INDEX.getAndIncrement(), () -> logger);
}
public void put(String name, LoggerSupplier loggerSupplier) {
lock.writeLock().lock();
try {
remove(name); //remove first so logger is closed
this.logger.put(name, loggerSupplier.get());
} catch (Exception ex) {
logError("Failed to close Logger!", ex);
} finally {
lock.writeLock().unlock();
}
}
public void remove(String name) {
lock.writeLock().lock();
try {
Logger removed = this.logger.remove(name);
if (removed != null) removed.close();
} catch (Exception ex) {
logError("Failed to close Logger!", ex);
} finally {
lock.writeLock().unlock();
}
}
public void clear() {
lock.writeLock().lock();
try {
String[] loggerNames = this.logger.keySet().toArray(String[]::new);
for (String name : loggerNames)
remove(name);
this.logger.clear();
} finally {
lock.writeLock().unlock();
}
}
@Override
public void logError(String message, Throwable throwable) {
for (int i = 0; i < logger.length; i++)
logger[i].logError(message, throwable);
lock.readLock().lock();
try {
for (Logger l : logger.values())
l.logError(message, throwable);
} finally {
lock.readLock().unlock();
}
}
@Override
public void logWarning(String message) {
for (int i = 0; i < logger.length; i++)
logger[i].logWarning(message);
lock.readLock().lock();
try {
for (Logger l : logger.values())
l.logWarning(message);
} finally {
lock.readLock().unlock();
}
}
@Override
public void logInfo(String message) {
for (int i = 0; i < logger.length; i++)
logger[i].logInfo(message);
lock.readLock().lock();
try {
for (Logger l : logger.values())
l.logInfo(message);
} finally {
lock.readLock().unlock();
}
}
@Override
public void logDebug(String message) {
for (int i = 0; i < logger.length; i++)
logger[i].logDebug(message);
lock.readLock().lock();
try {
for (Logger l : logger.values())
l.logDebug(message);
} finally {
lock.readLock().unlock();
}
}
@Override
public void close() throws Exception {
lock.readLock().lock();
try {
for (Logger l : logger.values())
l.close();
} finally {
lock.readLock().unlock();
}
}
@FunctionalInterface
public interface LoggerSupplier {
Logger get() throws Exception;
}
}

View File

@ -25,17 +25,20 @@
package de.bluecolored.bluemap.core.logger;
import java.io.PrintStream;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class PrintStreamLogger extends AbstractLogger {
private PrintStream out, err;
private final PrintStream out, err;
boolean isDebug;
public PrintStreamLogger(PrintStream out, PrintStream err) {
this.out = out;
this.err = err;
this.isDebug = true;
this.isDebug = false;
}
public PrintStreamLogger(PrintStream out, PrintStream err, boolean debug) {
@ -54,23 +57,23 @@ public class PrintStreamLogger extends AbstractLogger {
@Override
public void logError(String message, Throwable throwable) {
err.println("[ERROR] " + message);
log(err, "ERROR", message);
throwable.printStackTrace(err);
}
@Override
public void logWarning(String message) {
out.println("[WARNING] " + message);
log(out, "WARNING", message);
}
@Override
public void logInfo(String message) {
out.println("[INFO] " + message);
log(out, "INFO", message);
}
@Override
public void logDebug(String message) {
if (isDebug) out.println("[DEBUG] " + message);
if (isDebug) log(out, "DEBUG", message);
}
@Override
@ -83,4 +86,9 @@ public class PrintStreamLogger extends AbstractLogger {
if (isDebug) super.noFloodDebug(message);
}
private void log(PrintStream stream, String level, String message) {
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
stream.printf("[%1$tT %2$s] %3$s%n", zdt, level, message);
}
}

View File

@ -29,6 +29,7 @@ import de.bluecolored.bluemap.common.BlueMapService;
import de.bluecolored.bluemap.common.MissingResourcesException;
import de.bluecolored.bluemap.common.config.BlueMapConfigs;
import de.bluecolored.bluemap.common.config.ConfigurationException;
import de.bluecolored.bluemap.common.config.CoreConfig;
import de.bluecolored.bluemap.common.config.WebserverConfig;
import de.bluecolored.bluemap.common.plugin.RegionFileWatchService;
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
@ -44,7 +45,6 @@ import de.bluecolored.bluemap.common.web.http.HttpServer;
import de.bluecolored.bluemap.core.BlueMap;
import de.bluecolored.bluemap.core.MinecraftVersion;
import de.bluecolored.bluemap.core.logger.Logger;
import de.bluecolored.bluemap.core.logger.LoggerLogger;
import de.bluecolored.bluemap.core.map.BmMap;
import de.bluecolored.bluemap.core.metrics.Metrics;
import de.bluecolored.bluemap.core.storage.Storage;
@ -207,7 +207,7 @@ public class BlueMapCLI implements ServerInterface {
}
List<Logger> webLoggerList = new ArrayList<>();
if (verbose) webLoggerList.add(Logger.global);
if (verbose) webLoggerList.add(Logger.stdOut(true));
if (config.getLog().getFile() != null) {
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
webLoggerList.add(Logger.file(
@ -294,9 +294,13 @@ public class BlueMapCLI implements ServerInterface {
try {
CommandLine cmd = parser.parse(BlueMapCLI.createOptions(), args, false);
if (cmd.hasOption("b")) {
Logger.global.clear();
Logger.global.put(Logger.stdOut(true));
}
if (cmd.hasOption("l")) {
Logger.global = LoggerLogger.getInstance();
((LoggerLogger) Logger.global).addFileHandler(cmd.getOptionValue("l"), cmd.hasOption("a"));
Logger.global.put(Logger.file(Path.of(cmd.getOptionValue("l")), cmd.hasOption("a")));
}
//help
@ -331,6 +335,17 @@ public class BlueMapCLI implements ServerInterface {
}
BlueMapConfigs configs = new BlueMapConfigs(cli, Path.of("data"), Path.of("web"), false);
//apply new file-logger config
CoreConfig coreConfig = configs.getCoreConfig();
if (coreConfig.getLog().getFile() != null) {
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
Logger.global.put(Logger.file(
Path.of(String.format(coreConfig.getLog().getFile(), zdt)),
coreConfig.getLog().isAppend()
));
}
blueMap = new BlueMapService(cli, configs);
boolean noActions = true;

View File

@ -66,7 +66,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
private final List<FabricPlayer> onlinePlayerList;
public FabricMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -68,7 +68,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
private final List<FabricPlayer> onlinePlayerList;
public FabricMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -68,7 +68,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
private final List<FabricPlayer> onlinePlayerList;
public FabricMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -68,7 +68,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
private final List<FabricPlayer> onlinePlayerList;
public FabricMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -69,7 +69,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
private final List<FabricPlayer> onlinePlayerList;
public FabricMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -69,7 +69,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
private final List<FabricPlayer> onlinePlayerList;
public FabricMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -73,7 +73,8 @@ public class BukkitPlugin extends JavaPlugin implements ServerInterface, Listene
private final LoadingCache<World, ServerWorld> worlds;
public BukkitPlugin() {
Logger.global = new JavaLogger(getLogger());
Logger.global.clear();
Logger.global.put(new JavaLogger(getLogger()));
//try to get best matching minecraft-version
MinecraftVersion version = MinecraftVersion.LATEST_SUPPORTED;

View File

@ -77,7 +77,8 @@ public class ForgeMod implements ServerInterface {
private final List<ForgePlayer> onlinePlayerList;
public ForgeMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -76,7 +76,8 @@ public class ForgeMod implements ServerInterface {
private final List<ForgePlayer> onlinePlayerList;
public ForgeMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -76,7 +76,8 @@ public class ForgeMod implements ServerInterface {
private final List<ForgePlayer> onlinePlayerList;
public ForgeMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -77,7 +77,8 @@ public class ForgeMod implements ServerInterface {
private final List<ForgePlayer> onlinePlayerList;
public ForgeMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -77,7 +77,8 @@ public class ForgeMod implements ServerInterface {
private final List<ForgePlayer> onlinePlayerList;
public ForgeMod() {
Logger.global = new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME));
Logger.global.clear();
Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME)));
this.onlinePlayerMap = new ConcurrentHashMap<>();
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());

View File

@ -71,7 +71,8 @@ public class BukkitPlugin extends JavaPlugin implements ServerInterface, Listene
private final LoadingCache<World, ServerWorld> worlds;
public BukkitPlugin() {
Logger.global = new JavaLogger(getLogger());
Logger.global.clear();
Logger.global.put(new JavaLogger(getLogger()));
//try to get best matching minecraft-version
MinecraftVersion version = MinecraftVersion.LATEST_SUPPORTED;

View File

@ -91,7 +91,9 @@ public class SpongePlugin implements ServerInterface {
@Inject
public SpongePlugin(org.apache.logging.log4j.Logger logger, PluginContainer pluginContainer/*, Metrics.Factory metricsFactory*/) {
Logger.global = new Log4J2Logger(logger);
Logger.global.clear();
Logger.global.put(new Log4J2Logger(logger));
this.pluginContainer = pluginContainer;
this.onlinePlayerMap = new ConcurrentHashMap<>();

View File

@ -91,7 +91,9 @@ public class SpongePlugin implements ServerInterface {
@Inject
public SpongePlugin(org.apache.logging.log4j.Logger logger, PluginContainer pluginContainer/*, Metrics.Factory metricsFactory*/) {
Logger.global = new Log4J2Logger(logger);
Logger.global.clear();
Logger.global.put(new Log4J2Logger(logger));
this.pluginContainer = pluginContainer;
this.onlinePlayerMap = new ConcurrentHashMap<>();