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;