From bb8f94f9c0a7e81cdd001da06c8132873786e3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=BE=E6=88=90=E7=BF=94?= Date: Tue, 7 Dec 2021 10:06:47 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/drinkjava2/frog/Env.java | 7 +- .../drinkjava2/frog/egg/FrogEggTool.java | 15 ++- .../drinkjava2/frog/logger/LevelEnum.java | 45 +++++++ .../gitee/drinkjava2/frog/logger/Logger.java | 49 ++++++++ .../drinkjava2/frog/logger/LoggerCenter.java | 56 +++++++++ .../drinkjava2/frog/logger/LoggingEvent.java | 110 ++++++++++++++++++ .../frog/logger/MessageFormatter.java | 79 +++++++++++++ .../frog/logger/PrintLogService.java | 68 +++++++++++ 8 files changed, 418 insertions(+), 11 deletions(-) create mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java create mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java create mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java create mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java create mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java create mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/Env.java b/core/src/main/java/com/gitee/drinkjava2/frog/Env.java index 901dcc6..abb3480 100644 --- a/core/src/main/java/com/gitee/drinkjava2/frog/Env.java +++ b/core/src/main/java/com/gitee/drinkjava2/frog/Env.java @@ -11,6 +11,7 @@ import javax.swing.JPanel; import com.gitee.drinkjava2.frog.egg.Egg; import com.gitee.drinkjava2.frog.egg.FrogEggTool; +import com.gitee.drinkjava2.frog.logger.Logger; import com.gitee.drinkjava2.frog.objects.EnvObject; import com.gitee.drinkjava2.frog.objects.Food; import com.gitee.drinkjava2.frog.objects.Material; @@ -91,11 +92,11 @@ public class Env extends JPanel { public static List frog_eggs = new ArrayList<>(); // 这里存放新建或从磁盘载入上轮下的蛋,每个蛋可能生成几个青蛙, - public static EnvObject[] things = new EnvObject[]{ };// 所有外界物体,如食物、字母测试工具都放在这个things里面 + public static EnvObject[] things = new EnvObject[]{ };// 所有外界物体,如食物、字母测试工具都放在这个things里面 static { - System.out.println("唵缚悉波罗摩尼莎诃!"); // 杀生前先打印往生咒,见码云issue#IW4H8 - System.out.println("脑图快捷键: T:顶视 F:前视 L:左视 R:右视 X:斜视 方向键:剖视 空格:暂停 鼠标:缩放旋转平移"); + Logger.info("唵缚悉波罗摩尼莎诃!"); // 杀生前先打印往生咒,见码云issue#IW4H8 + Logger.info("脑图快捷键: T:顶视 F:前视 L:左视 R:右视 X:斜视 方向键:剖视 空格:暂停 鼠标:缩放旋转平移"); if (DELETE_FROG_EGGS) FrogEggTool.deleteEggs(); } diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java b/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java index 99f06ac..5ae47c2 100644 --- a/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java +++ b/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java @@ -23,6 +23,7 @@ import com.gitee.drinkjava2.frog.Animal; import com.gitee.drinkjava2.frog.Application; import com.gitee.drinkjava2.frog.Env; import com.gitee.drinkjava2.frog.Frog; +import com.gitee.drinkjava2.frog.logger.Logger; import com.gitee.drinkjava2.frog.util.LocalFileUtils; /** @@ -49,18 +50,16 @@ public class FrogEggTool { Env.frog_eggs.clear(); for (int i = 0; i < Env.FROG_EGG_QTY; i++) Env.frog_eggs.add(new Egg(Env.frogs.get(i))); - System.out.print("Fist frog energy=" + first.energy); - System.out.print(", Last frog energy=" + last.energy); + Logger.info("Fist frog energy={}, Last frog energy={}", first.energy, last.energy); if (Env.SAVE_EGGS_FILE) { FileOutputStream fo = new FileOutputStream(Application.CLASSPATH + "frog_eggs.ser"); ObjectOutputStream so = new ObjectOutputStream(fo); so.writeObject(Env.frog_eggs); so.close(); - System.out.print(". Saved " + Env.frog_eggs.size() + " eggs to file '" + Application.CLASSPATH + "frog_eggs.ser'"); + Logger.info(". Saved {} eggs to file '{}frog_eggs.ser'", Env.frog_eggs.size(), Application.CLASSPATH); } - System.out.println(); } catch (IOException e) { - System.out.println(e); + Logger.error(e); } } @@ -78,7 +77,7 @@ public class FrogEggTool { } public static void deleteEggs() { - System.out.println("Delete exist egg file: '" + Application.CLASSPATH + "frog_eggs.ser'"); + Logger.info("Delete exist egg file: '{}frog_eggs.ser'", Application.CLASSPATH); LocalFileUtils.deleteFile(Application.CLASSPATH + "frog_eggs.ser"); } @@ -92,7 +91,7 @@ public class FrogEggTool { FileInputStream eggsFile = new FileInputStream(Application.CLASSPATH + "frog_eggs.ser"); ObjectInputStream eggsInputStream = new ObjectInputStream(eggsFile); Env.frog_eggs = (List) eggsInputStream.readObject(); - System.out.println("Loaded " + Env.frog_eggs.size() + " eggs from file '" + Application.CLASSPATH + Logger.info("Loaded " + Env.frog_eggs.size() + " eggs from file '" + Application.CLASSPATH + "frog_eggs.ser" + "'.\n"); eggsInputStream.close(); } catch (Exception e) { @@ -105,7 +104,7 @@ public class FrogEggTool { //TODO Env.frog_eggs.add(egg); } - System.out.println("Fail to load frog egg file '" + Application.CLASSPATH + "frog_eggs.ser" + "', created " + Logger.info("Fail to load frog egg file '" + Application.CLASSPATH + "frog_eggs.ser" + "', created " + Env.frog_eggs.size() + " eggs to do test."); } diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java new file mode 100644 index 0000000..0bff962 --- /dev/null +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java @@ -0,0 +1,45 @@ +package com.gitee.drinkjava2.frog.logger; + +/** + * @Description: 日志等级枚举 + * @Author: Luancx + * @Date: 2021/12/06 + * @Version: 1.0.0 + */ +public enum LevelEnum { + /** + * 日志等级 + */ + DEBUG(1, "DEBUG"), + INFO(2, "INFO"), + WARN(3, "WARN"), + ERROR(4, "ERROR"); + + private final int levelInt; + private final String levelStr; + + public static int getEnumInt(String levelStr) { + LevelEnum[] levelEnums = values(); + for (LevelEnum level : levelEnums) { + if (level.levelStr.equals(levelStr)) { + return level.getLevelInt(); + } + } + throw new IllegalStateException("Level " + levelStr + " is unknown."); + } + + + LevelEnum(int levelInt, String levelStr) { + this.levelInt = levelInt; + this.levelStr = levelStr; + } + + public int getLevelInt() { + return levelInt; + } + + public String getLevelStr() { + return levelStr; + } + +} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java new file mode 100644 index 0000000..4100e82 --- /dev/null +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java @@ -0,0 +1,49 @@ +package com.gitee.drinkjava2.frog.logger; + +/** + * @Description: 日志工厂类 + * @Author: Luancx + * @Date: 2021/12/02 + * @Version: 1.0.0 + */ +public final class Logger { + public static void debug(String msg) { + LoggerCenter.add(getLoggingEvent(LevelEnum.DEBUG, msg, null)); + } + + public static void debug(String msg, Object... argArray) { + LoggerCenter.add(getLoggingEvent(LevelEnum.DEBUG, msg, argArray)); + } + + public static void info(String msg) { + LoggerCenter.add(getLoggingEvent(LevelEnum.INFO, msg, null)); + } + + public static void info(String msg, Object... argArray) { + LoggerCenter.add(getLoggingEvent(LevelEnum.INFO, msg, argArray)); + } + + public static void warn(String msg) { + LoggerCenter.add(getLoggingEvent(LevelEnum.WARN, msg, null)); + } + + public static void warn(String msg, Object... argArray) { + LoggerCenter.add(getLoggingEvent(LevelEnum.WARN, msg, argArray)); + } + + public static void error(String msg) { + LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, msg, null)); + } + + public static void error(String msg, Object... argArray) { + LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, msg, argArray)); + } + + public static void error(Object... argArray) { + LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, "", argArray)); + } + + private static LoggingEvent getLoggingEvent(LevelEnum level, String message, Object[] argumentArray) { + return new LoggingEvent(level, message, argumentArray); + } +} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java new file mode 100644 index 0000000..65267da --- /dev/null +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java @@ -0,0 +1,56 @@ +package com.gitee.drinkjava2.frog.logger; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +/** + * @Description: 日志处理中心 + * @Author: Luancx + * @Date: 2021/12/03 + * @Version: 1.0.0 + */ +public class LoggerCenter { + //***************** 按需修改 ********************* + /** + * 日志等级 + */ + private static final String LEV_EL = "info"; + /** + * 控制台日志输出 + */ + protected static final boolean CONSOLE = true; + /** + * 文件日志输出 + */ + protected static final boolean FILE = false; + /** + * 日志文件路径 + */ + private static final String FILE_PATH = ""; + + //***************** 请勿修改 ********************* + + private static final int LEVEL_INT; + /** + * 日志消息队列 + */ + protected static final BlockingQueue LOG_LIST = new ArrayBlockingQueue<>(1024); + + static { + new PrintLogService().start(); + LEVEL_INT = LevelEnum.getEnumInt(LEV_EL.toUpperCase()); + } + + /** + * 添加到待打印List中 + */ + public static void add(LoggingEvent loggingEvent) { + if (loggingEvent.getLevel().getLevelInt() >= LEVEL_INT) { + try { + LOG_LIST.put(loggingEvent); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java new file mode 100644 index 0000000..f6cc6f0 --- /dev/null +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java @@ -0,0 +1,110 @@ +package com.gitee.drinkjava2.frog.logger; + +import sun.misc.JavaLangAccess; +import sun.misc.SharedSecrets; + +import java.io.Serializable; + +/** + * @Description: 日志实体类 + * @Author: Luancx + * @Date: 2021/12/03 + * @Version: 1.0.0 + */ +public final class LoggingEvent implements Serializable { + /** + * 类名 + */ + private final String className; + /** + * 方法名 + */ + private final String methodName; + /** + * 行数 + */ + private final int lineNumber; + /** + * 日志等级 + */ + private final LevelEnum level; + /** + * 时间 + */ + private final long timeStamp; + /** + * 原始消息 + */ + private final String message; + /** + * 格式化后数据 + */ + private String formattedMessage; + /** + * 消息参数 + */ + private final Object[] argumentArray; + /** + * 异常信息 + */ + private Throwable throwable; + + public LoggingEvent(LevelEnum level, String message, Object[] argumentArray) { + JavaLangAccess access = SharedSecrets.getJavaLangAccess(); + Throwable throwable = new Throwable(); + StackTraceElement stack = access.getStackTraceElement(throwable, 3); + + this.className = stack.getClassName(); + this.methodName = stack.getMethodName(); + this.lineNumber = stack.getLineNumber(); + this.level = level; + this.message = message; + + //异常数据 + Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(argumentArray); + Object[] args = argumentArray; + if (throwableCandidate != null) { + //剔除异常参数 + args = MessageFormatter.trimmedCopy(argumentArray); + this.throwable = throwableCandidate; + } + this.argumentArray = args; + this.timeStamp = System.currentTimeMillis(); + } + + public String getClassName() { + return className; + } + + public String getMethodName() { + return methodName; + } + + public int getLineNumber() { + return lineNumber; + } + + public LevelEnum getLevel() { + return level; + } + + public long getTimeStamp() { + return timeStamp; + } + + public String getFormattedMessage() { + if (formattedMessage != null) { + return formattedMessage; + } + if (argumentArray != null) { + formattedMessage = MessageFormatter.messageFormat(message, argumentArray); + } else { + formattedMessage = message; + } + return formattedMessage; + } + + public Throwable getThrowable() { + return throwable; + } +} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java new file mode 100644 index 0000000..5ddcde2 --- /dev/null +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java @@ -0,0 +1,79 @@ +package com.gitee.drinkjava2.frog.logger; + +import java.text.SimpleDateFormat; + +/** + * @Description: 日志格式化类 + * @Author: Luancx + * @Date: 2021/12/06 + * @Version: 1.0.0 + */ +public final class MessageFormatter { + public static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); + private static final String DELIM_STR = "{}"; + private static final char ESCAPE_CHAR = '\\'; + + /** + * 格式胡日志 + * + * @param message 元数据 + * @param params 参数 + * @return 格式化后数据 + */ + public static String messageFormat(final String message, final Object[] params) { + if (message == null) { + return null; + } + if (params == null || params.length == 0) { + return message; + } + + return arrayFormat(message, params); + } + + /** + * 替换日志中的占位符 {} + * + * @param message 元数据 + * @param args 参数 + * @return 格式化后数据 + */ + private static String arrayFormat(final String message, final Object[] args) { + StringBuilder sb = new StringBuilder(); + + int s; + int i = 0; + for (Object o : args) { + s = message.indexOf(DELIM_STR, i); + if (s == -1) { + return i == 0 ? message : sb.append(message, i, message.length()).toString(); + } else { + sb.append(message, i, s); + sb.append(o); + i = s + 2; + } + } + return sb.toString(); + } + + public static Throwable getThrowableCandidate(final Object[] argArray) { + if (argArray == null || argArray.length == 0) { + return null; + } + final Object lastEntry = argArray[argArray.length - 1]; + if (lastEntry instanceof Throwable) { + return (Throwable) lastEntry; + } + return null; + } + + public static Object[] trimmedCopy(final Object[] argArray) { + final int trimmedLen = argArray.length - 1; + Object[] trimmed = new Object[trimmedLen]; + + if (trimmedLen > 0) { + System.arraycopy(argArray, 0, trimmed, 0, trimmedLen); + } + return trimmed; + } +} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java new file mode 100644 index 0000000..834f031 --- /dev/null +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java @@ -0,0 +1,68 @@ +package com.gitee.drinkjava2.frog.logger; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; + +/** + * @Description: 日志输出类 + * @Author: Luancx + * @Date: 2021/12/06 + * @Version: 1.0.0 + */ +public class PrintLogService extends Thread { + private static final OutputStream OUTPUT_STREAM = System.out; + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); + private static final String BLANK = " "; + private static final String TAB = "\tat"; + + @Override + public void run() { + while (true) { + try { + LoggingEvent event = LoggerCenter.LOG_LIST.take(); + if (LoggerCenter.CONSOLE) { + outPutConsole(event); + } + } catch (InterruptedException e) { + e.printStackTrace(); + break; + } + } + } + + private void outPutConsole(LoggingEvent event) { + try { + OUTPUT_STREAM.write(recursiveAppend(event)); + OUTPUT_STREAM.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 日志和异常信息组装 + */ + private byte[] recursiveAppend(LoggingEvent event) throws IOException { + StringBuilder sb = new StringBuilder(); + + sb.append(MessageFormatter.FORMAT.format(event.getTimeStamp())).append(BLANK); + sb.append("[").append(event.getLevel().getLevelStr()).append("][").append(event.getClassName()).append(BLANK); + sb.append(event.getLineNumber()).append("][").append(event.getMethodName()).append("] "); + sb.append("- ").append(event.getFormattedMessage()).append(LINE_SEPARATOR); + + appendThrowableInfo(event, sb); + return sb.toString().getBytes(StandardCharsets.UTF_8); + } + + private void appendThrowableInfo(LoggingEvent event, StringBuilder sb) { + Throwable throwable = event.getThrowable(); + if (null != throwable) { + sb.append(throwable); + StackTraceElement[] stack = throwable.getStackTrace(); + for (StackTraceElement element : stack) { + sb.append(TAB).append(element).append(LINE_SEPARATOR); + } + } + } +} -- Gitee From 3e015516bd95097bf4ee048cb29a2bda574efc63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=BE=E6=88=90=E7=BF=94?= Date: Tue, 7 Dec 2021 11:31:22 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/drinkjava2/frog/logger/Logger.java | 4 ++-- .../com/gitee/drinkjava2/frog/logger/PrintLogService.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java index 4100e82..75b90ff 100644 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java @@ -39,8 +39,8 @@ public final class Logger { LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, msg, argArray)); } - public static void error(Object... argArray) { - LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, "", argArray)); + public static void error(Object argArray) { + LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, "", new Object[]{argArray})); } private static LoggingEvent getLoggingEvent(LevelEnum level, String message, Object[] argumentArray) { diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java index 834f031..13947aa 100644 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java +++ b/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java @@ -58,7 +58,7 @@ public class PrintLogService extends Thread { private void appendThrowableInfo(LoggingEvent event, StringBuilder sb) { Throwable throwable = event.getThrowable(); if (null != throwable) { - sb.append(throwable); + sb.append(throwable).append(LINE_SEPARATOR); StackTraceElement[] stack = throwable.getStackTrace(); for (StackTraceElement element : stack) { sb.append(TAB).append(element).append(LINE_SEPARATOR); -- Gitee From f8892e1dc7714f5eddc0c600c32658d2f71c976a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=BE=E6=88=90=E7=BF=94?= Date: Tue, 7 Dec 2021 19:02:45 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=95=B4=E5=90=88,?= =?UTF-8?q?=E7=BC=A9=E5=87=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/drinkjava2/frog/Env.java | 2 +- .../drinkjava2/frog/egg/FrogEggTool.java | 2 +- .../drinkjava2/frog/logger/LevelEnum.java | 45 ----- .../gitee/drinkjava2/frog/logger/Logger.java | 49 ----- .../drinkjava2/frog/logger/LoggerCenter.java | 56 ------ .../drinkjava2/frog/logger/LoggingEvent.java | 110 ----------- .../frog/logger/MessageFormatter.java | 79 -------- .../frog/logger/PrintLogService.java | 68 ------- .../gitee/drinkjava2/frog/util/Logger.java | 174 ++++++++++++++++++ 9 files changed, 176 insertions(+), 409 deletions(-) delete mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java delete mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java delete mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java delete mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java delete mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java delete mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java create mode 100644 core/src/main/java/com/gitee/drinkjava2/frog/util/Logger.java diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/Env.java b/core/src/main/java/com/gitee/drinkjava2/frog/Env.java index abb3480..d71cbce 100644 --- a/core/src/main/java/com/gitee/drinkjava2/frog/Env.java +++ b/core/src/main/java/com/gitee/drinkjava2/frog/Env.java @@ -11,10 +11,10 @@ import javax.swing.JPanel; import com.gitee.drinkjava2.frog.egg.Egg; import com.gitee.drinkjava2.frog.egg.FrogEggTool; -import com.gitee.drinkjava2.frog.logger.Logger; import com.gitee.drinkjava2.frog.objects.EnvObject; import com.gitee.drinkjava2.frog.objects.Food; import com.gitee.drinkjava2.frog.objects.Material; +import com.gitee.drinkjava2.frog.util.Logger; import com.gitee.drinkjava2.frog.util.RandomUtils; /** diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java b/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java index 5ae47c2..16ce8ab 100644 --- a/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java +++ b/core/src/main/java/com/gitee/drinkjava2/frog/egg/FrogEggTool.java @@ -23,8 +23,8 @@ import com.gitee.drinkjava2.frog.Animal; import com.gitee.drinkjava2.frog.Application; import com.gitee.drinkjava2.frog.Env; import com.gitee.drinkjava2.frog.Frog; -import com.gitee.drinkjava2.frog.logger.Logger; import com.gitee.drinkjava2.frog.util.LocalFileUtils; +import com.gitee.drinkjava2.frog.util.Logger; /** * FrogEggTool save/load frog eggs to file diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java deleted file mode 100644 index 0bff962..0000000 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LevelEnum.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gitee.drinkjava2.frog.logger; - -/** - * @Description: 日志等级枚举 - * @Author: Luancx - * @Date: 2021/12/06 - * @Version: 1.0.0 - */ -public enum LevelEnum { - /** - * 日志等级 - */ - DEBUG(1, "DEBUG"), - INFO(2, "INFO"), - WARN(3, "WARN"), - ERROR(4, "ERROR"); - - private final int levelInt; - private final String levelStr; - - public static int getEnumInt(String levelStr) { - LevelEnum[] levelEnums = values(); - for (LevelEnum level : levelEnums) { - if (level.levelStr.equals(levelStr)) { - return level.getLevelInt(); - } - } - throw new IllegalStateException("Level " + levelStr + " is unknown."); - } - - - LevelEnum(int levelInt, String levelStr) { - this.levelInt = levelInt; - this.levelStr = levelStr; - } - - public int getLevelInt() { - return levelInt; - } - - public String getLevelStr() { - return levelStr; - } - -} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java deleted file mode 100644 index 75b90ff..0000000 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/Logger.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gitee.drinkjava2.frog.logger; - -/** - * @Description: 日志工厂类 - * @Author: Luancx - * @Date: 2021/12/02 - * @Version: 1.0.0 - */ -public final class Logger { - public static void debug(String msg) { - LoggerCenter.add(getLoggingEvent(LevelEnum.DEBUG, msg, null)); - } - - public static void debug(String msg, Object... argArray) { - LoggerCenter.add(getLoggingEvent(LevelEnum.DEBUG, msg, argArray)); - } - - public static void info(String msg) { - LoggerCenter.add(getLoggingEvent(LevelEnum.INFO, msg, null)); - } - - public static void info(String msg, Object... argArray) { - LoggerCenter.add(getLoggingEvent(LevelEnum.INFO, msg, argArray)); - } - - public static void warn(String msg) { - LoggerCenter.add(getLoggingEvent(LevelEnum.WARN, msg, null)); - } - - public static void warn(String msg, Object... argArray) { - LoggerCenter.add(getLoggingEvent(LevelEnum.WARN, msg, argArray)); - } - - public static void error(String msg) { - LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, msg, null)); - } - - public static void error(String msg, Object... argArray) { - LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, msg, argArray)); - } - - public static void error(Object argArray) { - LoggerCenter.add(getLoggingEvent(LevelEnum.ERROR, "", new Object[]{argArray})); - } - - private static LoggingEvent getLoggingEvent(LevelEnum level, String message, Object[] argumentArray) { - return new LoggingEvent(level, message, argumentArray); - } -} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java deleted file mode 100644 index 65267da..0000000 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggerCenter.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.gitee.drinkjava2.frog.logger; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -/** - * @Description: 日志处理中心 - * @Author: Luancx - * @Date: 2021/12/03 - * @Version: 1.0.0 - */ -public class LoggerCenter { - //***************** 按需修改 ********************* - /** - * 日志等级 - */ - private static final String LEV_EL = "info"; - /** - * 控制台日志输出 - */ - protected static final boolean CONSOLE = true; - /** - * 文件日志输出 - */ - protected static final boolean FILE = false; - /** - * 日志文件路径 - */ - private static final String FILE_PATH = ""; - - //***************** 请勿修改 ********************* - - private static final int LEVEL_INT; - /** - * 日志消息队列 - */ - protected static final BlockingQueue LOG_LIST = new ArrayBlockingQueue<>(1024); - - static { - new PrintLogService().start(); - LEVEL_INT = LevelEnum.getEnumInt(LEV_EL.toUpperCase()); - } - - /** - * 添加到待打印List中 - */ - public static void add(LoggingEvent loggingEvent) { - if (loggingEvent.getLevel().getLevelInt() >= LEVEL_INT) { - try { - LOG_LIST.put(loggingEvent); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } -} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java deleted file mode 100644 index f6cc6f0..0000000 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/LoggingEvent.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.gitee.drinkjava2.frog.logger; - -import sun.misc.JavaLangAccess; -import sun.misc.SharedSecrets; - -import java.io.Serializable; - -/** - * @Description: 日志实体类 - * @Author: Luancx - * @Date: 2021/12/03 - * @Version: 1.0.0 - */ -public final class LoggingEvent implements Serializable { - /** - * 类名 - */ - private final String className; - /** - * 方法名 - */ - private final String methodName; - /** - * 行数 - */ - private final int lineNumber; - /** - * 日志等级 - */ - private final LevelEnum level; - /** - * 时间 - */ - private final long timeStamp; - /** - * 原始消息 - */ - private final String message; - /** - * 格式化后数据 - */ - private String formattedMessage; - /** - * 消息参数 - */ - private final Object[] argumentArray; - /** - * 异常信息 - */ - private Throwable throwable; - - public LoggingEvent(LevelEnum level, String message, Object[] argumentArray) { - JavaLangAccess access = SharedSecrets.getJavaLangAccess(); - Throwable throwable = new Throwable(); - StackTraceElement stack = access.getStackTraceElement(throwable, 3); - - this.className = stack.getClassName(); - this.methodName = stack.getMethodName(); - this.lineNumber = stack.getLineNumber(); - this.level = level; - this.message = message; - - //异常数据 - Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(argumentArray); - Object[] args = argumentArray; - if (throwableCandidate != null) { - //剔除异常参数 - args = MessageFormatter.trimmedCopy(argumentArray); - this.throwable = throwableCandidate; - } - this.argumentArray = args; - this.timeStamp = System.currentTimeMillis(); - } - - public String getClassName() { - return className; - } - - public String getMethodName() { - return methodName; - } - - public int getLineNumber() { - return lineNumber; - } - - public LevelEnum getLevel() { - return level; - } - - public long getTimeStamp() { - return timeStamp; - } - - public String getFormattedMessage() { - if (formattedMessage != null) { - return formattedMessage; - } - if (argumentArray != null) { - formattedMessage = MessageFormatter.messageFormat(message, argumentArray); - } else { - formattedMessage = message; - } - return formattedMessage; - } - - public Throwable getThrowable() { - return throwable; - } -} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java deleted file mode 100644 index 5ddcde2..0000000 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/MessageFormatter.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.gitee.drinkjava2.frog.logger; - -import java.text.SimpleDateFormat; - -/** - * @Description: 日志格式化类 - * @Author: Luancx - * @Date: 2021/12/06 - * @Version: 1.0.0 - */ -public final class MessageFormatter { - public static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); - private static final String DELIM_STR = "{}"; - private static final char ESCAPE_CHAR = '\\'; - - /** - * 格式胡日志 - * - * @param message 元数据 - * @param params 参数 - * @return 格式化后数据 - */ - public static String messageFormat(final String message, final Object[] params) { - if (message == null) { - return null; - } - if (params == null || params.length == 0) { - return message; - } - - return arrayFormat(message, params); - } - - /** - * 替换日志中的占位符 {} - * - * @param message 元数据 - * @param args 参数 - * @return 格式化后数据 - */ - private static String arrayFormat(final String message, final Object[] args) { - StringBuilder sb = new StringBuilder(); - - int s; - int i = 0; - for (Object o : args) { - s = message.indexOf(DELIM_STR, i); - if (s == -1) { - return i == 0 ? message : sb.append(message, i, message.length()).toString(); - } else { - sb.append(message, i, s); - sb.append(o); - i = s + 2; - } - } - return sb.toString(); - } - - public static Throwable getThrowableCandidate(final Object[] argArray) { - if (argArray == null || argArray.length == 0) { - return null; - } - final Object lastEntry = argArray[argArray.length - 1]; - if (lastEntry instanceof Throwable) { - return (Throwable) lastEntry; - } - return null; - } - - public static Object[] trimmedCopy(final Object[] argArray) { - final int trimmedLen = argArray.length - 1; - Object[] trimmed = new Object[trimmedLen]; - - if (trimmedLen > 0) { - System.arraycopy(argArray, 0, trimmed, 0, trimmedLen); - } - return trimmed; - } -} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java b/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java deleted file mode 100644 index 13947aa..0000000 --- a/core/src/main/java/com/gitee/drinkjava2/frog/logger/PrintLogService.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.gitee.drinkjava2.frog.logger; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; - -/** - * @Description: 日志输出类 - * @Author: Luancx - * @Date: 2021/12/06 - * @Version: 1.0.0 - */ -public class PrintLogService extends Thread { - private static final OutputStream OUTPUT_STREAM = System.out; - private static final String LINE_SEPARATOR = System.getProperty("line.separator"); - private static final String BLANK = " "; - private static final String TAB = "\tat"; - - @Override - public void run() { - while (true) { - try { - LoggingEvent event = LoggerCenter.LOG_LIST.take(); - if (LoggerCenter.CONSOLE) { - outPutConsole(event); - } - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } - } - - private void outPutConsole(LoggingEvent event) { - try { - OUTPUT_STREAM.write(recursiveAppend(event)); - OUTPUT_STREAM.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * 日志和异常信息组装 - */ - private byte[] recursiveAppend(LoggingEvent event) throws IOException { - StringBuilder sb = new StringBuilder(); - - sb.append(MessageFormatter.FORMAT.format(event.getTimeStamp())).append(BLANK); - sb.append("[").append(event.getLevel().getLevelStr()).append("][").append(event.getClassName()).append(BLANK); - sb.append(event.getLineNumber()).append("][").append(event.getMethodName()).append("] "); - sb.append("- ").append(event.getFormattedMessage()).append(LINE_SEPARATOR); - - appendThrowableInfo(event, sb); - return sb.toString().getBytes(StandardCharsets.UTF_8); - } - - private void appendThrowableInfo(LoggingEvent event, StringBuilder sb) { - Throwable throwable = event.getThrowable(); - if (null != throwable) { - sb.append(throwable).append(LINE_SEPARATOR); - StackTraceElement[] stack = throwable.getStackTrace(); - for (StackTraceElement element : stack) { - sb.append(TAB).append(element).append(LINE_SEPARATOR); - } - } - } -} diff --git a/core/src/main/java/com/gitee/drinkjava2/frog/util/Logger.java b/core/src/main/java/com/gitee/drinkjava2/frog/util/Logger.java new file mode 100644 index 0000000..b38a875 --- /dev/null +++ b/core/src/main/java/com/gitee/drinkjava2/frog/util/Logger.java @@ -0,0 +1,174 @@ +package com.gitee.drinkjava2.frog.util; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +/** + * @Description: 简版控制台日志打印 + * @Date: 2021/12/07 + */ +public class Logger { + private static final String LEV_EL = "debug"; + private static final int LEVEL_INT; + private static final BlockingQueue LOG_LIST = new ArrayBlockingQueue<>(256); + private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); + private static final OutputStream OUTPUT_STREAM = System.out; + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); + private static final String DELIM_STR = "{}"; + private static final String TAB = "\tat"; + private static final Map LEVEL_MAP = new HashMap<>(); + + static { + LEVEL_MAP.put("DEBUG", 1); + LEVEL_MAP.put("INFO", 2); + LEVEL_MAP.put("WARN", 2); + LEVEL_MAP.put("ERROR", 2); + LEVEL_INT = LEVEL_MAP.get(LEV_EL.toUpperCase()); + new Thread(() -> { + while (true) { + try { + outPutConsole(LOG_LIST.take()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }).start(); + } + + public static void debug(String msg) { + printLog(LEVEL_MAP.get("DEBUG"), msg); + } + + public static void debug(String msg, Object params) { + printLog(LEVEL_MAP.get("DEBUG"), msg, params); + } + + public static void debug(String msg, Object... params) { + printLog(LEVEL_MAP.get("DEBUG"), msg, params); + } + + public static void info(String msg) { + printLog(LEVEL_MAP.get("INFO"), msg); + } + + public static void info(String msg, Object params) { + printLog(LEVEL_MAP.get("INFO"), msg, params); + } + + public static void info(String msg, Object... params) { + printLog(LEVEL_MAP.get("INFO"), msg, params); + } + + public static void warn(String msg) { + printLog(LEVEL_MAP.get("WARN"), msg); + } + + public static void warn(String msg, Object params) { + printLog(LEVEL_MAP.get("WARN"), msg, params); + } + + public static void warn(String msg, Object... params) { + printLog(LEVEL_MAP.get("WARN"), msg, params); + } + + public static void error(String msg) { + printLog(LEVEL_MAP.get("ERROR"), msg); + } + + public static void error(String msg, Object params) { + printLog(LEVEL_MAP.get("ERROR"), msg, params); + } + + public static void error(String msg, Object... params) { + printLog(LEVEL_MAP.get("ERROR"), msg, params); + } + + public static void error(Object param) { + printLog(LEVEL_MAP.get("ERROR"), "", param); + } + + private static void printLog(int levelInt, String msg, Object... params) { + try { + if (levelInt >= LEVEL_INT) { + LOG_LIST.put(generateMsg(getLevelStr(levelInt), msg, params)); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private static String generateMsg(String levelStr, String msg, Object... params) { + StackTraceElement stack = Thread.currentThread().getStackTrace()[4]; + String s = "{} [{}][{}#{} {}] - " + msg + LINE_SEPARATOR; + Object[] args = new Object[5 + params.length]; + args[0] = FORMAT.format(System.currentTimeMillis()); + args[1] = levelStr; + args[2] = stack.getClassName(); + args[3] = stack.getMethodName(); + args[4] = stack.getLineNumber(); + + Throwable throwable = null; + if (params.length > 0) { + final Object lastEntry = params[params.length - 1]; + if (lastEntry instanceof Throwable) { + throwable = (Throwable) lastEntry; + System.arraycopy(params, 0, args, 5, params.length - 1); + } else { + System.arraycopy(params, 0, args, 5, params.length); + } + } + return formatMsg(s, throwable, args); + } + + private static String formatMsg(String msg, Throwable throwable, Object... params) { + StringBuilder sb = new StringBuilder(); + int s; + int i = 0; + for (Object o : params) { + s = msg.indexOf(DELIM_STR, i); + if (s > -1) { + sb.append(msg, i, s).append(o); + i = s + 2; + } + } + sb.append(msg, i, msg.length()); + if (null != throwable) { + sb.append(throwable).append(LINE_SEPARATOR); + StackTraceElement[] stack = throwable.getStackTrace(); + for (StackTraceElement element : stack) { + sb.append(TAB).append(element).append(LINE_SEPARATOR); + } + } + return sb.toString(); + } + + private static void outPutConsole(String msg) { + try { + OUTPUT_STREAM.write(msg.getBytes(StandardCharsets.UTF_8)); + OUTPUT_STREAM.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static String getLevelStr(int levelInt) { + switch (levelInt) { + case 1: + return "DEBUG"; + case 2: + return "INFO"; + case 3: + return "WARN"; + case 4: + return "ERROR"; + default: + throw new IllegalStateException("Level " + levelInt + " is unknown."); + } + } +} -- Gitee