Bläddra i källkod

定义日志解析接口

Miaomz 4 år sedan
förälder
incheckning
07361d968a

+ 5 - 1
pom.xml

@@ -25,7 +25,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.30</version>
+        </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>

+ 33 - 0
src/main/java/com/seecoder/dataanalysis/logic/parser/LogParsingService.java

@@ -0,0 +1,33 @@
+package com.seecoder.dataanalysis.logic.parser;
+
+import com.seecoder.dataanalysis.vo.SimpleLog;
+
+/**
+ * @author miaomuzhi
+ * @since 2022/1/30
+ */
+public interface LogParsingService {
+
+    /**
+     * 解析json格式的日志
+     * @param log json格式的日志
+     * @return SimpleLog,包含日志的元数据以及json格式的日志data
+     */
+    SimpleLog parseLog(String log);
+
+    /**
+     * 基于日志元数据(opType),解析日志的data,并返回对应实体。如果不使用范型,则返回Object类型
+     * @param simpleLog 日志
+     * @param save 是否持久化保存
+     * @return 日志操作类型对应的数据实体
+     */
+    <T> T parseLogData(SimpleLog simpleLog, boolean save);
+
+    /**
+     * 基于日志元数据,返回对应的持久化实体entity的类名
+     * @param opType 操作类型
+     * @return entity的classname
+     */
+    String parseOpType(int opType);
+
+}

+ 47 - 0
src/main/java/com/seecoder/dataanalysis/logic/parser/impl/LogParsingServiceImpl.java

@@ -0,0 +1,47 @@
+package com.seecoder.dataanalysis.logic.parser.impl;
+
+import com.alibaba.fastjson.JSONException;
+import com.seecoder.dataanalysis.logic.parser.LogParsingService;
+import com.seecoder.dataanalysis.util.JsonUtil;
+import com.seecoder.dataanalysis.vo.SimpleLog;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author miaomuzhi
+ * @since 2022/1/30
+ */
+@Service
+public class LogParsingServiceImpl implements LogParsingService {
+
+    /**
+     * 根据日志元数据操作类型(op_type)查找对应的类名
+     */
+    private Map<Integer, String> opTypesTable;
+
+    @Override
+    public SimpleLog parseLog(String log) {
+        try {
+            return JsonUtil.toObject(log, SimpleLog.class);
+        } catch (JSONException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public <T> T parseLogData(SimpleLog simpleLog, boolean save) {
+        return null;
+    }
+
+    @Override
+    public String parseOpType(int opType) {
+        return null;
+    }
+
+
+    private void buildOpTypesTable(){
+
+    }
+}

+ 51 - 0
src/main/java/com/seecoder/dataanalysis/util/FileUtil.java

@@ -0,0 +1,51 @@
+package com.seecoder.dataanalysis.util;
+
+import java.io.*;
+
+/**
+ * @author miaomuzhi
+ * @since 2022/1/30
+ */
+public class FileUtil {
+    private FileUtil() {}
+
+
+    public static boolean writeFile(String path, String content) {
+        File file = new File(path);
+        if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {//if parent file doesn't exist and fail to make dir
+            return false;
+        }
+
+        try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file))) {
+            if (!file.exists() && !file.createNewFile()) {//if file doesn't exist and program fails to create file
+                throw new IOException("fail to create file");
+            }
+            bufferedWriter.write(content);
+            bufferedWriter.flush();
+            return true;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    public static String readFile(String path) {
+        File file = new File(path);
+        StringBuilder content = new StringBuilder();
+        try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
+            String line;
+            while ((line = bufferedReader.readLine()) != null)
+            {
+                content.append(line).append(System.lineSeparator());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return new String(content);
+    }
+
+    public static boolean createDirectoryIfAbsent(String path) {
+        File file = new File(path);
+        return file.exists() || file.mkdirs();
+    }
+}

+ 36 - 0
src/main/java/com/seecoder/dataanalysis/util/JsonUtil.java

@@ -0,0 +1,36 @@
+package com.seecoder.dataanalysis.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+
+import java.util.List;
+
+/**
+ * @author miaomuzhi
+ * @since 2022/1/30
+ */
+public class JsonUtil {
+    private JsonUtil() {}
+
+    /**
+     * @param object Java对象
+     * @return Json格式字符串
+     */
+    public static String toJson(Object object) {
+        return JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
+    }
+
+    /**
+     * @param jsonString Json格式字符串
+     * @param tClass     Java对象的class,请传递引用的真正类型
+     * @param <T> 范型
+     * @return Java对象
+     */
+    public static <T> T toObject(String jsonString, Class<T> tClass) {
+        return JSON.parseObject(jsonString, tClass);
+    }
+
+    public static <T> List<T> toList(String jsonString, Class<T> tClass){
+        return JSON.parseArray(jsonString, tClass);
+    }
+}

+ 53 - 0
src/main/java/com/seecoder/dataanalysis/vo/SimpleLog.java

@@ -0,0 +1,53 @@
+package com.seecoder.dataanalysis.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author miaomuzhi
+ * @since 2022/1/30
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SimpleLog {
+    /**
+     * 接受日志的系统,比如smart定为1
+     */
+    @JSONField(name="target")
+    private int target;
+
+    /**
+     * 打印日志的系统,比如eval定为0
+     */
+    @JSONField(name="source")
+    private int source;
+
+    /**
+     * 日志操作类型
+     */
+    @JSONField(name="op_type")
+    private int opType;
+
+    /**
+     * 日志创建时间
+     */
+    @JSONField(name="created_time")
+    private LocalDateTime createdTime;
+
+    /**
+     * json格式的数据
+     */
+    @JSONField(name="data")
+    private String data;
+
+    /**
+     * 额外信息(备用)
+     */
+    @JSONField(name="message")
+    private String message;
+}