From 7ea0fc57b87ab24439d1f25f56661bc78b9ba607 Mon Sep 17 00:00:00 2001 From: SerLiunx-ctrl <17689543@qq.com> Date: Wed, 15 Jan 2025 15:23:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EJLine=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=9B=B4=E5=A5=BD=E7=9A=84=E6=8E=A7=E5=88=B6=E5=8F=B0?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E8=BE=93=E5=87=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../java/com/serliunx/ddns/ManagerLite.java | 35 +++++++++- .../ddns/support/log/JLineAdaptAppender.java | 65 +++++++++++++++++++ src/main/resources/logback.xml | 13 ++-- 4 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/serliunx/ddns/support/log/JLineAdaptAppender.java diff --git a/pom.xml b/pom.xml index 78811ef..596ef64 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,12 @@ sqlite-jdbc ${sqlite.jdbc.version} + + + org.jline + jline + 3.28.0 + diff --git a/src/main/java/com/serliunx/ddns/ManagerLite.java b/src/main/java/com/serliunx/ddns/ManagerLite.java index 694dc6a..1fb5d40 100644 --- a/src/main/java/com/serliunx/ddns/ManagerLite.java +++ b/src/main/java/com/serliunx/ddns/ManagerLite.java @@ -7,6 +7,12 @@ import com.serliunx.ddns.constant.SystemConstants; import com.serliunx.ddns.core.context.FileInstanceContext; import com.serliunx.ddns.core.context.MultipleSourceInstanceContext; import com.serliunx.ddns.support.SystemInitializer; +import com.serliunx.ddns.support.log.JLineAdaptAppender; +import org.jline.reader.LineReader; +import org.jline.reader.LineReaderBuilder; +import org.jline.reader.impl.history.DefaultHistory; +import org.jline.terminal.Terminal; +import org.jline.terminal.TerminalBuilder; /** * 启动类 @@ -30,7 +36,7 @@ public final class ManagerLite { */ private static SystemInitializer systemInitializer; - public static void main(String[] args) { + public static void main(String[] args) throws Exception { // 配置初始化 initConfiguration(args); @@ -40,6 +46,33 @@ public final class ManagerLite { // 系统初始化 initSystem(); + + Terminal terminal = TerminalBuilder.builder().system(true).build(); + LineReader lineReader = LineReaderBuilder.builder() + .terminal(terminal) + // 如果想记录历史命令,可以配置一个 History + .history(new DefaultHistory()) + .build(); + + JLineAdaptAppender.setLineReader(lineReader); + + String prompt = "client> "; + + while (true) { + // 该方法会阻塞,直到用户敲回车 + String line = lineReader.readLine(prompt); + + // 当用户输入 exit 或 quit,就退出循环 + if ("exit".equalsIgnoreCase(line) + || "quit".equalsIgnoreCase(line)) { + break; + } + // 在这里可以对用户输入做进一步处理 + terminal.writer().println("You entered: " + line); + terminal.flush(); + } + + terminal.close(); } /** diff --git a/src/main/java/com/serliunx/ddns/support/log/JLineAdaptAppender.java b/src/main/java/com/serliunx/ddns/support/log/JLineAdaptAppender.java new file mode 100644 index 0000000..9fa9b39 --- /dev/null +++ b/src/main/java/com/serliunx/ddns/support/log/JLineAdaptAppender.java @@ -0,0 +1,65 @@ +package com.serliunx.ddns.support.log; + +import ch.qos.logback.classic.PatternLayout; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; +import ch.qos.logback.core.Layout; +import org.jline.reader.LineReader; + +/** + * 适配JLine的控制台日志输出 + * + * @author SerLiunx + * @since 2025/1/15 + */ +public final class JLineAdaptAppender extends AppenderBase { + + /** + * JLine的输入读取 + */ + private static LineReader lineReader; + + /** + * 格式控制 + */ + private Layout layout; + + /** + * 所配置的格式 + */ + private String pattern; + + @Override + public void start() { + super.start(); + PatternLayout patternLayout = new PatternLayout(); + patternLayout.setPattern(pattern); + patternLayout.setContext(getContext()); + patternLayout.start(); + this.layout = patternLayout; + } + + @Override + protected void append(ILoggingEvent event) { + if (lineReader != null) { + String formattedLog = layout.doLayout(event); + lineReader.printAbove(formattedLog); + } else { + System.out.print(layout.doLayout(event)); + } + } + + /** + * 设置输入读取 + * + * @param lr 读取 + */ + public static void setLineReader(LineReader lr) { + lineReader = lr; + } + + @SuppressWarnings("all") + public void setPattern(String pattern) { + this.pattern = pattern; + } +} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 184ebf6..18dd6d6 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -3,18 +3,15 @@ - - - - %boldGreen(%d{yyyy-MM-dd HH:mm:ss(SSS)}) %cyan([%pid]) %magenta([%15.15thread]) %green([%16.16instance]) %highlight([%-6level]) %boldCyan(%-36logger{32}): %msg%n - - + + + %boldGreen(%d{yyyy-MM-dd HH:mm:ss(SSS)}) %cyan([%pid]) %magenta([%15.15thread]) %green([%16.16instance]) %highlight([%-6level]) %boldCyan(%-36logger{32}): %msg%n + - - + \ No newline at end of file