mirror of
https://github.com/BlueMap-Minecraft/BlueMap.git
synced 2025-02-03 06:01:28 +01:00
Add debug-log, improve logging in general and fix weblogger not closing correctly
This commit is contained in:
parent
63ece941ad
commit
1b2dc45b4b
@ -133,6 +133,8 @@ private synchronized CoreConfig loadCoreConfig(Path defaultDataFolder) throws Co
|
|||||||
.setVariable("data", formatPath(defaultDataFolder))
|
.setVariable("data", formatPath(defaultDataFolder))
|
||||||
.setVariable("implementation", "bukkit")
|
.setVariable("implementation", "bukkit")
|
||||||
.setVariable("render-thread-count", Integer.toString(presetRenderThreadCount))
|
.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(),
|
.build(),
|
||||||
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING
|
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING
|
||||||
);
|
);
|
||||||
|
@ -44,6 +44,8 @@ public class CoreConfig {
|
|||||||
|
|
||||||
private boolean scanForModResources = true;
|
private boolean scanForModResources = true;
|
||||||
|
|
||||||
|
private LogConfig log = new LogConfig();
|
||||||
|
|
||||||
public boolean isAcceptDownload() {
|
public boolean isAcceptDownload() {
|
||||||
return acceptDownload;
|
return acceptDownload;
|
||||||
}
|
}
|
||||||
@ -69,4 +71,25 @@ public boolean isScanForModResources() {
|
|||||||
return scanForModResources;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ public LogConfig getLog() {
|
|||||||
public static class LogConfig {
|
public static class LogConfig {
|
||||||
|
|
||||||
private String file = null;
|
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";
|
private String format = "%1$s \"%3$s %4$s %5$s\" %6$s %7$s";
|
||||||
|
|
||||||
public String getFile() {
|
public String getFile() {
|
||||||
|
@ -73,6 +73,8 @@ public class Plugin implements ServerEventListener {
|
|||||||
public static final String PLUGIN_ID = "bluemap";
|
public static final String PLUGIN_ID = "bluemap";
|
||||||
public static final String PLUGIN_NAME = "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 InterruptableReentrantLock loadingLock = new InterruptableReentrantLock();
|
||||||
|
|
||||||
private final String implementationType;
|
private final String implementationType;
|
||||||
@ -87,6 +89,7 @@ public class Plugin implements ServerEventListener {
|
|||||||
|
|
||||||
private RenderManager renderManager;
|
private RenderManager renderManager;
|
||||||
private HttpServer webServer;
|
private HttpServer webServer;
|
||||||
|
private Logger webLogger;
|
||||||
|
|
||||||
private BlueMapAPIImpl api;
|
private BlueMapAPIImpl api;
|
||||||
|
|
||||||
@ -124,6 +127,17 @@ private void load(@Nullable ResourcePack preloadedResourcePack) throws IOExcepti
|
|||||||
WebappConfig webappConfig = getConfigs().getWebappConfig();
|
WebappConfig webappConfig = getConfigs().getWebappConfig();
|
||||||
PluginConfig pluginConfig = getConfigs().getPluginConfig();
|
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
|
//load plugin state
|
||||||
try {
|
try {
|
||||||
GsonConfigurationLoader loader = GsonConfigurationLoader.builder()
|
GsonConfigurationLoader loader = GsonConfigurationLoader.builder()
|
||||||
@ -197,12 +211,13 @@ private void load(@Nullable ResourcePack preloadedResourcePack) throws IOExcepti
|
|||||||
webserverConfig.getLog().isAppend()
|
webserverConfig.getLog().isAppend()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
webLogger = Logger.combine(webLoggerList);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
webServer = new HttpServer(new LoggingRequestHandler(
|
webServer = new HttpServer(new LoggingRequestHandler(
|
||||||
routingRequestHandler,
|
routingRequestHandler,
|
||||||
webserverConfig.getLog().getFormat(),
|
webserverConfig.getLog().getFormat(),
|
||||||
Logger.combine(webLoggerList)
|
webLogger
|
||||||
));
|
));
|
||||||
webServer.bind(new InetSocketAddress(
|
webServer.bind(new InetSocketAddress(
|
||||||
webserverConfig.resolveIp(),
|
webserverConfig.resolveIp(),
|
||||||
@ -409,6 +424,15 @@ public void unload(boolean keepWebserver) {
|
|||||||
webServer = null;
|
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
|
//close bluemap
|
||||||
if (blueMap != null) {
|
if (blueMap != null) {
|
||||||
try {
|
try {
|
||||||
@ -419,6 +443,9 @@ public void unload(boolean keepWebserver) {
|
|||||||
}
|
}
|
||||||
blueMap = null;
|
blueMap = null;
|
||||||
|
|
||||||
|
// remove file-logger
|
||||||
|
Logger.global.remove(DEBUG_FILE_LOG_NAME);
|
||||||
|
|
||||||
//clear resources
|
//clear resources
|
||||||
worlds = null;
|
worlds = null;
|
||||||
maps = null;
|
maps = null;
|
||||||
|
@ -32,4 +32,17 @@ ${metrics<<
|
|||||||
# An example report looks like this: {"implementation":"${implementation}","version":"${version}"}
|
# An example report looks like this: {"implementation":"${implementation}","version":"${version}"}
|
||||||
# Default is true
|
# Default is true
|
||||||
metrics: 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
|
||||||
|
}
|
||||||
|
@ -21,14 +21,14 @@ port: 8100
|
|||||||
log: {
|
log: {
|
||||||
# The file where all the webserver-activity will be logged to.
|
# The file where all the webserver-activity will be logged to.
|
||||||
# Comment out to disable the logging completely.
|
# 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
|
# Default is no logging
|
||||||
file: "${logfile}"
|
file: "${logfile}"
|
||||||
#file: "${logfile-with-time}"
|
#file: "${logfile-with-time}"
|
||||||
|
|
||||||
# Whether the logger should append to an existing file, or overwrite it
|
# Whether the logger should append to an existing file, or overwrite it
|
||||||
# Default is true
|
# Default is false
|
||||||
append: true
|
append: false
|
||||||
|
|
||||||
# The format of the webserver-acivity logs.
|
# 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
|
# The syntax is the java String formatting, see: https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package de.bluecolored.bluemap.core.logger;
|
package de.bluecolored.bluemap.core.logger;
|
||||||
|
|
||||||
|
import java.util.logging.Handler;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
@ -65,4 +66,10 @@ public void noFloodDebug(String key, String message) {
|
|||||||
if (out.isLoggable(Level.FINE)) super.noFloodDebug(key, message);
|
if (out.isLoggable(Level.FINE)) super.noFloodDebug(key, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
for (Handler handler : out.getHandlers())
|
||||||
|
handler.close();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,11 +30,20 @@
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.logging.FileHandler;
|
import java.util.logging.FileHandler;
|
||||||
|
import java.util.logging.Level;
|
||||||
import java.util.stream.StreamSupport;
|
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) {
|
public void logError(Throwable throwable) {
|
||||||
logError(throwable.getMessage(), throwable);
|
logError(throwable.getMessage(), throwable);
|
||||||
@ -103,6 +112,9 @@ public void noFloodDebug(String message){
|
|||||||
noFloodDebug(message, message);
|
noFloodDebug(message, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {}
|
||||||
|
|
||||||
public abstract void clearNoFloodLog();
|
public abstract void clearNoFloodLog();
|
||||||
|
|
||||||
public abstract void removeNoFloodKey(String key);
|
public abstract void removeNoFloodKey(String key);
|
||||||
@ -111,10 +123,13 @@ public void removeNoFloodMessage(String message){
|
|||||||
removeNoFloodKey(message);
|
removeNoFloodKey(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Logger stdOut(){
|
public static Logger stdOut() {
|
||||||
return new PrintStreamLogger(System.out, System.err);
|
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 {
|
public static Logger file(Path path) throws IOException {
|
||||||
return file(path, null);
|
return file(path, null);
|
||||||
@ -135,6 +150,7 @@ public static Logger file(Path path, @Nullable String format, boolean append) th
|
|||||||
fileHandler.setFormatter(format == null ? new LogFormatter() : new LogFormatter(format));
|
fileHandler.setFormatter(format == null ? new LogFormatter() : new LogFormatter(format));
|
||||||
|
|
||||||
java.util.logging.Logger javaLogger = java.util.logging.Logger.getAnonymousLogger();
|
java.util.logging.Logger javaLogger = java.util.logging.Logger.getAnonymousLogger();
|
||||||
|
javaLogger.setLevel(Level.ALL);
|
||||||
javaLogger.setUseParentHandlers(false);
|
javaLogger.setUseParentHandlers(false);
|
||||||
javaLogger.addHandler(fileHandler);
|
javaLogger.addHandler(fileHandler);
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -24,37 +24,124 @@
|
|||||||
*/
|
*/
|
||||||
package de.bluecolored.bluemap.core.logger;
|
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 {
|
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) {
|
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
|
@Override
|
||||||
public void logError(String message, Throwable throwable) {
|
public void logError(String message, Throwable throwable) {
|
||||||
for (int i = 0; i < logger.length; i++)
|
lock.readLock().lock();
|
||||||
logger[i].logError(message, throwable);
|
try {
|
||||||
|
for (Logger l : logger.values())
|
||||||
|
l.logError(message, throwable);
|
||||||
|
} finally {
|
||||||
|
lock.readLock().unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logWarning(String message) {
|
public void logWarning(String message) {
|
||||||
for (int i = 0; i < logger.length; i++)
|
lock.readLock().lock();
|
||||||
logger[i].logWarning(message);
|
try {
|
||||||
|
for (Logger l : logger.values())
|
||||||
|
l.logWarning(message);
|
||||||
|
} finally {
|
||||||
|
lock.readLock().unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logInfo(String message) {
|
public void logInfo(String message) {
|
||||||
for (int i = 0; i < logger.length; i++)
|
lock.readLock().lock();
|
||||||
logger[i].logInfo(message);
|
try {
|
||||||
|
for (Logger l : logger.values())
|
||||||
|
l.logInfo(message);
|
||||||
|
} finally {
|
||||||
|
lock.readLock().unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logDebug(String message) {
|
public void logDebug(String message) {
|
||||||
for (int i = 0; i < logger.length; i++)
|
lock.readLock().lock();
|
||||||
logger[i].logDebug(message);
|
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,17 +25,20 @@
|
|||||||
package de.bluecolored.bluemap.core.logger;
|
package de.bluecolored.bluemap.core.logger;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.ZonedDateTime;
|
||||||
|
|
||||||
public class PrintStreamLogger extends AbstractLogger {
|
public class PrintStreamLogger extends AbstractLogger {
|
||||||
|
|
||||||
private PrintStream out, err;
|
private final PrintStream out, err;
|
||||||
|
|
||||||
boolean isDebug;
|
boolean isDebug;
|
||||||
|
|
||||||
public PrintStreamLogger(PrintStream out, PrintStream err) {
|
public PrintStreamLogger(PrintStream out, PrintStream err) {
|
||||||
this.out = out;
|
this.out = out;
|
||||||
this.err = err;
|
this.err = err;
|
||||||
this.isDebug = true;
|
this.isDebug = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PrintStreamLogger(PrintStream out, PrintStream err, boolean debug) {
|
public PrintStreamLogger(PrintStream out, PrintStream err, boolean debug) {
|
||||||
@ -54,23 +57,23 @@ public void setDebug(boolean debug) {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logError(String message, Throwable throwable) {
|
public void logError(String message, Throwable throwable) {
|
||||||
err.println("[ERROR] " + message);
|
log(err, "ERROR", message);
|
||||||
throwable.printStackTrace(err);
|
throwable.printStackTrace(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logWarning(String message) {
|
public void logWarning(String message) {
|
||||||
out.println("[WARNING] " + message);
|
log(out, "WARNING", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logInfo(String message) {
|
public void logInfo(String message) {
|
||||||
out.println("[INFO] " + message);
|
log(out, "INFO", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logDebug(String message) {
|
public void logDebug(String message) {
|
||||||
if (isDebug) out.println("[DEBUG] " + message);
|
if (isDebug) log(out, "DEBUG", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -83,4 +86,9 @@ public void noFloodDebug(String message) {
|
|||||||
if (isDebug) super.noFloodDebug(message);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
import de.bluecolored.bluemap.common.MissingResourcesException;
|
import de.bluecolored.bluemap.common.MissingResourcesException;
|
||||||
import de.bluecolored.bluemap.common.config.BlueMapConfigs;
|
import de.bluecolored.bluemap.common.config.BlueMapConfigs;
|
||||||
import de.bluecolored.bluemap.common.config.ConfigurationException;
|
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.config.WebserverConfig;
|
||||||
import de.bluecolored.bluemap.common.plugin.RegionFileWatchService;
|
import de.bluecolored.bluemap.common.plugin.RegionFileWatchService;
|
||||||
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
|
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
|
||||||
@ -44,7 +45,6 @@
|
|||||||
import de.bluecolored.bluemap.core.BlueMap;
|
import de.bluecolored.bluemap.core.BlueMap;
|
||||||
import de.bluecolored.bluemap.core.MinecraftVersion;
|
import de.bluecolored.bluemap.core.MinecraftVersion;
|
||||||
import de.bluecolored.bluemap.core.logger.Logger;
|
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.map.BmMap;
|
||||||
import de.bluecolored.bluemap.core.metrics.Metrics;
|
import de.bluecolored.bluemap.core.metrics.Metrics;
|
||||||
import de.bluecolored.bluemap.core.storage.Storage;
|
import de.bluecolored.bluemap.core.storage.Storage;
|
||||||
@ -207,7 +207,7 @@ public void startWebserver(BlueMapService blueMap, boolean verbose) throws IOExc
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<Logger> webLoggerList = new ArrayList<>();
|
List<Logger> webLoggerList = new ArrayList<>();
|
||||||
if (verbose) webLoggerList.add(Logger.global);
|
if (verbose) webLoggerList.add(Logger.stdOut(true));
|
||||||
if (config.getLog().getFile() != null) {
|
if (config.getLog().getFile() != null) {
|
||||||
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
|
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
|
||||||
webLoggerList.add(Logger.file(
|
webLoggerList.add(Logger.file(
|
||||||
@ -294,9 +294,13 @@ public static void main(String[] args) {
|
|||||||
try {
|
try {
|
||||||
CommandLine cmd = parser.parse(BlueMapCLI.createOptions(), args, false);
|
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")) {
|
if (cmd.hasOption("l")) {
|
||||||
Logger.global = LoggerLogger.getInstance();
|
Logger.global.put(Logger.file(Path.of(cmd.getOptionValue("l")), cmd.hasOption("a")));
|
||||||
((LoggerLogger) Logger.global).addFileHandler(cmd.getOptionValue("l"), cmd.hasOption("a"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//help
|
//help
|
||||||
@ -331,6 +335,17 @@ public static void main(String[] args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BlueMapConfigs configs = new BlueMapConfigs(cli, Path.of("data"), Path.of("web"), false);
|
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);
|
blueMap = new BlueMapService(cli, configs);
|
||||||
boolean noActions = true;
|
boolean noActions = true;
|
||||||
|
|
||||||
|
@ -66,7 +66,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
|
|||||||
private final List<FabricPlayer> onlinePlayerList;
|
private final List<FabricPlayer> onlinePlayerList;
|
||||||
|
|
||||||
public FabricMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -68,7 +68,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
|
|||||||
private final List<FabricPlayer> onlinePlayerList;
|
private final List<FabricPlayer> onlinePlayerList;
|
||||||
|
|
||||||
public FabricMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -68,7 +68,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
|
|||||||
private final List<FabricPlayer> onlinePlayerList;
|
private final List<FabricPlayer> onlinePlayerList;
|
||||||
|
|
||||||
public FabricMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -68,7 +68,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
|
|||||||
private final List<FabricPlayer> onlinePlayerList;
|
private final List<FabricPlayer> onlinePlayerList;
|
||||||
|
|
||||||
public FabricMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -69,7 +69,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
|
|||||||
private final List<FabricPlayer> onlinePlayerList;
|
private final List<FabricPlayer> onlinePlayerList;
|
||||||
|
|
||||||
public FabricMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -69,7 +69,8 @@ public class FabricMod implements ModInitializer, ServerInterface {
|
|||||||
private final List<FabricPlayer> onlinePlayerList;
|
private final List<FabricPlayer> onlinePlayerList;
|
||||||
|
|
||||||
public FabricMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -73,7 +73,8 @@ public class BukkitPlugin extends JavaPlugin implements ServerInterface, Listene
|
|||||||
private final LoadingCache<World, ServerWorld> worlds;
|
private final LoadingCache<World, ServerWorld> worlds;
|
||||||
|
|
||||||
public BukkitPlugin() {
|
public BukkitPlugin() {
|
||||||
Logger.global = new JavaLogger(getLogger());
|
Logger.global.clear();
|
||||||
|
Logger.global.put(new JavaLogger(getLogger()));
|
||||||
|
|
||||||
//try to get best matching minecraft-version
|
//try to get best matching minecraft-version
|
||||||
MinecraftVersion version = MinecraftVersion.LATEST_SUPPORTED;
|
MinecraftVersion version = MinecraftVersion.LATEST_SUPPORTED;
|
||||||
|
@ -77,7 +77,8 @@ public class ForgeMod implements ServerInterface {
|
|||||||
private final List<ForgePlayer> onlinePlayerList;
|
private final List<ForgePlayer> onlinePlayerList;
|
||||||
|
|
||||||
public ForgeMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -76,7 +76,8 @@ public class ForgeMod implements ServerInterface {
|
|||||||
private final List<ForgePlayer> onlinePlayerList;
|
private final List<ForgePlayer> onlinePlayerList;
|
||||||
|
|
||||||
public ForgeMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -76,7 +76,8 @@ public class ForgeMod implements ServerInterface {
|
|||||||
private final List<ForgePlayer> onlinePlayerList;
|
private final List<ForgePlayer> onlinePlayerList;
|
||||||
|
|
||||||
public ForgeMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -77,7 +77,8 @@ public class ForgeMod implements ServerInterface {
|
|||||||
private final List<ForgePlayer> onlinePlayerList;
|
private final List<ForgePlayer> onlinePlayerList;
|
||||||
|
|
||||||
public ForgeMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -77,7 +77,8 @@ public class ForgeMod implements ServerInterface {
|
|||||||
private final List<ForgePlayer> onlinePlayerList;
|
private final List<ForgePlayer> onlinePlayerList;
|
||||||
|
|
||||||
public ForgeMod() {
|
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.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
@ -71,7 +71,8 @@ public class BukkitPlugin extends JavaPlugin implements ServerInterface, Listene
|
|||||||
private final LoadingCache<World, ServerWorld> worlds;
|
private final LoadingCache<World, ServerWorld> worlds;
|
||||||
|
|
||||||
public BukkitPlugin() {
|
public BukkitPlugin() {
|
||||||
Logger.global = new JavaLogger(getLogger());
|
Logger.global.clear();
|
||||||
|
Logger.global.put(new JavaLogger(getLogger()));
|
||||||
|
|
||||||
//try to get best matching minecraft-version
|
//try to get best matching minecraft-version
|
||||||
MinecraftVersion version = MinecraftVersion.LATEST_SUPPORTED;
|
MinecraftVersion version = MinecraftVersion.LATEST_SUPPORTED;
|
||||||
|
@ -91,7 +91,9 @@ public class SpongePlugin implements ServerInterface {
|
|||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SpongePlugin(org.apache.logging.log4j.Logger logger, PluginContainer pluginContainer/*, Metrics.Factory metricsFactory*/) {
|
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.pluginContainer = pluginContainer;
|
||||||
|
|
||||||
this.onlinePlayerMap = new ConcurrentHashMap<>();
|
this.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
|
@ -91,7 +91,9 @@ public class SpongePlugin implements ServerInterface {
|
|||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SpongePlugin(org.apache.logging.log4j.Logger logger, PluginContainer pluginContainer/*, Metrics.Factory metricsFactory*/) {
|
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.pluginContainer = pluginContainer;
|
||||||
|
|
||||||
this.onlinePlayerMap = new ConcurrentHashMap<>();
|
this.onlinePlayerMap = new ConcurrentHashMap<>();
|
||||||
|
Loading…
Reference in New Issue
Block a user