From 7b9e4f4aef6925d575643420e9acb7c366232e9a Mon Sep 17 00:00:00 2001
From: gewuyou <1063891901@qq.com>
Date: Tue, 22 Aug 2023 15:57:23 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E2=9E=95=20=E6=B7=BB=E5=8A=A0=E4=BE=9D?=
=?UTF-8?q?=E8=B5=96=EF=BC=9A=E6=B7=BB=E5=8A=A0=E5=B9=B6=E5=BC=95=E5=85=A5?=
=?UTF-8?q?Slf4j=20api=20=E4=B8=8E=20logback=E4=BD=9C=E4=B8=BA=E9=A1=B9?=
=?UTF-8?q?=E7=9B=AE=E6=97=A5=E5=BF=97=E6=A1=86=E6=9E=B6=EF=BC=8C=E5=B7=B2?=
=?UTF-8?q?=E6=9B=BF=E6=8D=A2=E9=A1=B9=E7=9B=AE=E5=86=85=E6=8E=A7=E5=88=B6?=
=?UTF-8?q?=E5=8F=B0=E8=BE=93=E5=87=BA=EF=BC=8C=E7=AE=80=E5=8D=95=E5=B0=81?=
=?UTF-8?q?=E8=A3=85=E4=BA=86=E6=97=A5=E5=BF=97=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 19 ++-
src/main/java/module-info.java | 5 +-
src/main/java/org/jcnc/jnotepad/LunchApp.java | 1 -
.../controller/event/handler/OpenFile.java | 3 -
.../controller/event/handler/SaveAsFile.java | 4 +-
.../controller/manager/Controller.java | 8 +-
.../controller/manager/ShortcutKey.java | 5 +-
.../jcnc/jnotepad/exception/AppException.java | 12 ++
.../jcnc/jnotepad/tool/EncodingDetector.java | 3 +-
.../java/org/jcnc/jnotepad/tool/FileUtil.java | 2 +-
.../java/org/jcnc/jnotepad/tool/LogUtil.java | 85 ++++++++++++
.../jnotepad/view/manager/ViewManager.java | 6 +-
src/main/resources/logback.xml | 122 ++++++++++++++++++
13 files changed, 254 insertions(+), 21 deletions(-)
create mode 100644 src/main/java/org/jcnc/jnotepad/exception/AppException.java
create mode 100644 src/main/java/org/jcnc/jnotepad/tool/LogUtil.java
create mode 100644 src/main/resources/logback.xml
diff --git a/pom.xml b/pom.xml
index e6fde4c..319c9c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,7 +37,24 @@
gson
2.10.1
-
+
+
+
+ org.slf4j
+ slf4j-api
+ 2.0.7
+
+
+ ch.qos.logback
+ logback-core
+ 1.4.11
+
+
+
+ ch.qos.logback
+ logback-classic
+ 1.4.11
+
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index c4adc8c..38cbc9b 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,9 +1,10 @@
module org.jcnc.jnotepad {
requires javafx.controls;
requires atlantafx.base;
-// requires cn.hutool.json;
-// requires cn.hutool.core;
requires com.google.gson;
+ requires org.slf4j;
+ requires ch.qos.logback.core;
+ requires ch.qos.logback.classic;
exports org.jcnc.jnotepad;
exports org.jcnc.jnotepad.tool;
exports org.jcnc.jnotepad.Interface;
diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java
index 9619d61..2f539ff 100644
--- a/src/main/java/org/jcnc/jnotepad/LunchApp.java
+++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java
@@ -70,7 +70,6 @@ public class LunchApp extends Application {
// 初始化菜单项和标签栏
view.initTabPane();
view.initShortcutKey();
-
if (controller.isRelevance()) {
// 使用线程池加载关联文件并创建文本区域
List rawParameters = getParameters().getRaw();
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java
index 4b80318..4fdd55c 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenFile.java
@@ -7,7 +7,6 @@ import javafx.stage.FileChooser;
import org.jcnc.jnotepad.controller.manager.Controller;
import org.jcnc.jnotepad.ui.LineNumberTextArea;
import org.jcnc.jnotepad.ui.tab.JNotepadTabPane;
-import org.jcnc.jnotepad.view.manager.ViewManager;
import java.io.File;
@@ -26,8 +25,6 @@ public class OpenFile implements EventHandler {
*/
@Override
public void handle(ActionEvent event) {
- // 获取ViewManager的实例
- ViewManager viewManager = ViewManager.getInstance();
// 获取控制器
Controller controller = Controller.getInstance();
// 创建文件选择器
diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveAsFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveAsFile.java
index d7fbbda..d8a19f6 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveAsFile.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveAsFile.java
@@ -4,9 +4,9 @@ import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Tab;
import javafx.stage.FileChooser;
+import org.jcnc.jnotepad.tool.LogUtil;
import org.jcnc.jnotepad.ui.LineNumberTextArea;
import org.jcnc.jnotepad.ui.tab.JNotepadTabPane;
-import org.jcnc.jnotepad.view.manager.ViewManager;
import java.io.BufferedWriter;
import java.io.File;
@@ -49,7 +49,7 @@ public class SaveAsFile implements EventHandler {
selectedTab.setText(file.getName()); // 更新Tab页标签上的文件名
selectedTab.setUserData(file); // 将文件对象保存到Tab页的UserData中
} catch (IOException ignored) {
- System.out.println("已忽视IO异常!");
+ LogUtil.info("已忽视IO异常!",this.getClass());
}
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java
index 334db75..3773515 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java
@@ -11,6 +11,7 @@ import org.jcnc.jnotepad.controller.event.handler.NewFile;
import org.jcnc.jnotepad.controller.event.handler.OpenFile;
import org.jcnc.jnotepad.controller.event.handler.SaveAsFile;
import org.jcnc.jnotepad.tool.EncodingDetector;
+import org.jcnc.jnotepad.tool.LogUtil;
import org.jcnc.jnotepad.ui.LineNumberTextArea;
import org.jcnc.jnotepad.ui.tab.JNotepadTab;
import org.jcnc.jnotepad.ui.tab.JNotepadTabPane;
@@ -109,9 +110,9 @@ public class Controller implements ControllerInterface {
if (file != null) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write(newValue);
- System.out.println("正在自动保存---");
+ LogUtil.info("正在自动保存---",this.getClass());
} catch (IOException ignored) {
- System.out.println("已忽视IO异常!");
+ LogUtil.info("已忽视IO异常!",this.getClass());
}
}
}
@@ -163,7 +164,6 @@ public class Controller implements ControllerInterface {
*/
@Override
public void getText(File file) {
- ViewManager viewManager = ViewManager.getInstance();
LineNumberTextArea textArea = createNewTextArea();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
StringBuilder textBuilder = new StringBuilder();
@@ -184,7 +184,7 @@ public class Controller implements ControllerInterface {
autoSave(textArea);
});
} catch (IOException ignored) {
- System.out.println("已忽视IO异常!");
+ LogUtil.info("已忽视IO异常!",this.getClass());
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/controller/manager/ShortcutKey.java b/src/main/java/org/jcnc/jnotepad/controller/manager/ShortcutKey.java
index 12f3aa0..1de7ba1 100644
--- a/src/main/java/org/jcnc/jnotepad/controller/manager/ShortcutKey.java
+++ b/src/main/java/org/jcnc/jnotepad/controller/manager/ShortcutKey.java
@@ -6,6 +6,7 @@ import com.google.gson.reflect.TypeToken;
import javafx.scene.control.MenuItem;
import javafx.scene.input.KeyCombination;
import org.jcnc.jnotepad.Interface.ShortcutKeyInterface;
+import org.jcnc.jnotepad.tool.LogUtil;
import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar;
import java.io.*;
@@ -33,7 +34,7 @@ public class ShortcutKey implements ShortcutKeyInterface {
jsonData.append(line);
}
} catch (IOException e) {
- e.printStackTrace();
+ LogUtil.error("读取配置失败!",e,this.getClass());
}
} else {
// todo new InputStreamReader(inputStream) 实参 'inputStream' 可能为null
@@ -43,7 +44,7 @@ public class ShortcutKey implements ShortcutKeyInterface {
jsonData.append(line);
}
} catch (IOException e) {
- e.printStackTrace();
+ LogUtil.error("读取配置失败!",e,this.getClass());
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/exception/AppException.java b/src/main/java/org/jcnc/jnotepad/exception/AppException.java
new file mode 100644
index 0000000..cd9c514
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/exception/AppException.java
@@ -0,0 +1,12 @@
+package org.jcnc.jnotepad.exception;
+
+/**
+ * 应用异常类
+ *
+ * @author gewuyou
+ */
+public class AppException extends RuntimeException {
+ public AppException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java
index 5343276..a876d60 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java
@@ -1,6 +1,7 @@
package org.jcnc.jnotepad.tool;
+import javafx.application.Platform;
import org.jcnc.jnotepad.ui.LineNumberTextArea;
import java.nio.charset.Charset;
@@ -36,7 +37,7 @@ public class EncodingDetector {
// 尝试常见的编码
for (Charset charset : commonCharsets()) {
if (isValidEncoding(text, charset)) {
- System.out.println("编码监测结果:" + isValidEncoding(text, charset));
+ Platform.runLater(()-> LogUtil.info("编码监测结果:" + isValidEncoding(text, charset),EncodingDetector.class));
return charset.name();
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java b/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java
index 86dfde1..3d584ca 100644
--- a/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java
+++ b/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java
@@ -30,7 +30,7 @@ public class FileUtil {
jsonStr = sb.toString();
return jsonStr;
} catch (IOException e) {
- e.printStackTrace();
+ LogUtil.error("读取配置失败!",e,FileUtil.class);
return null;
}
}
diff --git a/src/main/java/org/jcnc/jnotepad/tool/LogUtil.java b/src/main/java/org/jcnc/jnotepad/tool/LogUtil.java
new file mode 100644
index 0000000..60bcfb6
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/tool/LogUtil.java
@@ -0,0 +1,85 @@
+package org.jcnc.jnotepad.tool;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 日志工具
注意,使用该工具的方法时,如果需要在JavaFx项目中调用日志请使用Platform.runLater()调用
+ *
+ * @author gewuyou
+ */
+public class LogUtil {
+ private LogUtil() {
+ }
+
+ /**
+ * 获取日志类
+ *
+ * @param currentClass 所要记录的类
+ * @return org.apache.logging.log4j.Logger 日志对象
+ * @apiNote 传入当前需要记录的类,返回记录该类的日志类,也可直接使用工具类定义好的方法,也可调用这个方法自定义
+ * @see LogUtil
+ */
+ public static Logger getLogger(Class> currentClass) {
+ return LoggerFactory.getLogger(currentClass);
+ }
+
+ /**
+ * 日志信息打印
+ *
+ * @param message 日志信息
+ * @param currentClass 所要记录的类
+ * @apiNote 传入当前需要记录的类,方便知晓是哪个位置记录的日志
+ */
+ public static void info(String message, Class> currentClass) {
+ getLogger(currentClass).info(message);
+ }
+
+ /**
+ * 日志排错信息打印
+ *
+ * @param message 日志信息
+ * @param currentClass 所要记录的类
+ * @apiNote 传入当前需要记录的类,方便知晓是哪个位置记录的日志
+ */
+
+ public static void debug(String message, Class> currentClass) {
+ getLogger(currentClass).debug(message);
+ }
+
+ /**
+ * 日志警告信息打印
+ *
+ * @param message 日志信息
+ * @param currentClass 所要记录的类
+ * @apiNote 传入当前需要记录的类,方便知晓是哪个位置记录的日志
+ */
+ public static void warn(String message, Class> currentClass) {
+ getLogger(currentClass).warn(message);
+ }
+
+ /**
+ * 日志错误信息打印
+ *
+ * @param message 日志信息
+ * @param currentClass 所要记录的类
+ * @apiNote 传入当前需要记录的类,方便知晓是哪个位置记录的日志
+ */
+ public static void error(String message, Class> currentClass) {
+ getLogger(currentClass).error(message);
+ }
+
+ /**
+ * 日志错误信息打印
+ *
+ * @param message 日志信息
+ * @param throwable 抛出的异常
+ * @param currentClass 所要记录的类
+ * @apiNote 这个方法用来弥补当抛出异常或手动抛出异常时,无法捕捉到所抛异常
+ */
+
+ public static void error(String message, Throwable throwable, Class> currentClass) {
+ getLogger(currentClass).error(message, throwable);
+ }
+}
diff --git a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
index d3e1134..af87eb0 100644
--- a/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
+++ b/src/main/java/org/jcnc/jnotepad/view/manager/ViewManager.java
@@ -5,6 +5,7 @@ import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
+import org.jcnc.jnotepad.exception.AppException;
import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar;
import org.jcnc.jnotepad.ui.tab.JNotepadTabPane;
@@ -35,8 +36,6 @@ public class ViewManager {
private static ViewManager instance = null;
-
-
public Label getEnCodingLabel() {
return enCodingLabel;
}
@@ -47,7 +46,6 @@ public class ViewManager {
* @return int 标签页索引
* @apiNote ++tabIndex
*/
-
public int selfIncreaseAndGetTabIndex() {
return ++tabIndex;
}
@@ -83,7 +81,7 @@ public class ViewManager {
if (instance != null) {
return instance;
} else {
- throw new RuntimeException("ViewManager的实例未初始化!");
+ throw new AppException("ViewManager的实例未初始化!");
}
}
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..ad82236
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${log.pattern}
+
+
+
+
+
+ ${log.filePath}/debug.log
+
+
+
+
+ ${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
+
+
+ ${log.maxHistory}
+
+
+ ${log.pattern}
+
+
+
+
+ DEBUG
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+ ${log.filePath}/info.log
+
+
+
+
+ ${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
+
+
+ ${log.maxHistory}
+
+
+ ${log.pattern}
+
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+ ${log.filePath}/error.log
+
+
+
+
+ ${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
+
+
+ ${log.maxHistory}
+
+
+ ${log.pattern}
+
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 2c6c88d62c2862b87063abf364bab6896935384a Mon Sep 17 00:00:00 2001
From: gewuyou <1063891901@qq.com>
Date: Tue, 22 Aug 2023 16:52:58 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20=E4=BF=AE=E6=AD=A3?=
=?UTF-8?q?=EF=BC=9A=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85=E5=90=8E=EF=BC=8C?=
=?UTF-8?q?=E5=90=AF=E5=8A=A8=E7=A8=8B=E5=BA=8F=E6=97=A5=E5=BF=97=E6=A1=86?=
=?UTF-8?q?=E6=9E=B6=E6=8F=90=E7=A4=BA=E7=BC=BA=E5=B0=91javax/naming/Namin?=
=?UTF-8?q?gException?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/main/java/module-info.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 38cbc9b..35e74dd 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,5 +1,9 @@
module org.jcnc.jnotepad {
requires javafx.controls;
+ // 不知道为什么,不加这个,日志框架在打包后的程序不起作用,会报错
+ // Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: javax/naming/NamingException
+ // 但我打开源代码,他们的模块的确有包含这个,java.naming,这个没懂,我干脆自己导入
+ requires java.naming;
requires atlantafx.base;
requires com.google.gson;
requires org.slf4j;