diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java
index 75ce8c25..face0039 100644
--- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java
+++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java
@@ -31,17 +31,8 @@ public SecurityCheckCommand(LaunchServer server) {
}
public static void printCheckResult(LogHelper.Level level, String module, String comment, Boolean status) {
- LogHelper.rawLog(() -> FormatHelper.rawFormat(level, LogHelper.getDataTime(), false).concat(String.format("[%s] %s - %s", module, comment, status == null ? "WARN" : (status ? "OK" : "FAIL"))),
- () -> FormatHelper.rawAnsiFormat(level, LogHelper.getDataTime(), false)
- .fgBright(Ansi.Color.WHITE)
- .a("[")
- .fgBright(Ansi.Color.BLUE)
- .a(module)
- .fgBright(Ansi.Color.WHITE)
- .a("] ".concat(comment).concat(" - "))
- .fgBright(status == null ? Ansi.Color.YELLOW : (status ? Ansi.Color.GREEN : Ansi.Color.RED))
- .a(status == null ? "WARN" : (status ? "OK" : "FAIL"))
- .reset().toString());
+ LogHelper.log(level, String.format("[%s] %s - %s", module, comment, status == null ? "WARN" : (status ? "OK" : "FAIL")), false);
+
}
@Override
diff --git a/LaunchServer/src/main/resources/log4j2.xml b/LaunchServer/src/main/resources/log4j2.xml
index 64d5e687..36d22425 100644
--- a/LaunchServer/src/main/resources/log4j2.xml
+++ b/LaunchServer/src/main/resources/log4j2.xml
@@ -3,6 +3,10 @@
+
+
+
+
@@ -10,9 +14,15 @@
+
+
+
+
+
+
diff --git a/LauncherCore/build.gradle b/LauncherCore/build.gradle
index 37494b9c..7b5485ef 100644
--- a/LauncherCore/build.gradle
+++ b/LauncherCore/build.gradle
@@ -7,6 +7,7 @@
compileOnly group: 'org.jline', name: 'jline-reader', version: rootProject['verJline']
compileOnly group: 'org.jline', name: 'jline-terminal', version: rootProject['verJline']
compileOnly group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: rootProject['verBcprov']
+ compileOnly group: 'org.slf4j', name: 'slf4j-api', version: rootProject['verSlf4j']
api group: 'com.google.code.gson', name: 'gson', version: rootProject['verGson']
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: rootProject['verJunit']
testImplementation group: 'org.jline', name: 'jline', version: rootProject['verJline']
diff --git a/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java b/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java
index a75dca16..94770e43 100644
--- a/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java
+++ b/LauncherCore/src/main/java/pro/gravit/utils/command/basic/HelpCommand.java
@@ -9,6 +9,7 @@
import java.util.Arrays;
import java.util.Map.Entry;
+import java.util.function.Supplier;
public final class HelpCommand extends Command {
private final CommandHandler handler;
@@ -19,9 +20,9 @@ public HelpCommand(CommandHandler handler) {
public static void printCommand(String name, Command command) {
String args = command.getArgsDescription();
- //LogHelper.subInfo("%s %s - %s", name, args == null ? "[nothing]" : args, command.getUsageDescription());
- LogHelper.rawLog(() -> FormatHelper.rawFormat(LogHelper.Level.INFO, LogHelper.getDataTime(), true) + String.format("%s %s - %s", name, args == null ? "[nothing]" : args, command.getUsageDescription()), () -> {
- Ansi ansi = FormatHelper.rawAnsiFormat(LogHelper.Level.INFO, LogHelper.getDataTime(), true);
+ Supplier plaintext = () -> String.format("%s %s - %s", name, args == null ? "[nothing]" : args, command.getUsageDescription());
+ Supplier jansitext = () -> {
+ Ansi ansi = new Ansi();
ansi.fgBright(Ansi.Color.GREEN);
ansi.a(name + " ");
ansi.fgBright(Ansi.Color.CYAN);
@@ -32,7 +33,8 @@ public static void printCommand(String name, Command command) {
ansi.a(command.getUsageDescription());
ansi.reset();
return ansi.toString();
- }, () -> LogHelper.htmlFormatLog(LogHelper.Level.INFO, LogHelper.getDataTime(), String.format("%s %s - %s", name, args == null ? "[nothing]" : args, command.getUsageDescription()), true));
+ };
+ LogHelper.logJAnsi(LogHelper.Level.INFO, plaintext, jansitext, true);
}
public static void printSubCommandsHelp(String base, Command command) {
diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/FormatHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/FormatHelper.java
index f4c46571..4399dcab 100644
--- a/LauncherCore/src/main/java/pro/gravit/utils/helper/FormatHelper.java
+++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/FormatHelper.java
@@ -53,7 +53,7 @@ public static Ansi rawAnsiFormat(LogHelper.Level level, String dateTime, boolean
return ansi;
}
- static String ansiFormatVersion(String product) {
+ public static String ansiFormatVersion(String product) {
return new Ansi().bold(). // Setup
fgBright(Ansi.Color.MAGENTA).a("GravitLauncher "). // sashok724's
fgBright(Ansi.Color.BLUE).a("(fork sashok724's Launcher) ").
@@ -63,7 +63,7 @@ static String ansiFormatVersion(String product) {
reset().toString(); // To file
}
- static String ansiFormatLicense(String product) {
+ public static String ansiFormatLicense(String product) {
return new Ansi().bold(). // Setup
fgBright(Ansi.Color.MAGENTA).a("License for "). // sashok724's
fgBright(Ansi.Color.CYAN).a(product). // Product
@@ -76,11 +76,11 @@ public static String rawFormat(LogHelper.Level level, String dateTime, boolean s
return dateTime + " [" + level.name + (sub ? "] " : "] ");
}
- static String formatVersion(String product) {
+ public static String formatVersion(String product) {
return String.format("GravitLauncher (fork sashok724's Launcher) %s v%s", product, Version.getVersion().toString());
}
- static String formatLicense(String product) {
+ public static String formatLicense(String product) {
return String.format("License for %s GPLv3. SourceCode: https://github.com/GravitLauncher/Launcher", product);
}
}
diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/LogHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/LogHelper.java
index f10154b0..17697a0c 100644
--- a/LauncherCore/src/main/java/pro/gravit/utils/helper/LogHelper.java
+++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/LogHelper.java
@@ -1,8 +1,9 @@
package pro.gravit.utils.helper;
-import org.fusesource.jansi.Ansi;
-import org.fusesource.jansi.AnsiConsole;
import pro.gravit.launcher.LauncherNetworkAPI;
+import pro.gravit.utils.logging.LogHelperAppender;
+import pro.gravit.utils.logging.SimpleLogHelperImpl;
+import pro.gravit.utils.logging.Slf4jLogHelperImpl;
import java.io.*;
import java.nio.file.Path;
@@ -13,12 +14,12 @@
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import java.util.function.Supplier;
public final class LogHelper {
+ private static LogHelperAppender impl;
public static final String DEBUG_PROPERTY = "launcher.debug";
public static final String DEV_PROPERTY = "launcher.dev";
@@ -27,45 +28,21 @@ public final class LogHelper {
public static final String NO_JANSI_PROPERTY = "launcher.noJAnsi";
- public static final boolean JANSI;
+ public static final String NO_SLF4J_PROPERTY = "launcher.noSlf4j";
- // Output settings
- private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss", Locale.US);
- private static final AtomicBoolean DEBUG_ENABLED = new AtomicBoolean(Boolean.getBoolean(DEBUG_PROPERTY));
- private static final AtomicBoolean STACKTRACE_ENABLED = new AtomicBoolean(Boolean.getBoolean(STACKTRACE_PROPERTY));
- private static final AtomicBoolean DEV_ENABLED = new AtomicBoolean(Boolean.getBoolean(DEV_PROPERTY));
- private static final Set OUTPUTS = Collections.newSetFromMap(new ConcurrentHashMap<>(2));
private static final Set> EXCEPTIONS_CALLBACKS = Collections.newSetFromMap(new ConcurrentHashMap<>(2));
- private static final OutputEnity STD_OUTPUT;
static {
- // Use JAnsi if available
- boolean jansi;
+ boolean useSlf4j = false;
try {
- if (Boolean.getBoolean(NO_JANSI_PROPERTY)) {
- jansi = false;
- } else {
- Class.forName("org.fusesource.jansi.Ansi");
- AnsiConsole.systemInstall();
- jansi = true;
- }
+ Class.forName("org.slf4j.Logger");
+ useSlf4j = !Boolean.getBoolean(NO_SLF4J_PROPERTY);
} catch (ClassNotFoundException ignored) {
- jansi = false;
}
- JANSI = jansi;
-
- // Add std writer
- STD_OUTPUT = new OutputEnity(System.out::println, JANSI ? OutputTypes.JANSI : OutputTypes.PLAIN);
- addOutput(STD_OUTPUT);
-
- // Add file log writer
- String logFile = System.getProperty("launcher.logFile");
- if (logFile != null) {
- try {
- addOutput(IOHelper.toPath(logFile));
- } catch (IOException e) {
- error(e);
- }
+ if(useSlf4j) {
+ impl = new Slf4jLogHelperImpl();
+ } else {
+ impl = new SimpleLogHelperImpl();
}
}
@@ -73,7 +50,7 @@ private LogHelper() {
}
public static void addOutput(OutputEnity output) {
- OUTPUTS.add(Objects.requireNonNull(output, "output"));
+ impl.addOutput(output);
}
public static void addExcCallback(Consumer output) {
@@ -81,19 +58,15 @@ public static void addExcCallback(Consumer output) {
}
public static void addOutput(Output output, OutputTypes type) {
- OUTPUTS.add(new OutputEnity(Objects.requireNonNull(output, "output"), type));
+ addOutput(new OutputEnity(Objects.requireNonNull(output, "output"), type));
}
public static void addOutput(Path file) throws IOException {
- if (JANSI) {
- addOutput(new JAnsiOutput(IOHelper.newOutput(file, true)), OutputTypes.JANSI);
- } else {
- addOutput(IOHelper.newWriter(file, true));
- }
+ addOutput(IOHelper.newWriter(file, true));
}
public static void addOutput(Writer writer) {
- addOutput(new WriterOutput(writer), OutputTypes.PLAIN);
+ addOutput(new SimpleLogHelperImpl.WriterOutput(writer), OutputTypes.PLAIN);
}
public static void debug(String message) {
@@ -140,152 +113,51 @@ public static void info(String format, Object... args) {
}
public static boolean isDebugEnabled() {
- return DEBUG_ENABLED.get();
+ return impl.isDebugEnabled();
}
public static void setDebugEnabled(boolean debugEnabled) {
- DEBUG_ENABLED.set(debugEnabled);
+ impl.setDebugEnabled(debugEnabled);
}
public static boolean isStacktraceEnabled() {
- return STACKTRACE_ENABLED.get();
+ return impl.isStacktraceEnabled();
}
public static void setStacktraceEnabled(boolean stacktraceEnabled) {
- STACKTRACE_ENABLED.set(stacktraceEnabled);
+ impl.setStacktraceEnabled(stacktraceEnabled);
}
public static boolean isDevEnabled() {
- return DEV_ENABLED.get();
+ return impl.isDevEnabled();
}
public static void setDevEnabled(boolean stacktraceEnabled) {
- DEV_ENABLED.set(stacktraceEnabled);
+ impl.setDevEnabled(stacktraceEnabled);
}
-
+ @Deprecated
public static String getDataTime() {
- return DATE_TIME_FORMATTER.format(LocalDateTime.now());
+ return DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss", Locale.US).format(LocalDateTime.now());
}
public static void log(Level level, String message, boolean sub) {
- String dateTime = DATE_TIME_FORMATTER.format(LocalDateTime.now());
- String jansiString = null, plainString = null, htmlString = null;
- for (OutputEnity output : OUTPUTS) {
- if (output.type == OutputTypes.JANSI && JANSI) {
- if (jansiString != null) {
- output.output.println(jansiString);
- continue;
- }
-
- jansiString = ansiFormatLog(level, dateTime, message, sub);
- output.output.println(jansiString);
- } else if (output.type == OutputTypes.HTML) {
- if (htmlString != null) {
- output.output.println(htmlString);
- continue;
- }
-
- htmlString = htmlFormatLog(level, dateTime, message, sub);
- output.output.println(htmlString);
- } else {
- if (plainString != null) {
- output.output.println(plainString);
- continue;
- }
-
- plainString = formatLog(level, message, dateTime, sub);
- output.output.println(plainString);
- }
- }
+ impl.log(level, message, sub);
}
- public static void rawLog(Supplier plainStr, Supplier jansiStr) {
- rawLog(plainStr, jansiStr, null);
- }
-
- public static void rawLog(Supplier plainStr, Supplier jansiStr, Supplier htmlStr) {
- String jansiString = null, plainString = null, htmlString = null;
- for (OutputEnity output : OUTPUTS) {
- if (output.type == OutputTypes.JANSI && JANSI) {
- if (jansiString != null) {
- output.output.println(jansiString);
- continue;
- }
-
- jansiString = jansiStr.get();
- output.output.println(jansiString);
- } else if (output.type == OutputTypes.HTML) {
- if (htmlString != null) {
- output.output.println(htmlString);
- continue;
- }
-
- htmlString = htmlStr.get();
- output.output.println(htmlString);
- } else {
- if (plainString != null) {
- output.output.println(plainString);
- continue;
- }
-
- plainString = plainStr.get();
- output.output.println(plainString);
- }
- }
+ public static void logJAnsi(LogHelper.Level level, Supplier plaintext, Supplier jansitext, boolean sub) {
+ impl.logJAnsi(level, plaintext, jansitext, sub);
}
public static void printVersion(String product) {
- String jansiString = null, plainString = null;
- for (OutputEnity output : OUTPUTS) {
- if (output.type == OutputTypes.JANSI && JANSI) {
- if (jansiString != null) {
- output.output.println(jansiString);
- continue;
- }
-
- jansiString = FormatHelper.ansiFormatVersion(product);
- output.output.println(jansiString);
- } else {
- if (plainString != null) {
- output.output.println(plainString);
- continue;
- }
-
- plainString = FormatHelper.formatVersion(product);
- output.output.println(plainString);
- }
- }
+ impl.printVersion(product);
}
public static void printLicense(String product) {
- String jansiString = null, plainString = null;
- for (OutputEnity output : OUTPUTS) {
- if (output.type == OutputTypes.JANSI && JANSI) {
- if (jansiString != null) {
- output.output.println(jansiString);
- continue;
- }
-
- jansiString = FormatHelper.ansiFormatLicense(product);
- output.output.println(jansiString);
- } else {
- if (plainString != null) {
- output.output.println(plainString);
- continue;
- }
-
- plainString = FormatHelper.formatLicense(product);
- output.output.println(plainString);
- }
- }
+ impl.printLicense(product);
}
public static boolean removeOutput(OutputEnity output) {
- return OUTPUTS.remove(output);
- }
-
- public static boolean removeStdOutput() {
- return removeOutput(STD_OUTPUT);
+ return impl.removeOutput(output);
}
public static void subDebug(String message) {
@@ -328,51 +200,13 @@ public static void warning(String format, Object... args) {
warning(String.format(format, args));
}
- private static String ansiFormatLog(Level level, String dateTime, String message, boolean sub) {
-
- Ansi ansi = FormatHelper.rawAnsiFormat(level, dateTime, sub);
- ansi.a(message);
-
- // Finish with reset code
- return ansi.reset().toString();
- }
-
- public static String htmlFormatLog(Level level, String dateTime, String message, boolean sub) {
- String levelColor;
- switch (level) {
- case WARNING:
- levelColor = "gravitlauncher-log-warning";
- break;
- case ERROR:
- levelColor = "gravitlauncher-log-error";
- break;
- case INFO:
- levelColor = "gravitlauncher-log-info";
- break;
- case DEBUG:
- levelColor = "gravitlauncher-log-debug";
- break;
- case DEV:
- levelColor = "gravitlauncher-log-dev";
- break;
- default:
- levelColor = "gravitlauncher-log-unknown";
- break;
- }
- if (sub) levelColor += " gravitlauncher-log-sub";
- return String.format("%s [%s] %s", dateTime, levelColor, level.toString(), sub ? ' ' + message : message);
- }
-
- private static String formatLog(Level level, String message, String dateTime, boolean sub) {
- return FormatHelper.rawFormat(level, dateTime, sub) + message;
- }
-
public enum OutputTypes {
@LauncherNetworkAPI
PLAIN,
@LauncherNetworkAPI
JANSI,
@LauncherNetworkAPI
+ @Deprecated
HTML
}
@@ -405,33 +239,4 @@ public OutputEnity(Output output, OutputTypes type) {
this.type = type;
}
}
-
- private static final class JAnsiOutput extends WriterOutput {
- private JAnsiOutput(OutputStream output) {
- super(IOHelper.newWriter(output));
- }
- }
-
- private static class WriterOutput implements Output, AutoCloseable {
- private final Writer writer;
-
- private WriterOutput(Writer writer) {
- this.writer = writer;
- }
-
- @Override
- public void close() throws IOException {
- writer.close();
- }
-
- @Override
- public void println(String message) {
- try {
- writer.write(message + System.lineSeparator());
- writer.flush();
- } catch (IOException ignored) {
- // Do nothing?
- }
- }
- }
}
\ No newline at end of file
diff --git a/LauncherCore/src/main/java/pro/gravit/utils/logging/LogHelperAppender.java b/LauncherCore/src/main/java/pro/gravit/utils/logging/LogHelperAppender.java
new file mode 100644
index 00000000..725b09c0
--- /dev/null
+++ b/LauncherCore/src/main/java/pro/gravit/utils/logging/LogHelperAppender.java
@@ -0,0 +1,20 @@
+package pro.gravit.utils.logging;
+
+import pro.gravit.utils.helper.LogHelper;
+
+import java.util.function.Supplier;
+
+public interface LogHelperAppender {
+ void log(LogHelper.Level level, String message, boolean sub);
+ void logJAnsi(LogHelper.Level level, Supplier plaintext, Supplier jansitext, boolean sub);
+ boolean isDebugEnabled();
+ void setDebugEnabled(boolean debugEnabled);
+ boolean isStacktraceEnabled();
+ void setStacktraceEnabled(boolean stacktraceEnabled);
+ boolean isDevEnabled();
+ void setDevEnabled(boolean stacktraceEnabled);
+ void addOutput(LogHelper.OutputEnity output);
+ boolean removeOutput(LogHelper.OutputEnity output);
+ void printVersion(String product);
+ void printLicense(String product);
+}
diff --git a/LauncherCore/src/main/java/pro/gravit/utils/logging/SimpleLogHelperImpl.java b/LauncherCore/src/main/java/pro/gravit/utils/logging/SimpleLogHelperImpl.java
new file mode 100644
index 00000000..9a597c69
--- /dev/null
+++ b/LauncherCore/src/main/java/pro/gravit/utils/logging/SimpleLogHelperImpl.java
@@ -0,0 +1,271 @@
+package pro.gravit.utils.logging;
+
+import org.fusesource.jansi.Ansi;
+import org.fusesource.jansi.AnsiConsole;
+import pro.gravit.utils.helper.FormatHelper;
+import pro.gravit.utils.helper.IOHelper;
+import pro.gravit.utils.helper.LogHelper;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.nio.file.Path;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Supplier;
+
+import static pro.gravit.utils.helper.LogHelper.*;
+
+public class SimpleLogHelperImpl implements LogHelperAppender {
+
+ // Output settings
+ private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss", Locale.US);
+ private static final AtomicBoolean DEBUG_ENABLED = new AtomicBoolean(Boolean.getBoolean(DEBUG_PROPERTY));
+ private static final AtomicBoolean STACKTRACE_ENABLED = new AtomicBoolean(Boolean.getBoolean(STACKTRACE_PROPERTY));
+ private static final AtomicBoolean DEV_ENABLED = new AtomicBoolean(Boolean.getBoolean(DEV_PROPERTY));
+ private final Set OUTPUTS = Collections.newSetFromMap(new ConcurrentHashMap<>(2));
+ private final LogHelper.OutputEnity STD_OUTPUT;
+
+ public final boolean JANSI;
+
+ public SimpleLogHelperImpl() {
+ // Use JAnsi if available
+ boolean jansi;
+ try {
+ if (Boolean.getBoolean(NO_JANSI_PROPERTY)) {
+ jansi = false;
+ } else {
+ Class.forName("org.fusesource.jansi.Ansi");
+ AnsiConsole.systemInstall();
+ jansi = true;
+ }
+ } catch (ClassNotFoundException ignored) {
+ jansi = false;
+ }
+ JANSI = jansi;
+
+ // Add std writer
+ STD_OUTPUT = new LogHelper.OutputEnity(System.out::println, JANSI ? LogHelper.OutputTypes.JANSI : LogHelper.OutputTypes.PLAIN);
+ addOutput(STD_OUTPUT);
+
+ // Add file log writer
+ String logFile = System.getProperty("launcher.logFile");
+ if (logFile != null) {
+ try {
+ addOutput(IOHelper.toPath(logFile));
+ } catch (IOException e) {
+ error(e);
+ }
+ }
+ }
+
+ public void addOutput(Writer writer) {
+ addOutput(new WriterOutput(writer), OutputTypes.PLAIN);
+ }
+
+
+ public void log(Level level, String message, boolean sub) {
+ String dateTime = DATE_TIME_FORMATTER.format(LocalDateTime.now());
+ String jansiString = null, plainString = null;
+ for (OutputEnity output : OUTPUTS) {
+ if (output.type == OutputTypes.JANSI && JANSI) {
+ if (jansiString != null) {
+ output.output.println(jansiString);
+ continue;
+ }
+
+ jansiString = ansiFormatLog(level, dateTime, message, sub);
+ output.output.println(jansiString);
+ } else {
+ if (plainString != null) {
+ output.output.println(plainString);
+ continue;
+ }
+
+ plainString = formatLog(level, message, dateTime, sub);
+ output.output.println(plainString);
+ }
+ }
+ }
+
+ @Override
+ public void logJAnsi(Level level, Supplier plaintext, Supplier jansitext, boolean sub) {
+ if(JANSI) {
+ log(level, jansitext.get(), sub);
+ } else {
+ log(level, plaintext.get(), sub);
+ }
+ }
+
+ @Override
+ public boolean isDebugEnabled() {
+ return DEBUG_ENABLED.get();
+ }
+
+ @Override
+ public void setDebugEnabled(boolean debugEnabled) {
+ DEBUG_ENABLED.set(debugEnabled);
+ }
+
+ @Override
+ public boolean isStacktraceEnabled() {
+ return STACKTRACE_ENABLED.get();
+ }
+
+ @Override
+ public void setStacktraceEnabled(boolean stacktraceEnabled) {
+ STACKTRACE_ENABLED.set(stacktraceEnabled);
+ }
+
+ @Override
+ public boolean isDevEnabled() {
+ return DEV_ENABLED.get();
+ }
+
+ @Override
+ public void setDevEnabled(boolean stacktraceEnabled) {
+ DEV_ENABLED.set(stacktraceEnabled);
+ }
+
+ @Override
+ public void addOutput(OutputEnity output) {
+ OUTPUTS.add(output);
+ }
+
+ @Override
+ public boolean removeOutput(OutputEnity output) {
+ return OUTPUTS.remove(output);
+ }
+
+ public void rawLog(Supplier plainStr, Supplier jansiStr) {
+ String jansiString = null, plainString = null;
+ for (OutputEnity output : OUTPUTS) {
+ if (output.type == OutputTypes.JANSI && JANSI) {
+ if (jansiString != null) {
+ output.output.println(jansiString);
+ continue;
+ }
+
+ jansiString = jansiStr.get();
+ output.output.println(jansiString);
+ } else {
+ if (plainString != null) {
+ output.output.println(plainString);
+ continue;
+ }
+
+ plainString = plainStr.get();
+ output.output.println(plainString);
+ }
+ }
+ }
+
+ public void addOutput(Output output, OutputTypes type) {
+ addOutput(new OutputEnity(Objects.requireNonNull(output, "output"), type));
+ }
+
+ public void addOutput(Path file) throws IOException {
+ if (JANSI) {
+ addOutput(new JAnsiOutput(IOHelper.newOutput(file, true)), OutputTypes.JANSI);
+ } else {
+ addOutput(IOHelper.newWriter(file, true));
+ }
+ }
+
+
+ private String ansiFormatLog(Level level, String dateTime, String message, boolean sub) {
+
+ Ansi ansi = FormatHelper.rawAnsiFormat(level, dateTime, sub);
+ ansi.a(message);
+
+ // Finish with reset code
+ return ansi.reset().toString();
+ }
+
+ private String formatLog(Level level, String message, String dateTime, boolean sub) {
+ return FormatHelper.rawFormat(level, dateTime, sub) + message;
+ }
+
+ public void printVersion(String product) {
+ String jansiString = null, plainString = null;
+ for (OutputEnity output : OUTPUTS) {
+ if (output.type == OutputTypes.JANSI && JANSI) {
+ if (jansiString != null) {
+ output.output.println(jansiString);
+ continue;
+ }
+
+ jansiString = FormatHelper.ansiFormatVersion(product);
+ output.output.println(jansiString);
+ } else {
+ if (plainString != null) {
+ output.output.println(plainString);
+ continue;
+ }
+
+ plainString = FormatHelper.formatVersion(product);
+ output.output.println(plainString);
+ }
+ }
+ }
+
+ public void printLicense(String product) {
+ String jansiString = null, plainString = null;
+ for (OutputEnity output : OUTPUTS) {
+ if (output.type == OutputTypes.JANSI && JANSI) {
+ if (jansiString != null) {
+ output.output.println(jansiString);
+ continue;
+ }
+
+ jansiString = FormatHelper.ansiFormatLicense(product);
+ output.output.println(jansiString);
+ } else {
+ if (plainString != null) {
+ output.output.println(plainString);
+ continue;
+ }
+
+ plainString = FormatHelper.formatLicense(product);
+ output.output.println(plainString);
+ }
+ }
+ }
+
+ public static final class JAnsiOutput extends WriterOutput {
+ private JAnsiOutput(OutputStream output) {
+ super(IOHelper.newWriter(output));
+ }
+ }
+
+
+
+ public static class WriterOutput implements Output, AutoCloseable {
+ private final Writer writer;
+
+ public WriterOutput(Writer writer) {
+ this.writer = writer;
+ }
+
+ @Override
+ public void close() throws IOException {
+ writer.close();
+ }
+
+ @Override
+ public void println(String message) {
+ try {
+ writer.write(message + System.lineSeparator());
+ writer.flush();
+ } catch (IOException ignored) {
+ // Do nothing?
+ }
+ }
+ }
+}
diff --git a/LauncherCore/src/main/java/pro/gravit/utils/logging/Slf4jLogHelperImpl.java b/LauncherCore/src/main/java/pro/gravit/utils/logging/Slf4jLogHelperImpl.java
new file mode 100644
index 00000000..87a36b84
--- /dev/null
+++ b/LauncherCore/src/main/java/pro/gravit/utils/logging/Slf4jLogHelperImpl.java
@@ -0,0 +1,119 @@
+package pro.gravit.utils.logging;
+
+import org.fusesource.jansi.AnsiConsole;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import pro.gravit.utils.helper.FormatHelper;
+import pro.gravit.utils.helper.LogHelper;
+
+import java.util.function.Supplier;
+
+import static pro.gravit.utils.helper.LogHelper.NO_JANSI_PROPERTY;
+
+public class Slf4jLogHelperImpl implements LogHelperAppender {
+ private final Logger logger = LoggerFactory.getLogger("LogHelper");
+ private final boolean JANSI;
+ public Slf4jLogHelperImpl() {
+ boolean jansi;
+ try {
+ if (Boolean.getBoolean(NO_JANSI_PROPERTY)) {
+ jansi = false;
+ } else {
+ Class.forName("org.fusesource.jansi.Ansi");
+ AnsiConsole.systemInstall();
+ jansi = true;
+ }
+ } catch (ClassNotFoundException ignored) {
+ jansi = false;
+ }
+ JANSI = jansi;
+ }
+
+ @Override
+ public void log(LogHelper.Level level, String message, boolean sub) {
+ switch (level) {
+ case DEV:
+ logger.trace(message);
+ break;
+ case DEBUG:
+ logger.debug(message);
+ break;
+ case INFO:
+ logger.info(message);
+ break;
+ case WARNING:
+ logger.warn(message);
+ break;
+ case ERROR:
+ logger.error(message);
+ break;
+ }
+ }
+
+ @Override
+ public void logJAnsi(LogHelper.Level level, Supplier plaintext, Supplier jansitext, boolean sub) {
+ if(JANSI) {
+ log(level, jansitext.get(), sub);
+ } else {
+ log(level, plaintext.get(), sub);
+ }
+ }
+
+ @Override
+ public boolean isDebugEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setDebugEnabled(boolean debugEnabled) {
+ //NOP
+ }
+
+ @Override
+ public boolean isStacktraceEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setStacktraceEnabled(boolean stacktraceEnabled) {
+ //NOP
+ }
+
+ @Override
+ public boolean isDevEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setDevEnabled(boolean stacktraceEnabled) {
+ //NOP
+ }
+
+ @Override
+ public void addOutput(LogHelper.OutputEnity output) {
+
+ }
+
+ @Override
+ public boolean removeOutput(LogHelper.OutputEnity output) {
+ return false;
+ }
+
+ @Override
+ public void printVersion(String product) {
+ if(JANSI) {
+ logger.info(FormatHelper.ansiFormatVersion(product));
+ } else {
+ logger.info(FormatHelper.formatVersion(product));
+ }
+ }
+
+ @Override
+ public void printLicense(String product) {
+ if(JANSI) {
+ logger.info(FormatHelper.ansiFormatLicense(product));
+ } else {
+ logger.info(FormatHelper.formatLicense(product));
+ }
+ }
+}