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)); + } + } +}