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