2 Commits 02bd9fa0b0 ... b5f0b69a87

Tác giả SHA1 Thông báo Ngày
  魏志亮 b5f0b69a87 中广核104日志修改 2 tháng trước cách đây
  魏志亮 a51e61b497 添加中广核104数据获取 3 tháng trước cách đây

+ 4 - 60
pom.xml

@@ -104,75 +104,19 @@
     </dependencies>
 
     <build>
-        <finalName>${project.artifactId}</finalName>
-        <resources>
-            <resource>
-                <directory>src/main/resources/</directory>
-                <filtering>true</filtering>
-                <includes>
-                    <include>**/*.properties</include>
-                </includes>
-            </resource>
-            <resource>
-                <directory>src/main/resources/</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
         <plugins>
-            <!-- Compiler 插件, 设定JDK版本 -->
             <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.1</version>
-                <configuration>
-                    <source>${java.version}</source>
-                    <target>${java.version}</target>
-                    <encoding>${project.build.sourceEncoding}</encoding>
-                    <showWarnings>true</showWarnings>
-                </configuration>
-            </plugin>
-
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-resources-plugin</artifactId>
-                <version>2.6</version>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>3.5.0</version>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.0.1.RELEASE</version>
                 <executions>
                     <execution>
-                        <phase>package</phase>
                         <goals>
-                            <goal>shade</goal>
+                            <goal>repackage</goal>
                         </goals>
-                        <configuration>
-                            <transformers>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <!-- 如果有主类需要指定 -->
-                                    <mainClass>com.energy.online.data.OnlineDataMain</mainClass>
-                                </transformer>
-                            </transformers>
-                            <createDependencyReducedPom>false</createDependencyReducedPom>
-                            <filters>
-                                <filter>
-                                    <artifact>*:*</artifact>
-                                    <excludes>
-                                        <exclude>META-INF/*.SF</exclude>
-                                        <exclude>META-INF/*.DSA</exclude>
-                                        <exclude>META-INF/*.RSA</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                        </configuration>
                     </execution>
                 </executions>
             </plugin>
-
         </plugins>
     </build>
 

+ 15 - 24
src/main/java/com/energy/online/data/OnlineDataMain.java

@@ -2,16 +2,13 @@ package com.energy.online.data;
 
 // 新增Spring Boot相关导入
 
-import com.alibaba.fastjson2.JSON;
 import com.energy.online.data.dto.BaseConfig;
 import com.energy.online.data.dto.Line;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import wei.yigulu.iec104.apdumodel.Apdu;
 import wei.yigulu.iec104.apdumodel.Asdu;
 import wei.yigulu.iec104.asdudataframe.PulseTotalSummonType;
@@ -19,7 +16,6 @@ import wei.yigulu.iec104.nettyconfig.Iec104MasterBuilder;
 import wei.yigulu.iec104.util.SendDataFrameHelper;
 
 import javax.annotation.PostConstruct;
-import java.util.List;
 
 @SpringBootApplication
 @EnableAsync
@@ -29,33 +25,28 @@ public class OnlineDataMain {
     @Autowired
     private BaseConfig baseConfig;
 
-    @Qualifier("taskExecutor")
-    @Autowired
-    private ThreadPoolTaskExecutor taskExecutor;
-
     @PostConstruct
     public void init() {
-        List<Line> lines = baseConfig.getLines();
-        for (Line line : lines) {
-            taskExecutor.execute(() -> runDeviceConnection(line));
-        }
+        Line line = baseConfig.getLine();
+        runDeviceConnection(line);
     }
 
+    public static Iec104MasterBuilder master;
+
     private void runDeviceConnection(Line line) {
         try {
-            Iec104MasterBuilder master = new Iec104MasterBuilder(line.getIp(), line.getPort());
+            master = new Iec104MasterBuilder(line.getIp(), line.getPort());
             master.createByUnBlock();
-
-            while (!Thread.currentThread().isInterrupted()) {
-                System.out.println(JSON.toJSONString(line));
-                Thread.sleep(3000L);
-                SendDataFrameHelper.sendTotalSummonFrame(master.getFuture().channel(), 10, 6, master.getLog());
-                PulseTotalSummonType pulseTotalSummonType = new PulseTotalSummonType();
-                Asdu asdu = pulseTotalSummonType.generateBack();
-                Apdu apdu = new Apdu();
-                apdu.setAsdu(asdu);
-                master.sendFrameToOpposite(apdu.encode());
-            }
+            System.out.println("++++++++++++++++++++++++++++++++");
+            Thread.sleep(3000L);
+            SendDataFrameHelper.sendTotalSummonFrame(master.getFuture().channel(), line.getCoa(), 6, master.getLog());
+            Thread.sleep(5000L);
+            System.out.println("---------------------------------------");
+            PulseTotalSummonType pulseTotalSummonType = new PulseTotalSummonType();
+            Asdu asdu = pulseTotalSummonType.generateBack();
+            Apdu apdu = new Apdu();
+            apdu.setAsdu(asdu);
+            master.sendFrameToOpposite(apdu.encode());
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 35 - 7
src/main/java/com/energy/online/data/common/CommonData.java

@@ -7,13 +7,14 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
 public class CommonData {
 
-    public static final Map<String, Object> map = new TreeMap<>();
+    public static final Map<Integer, Object> map = new ConcurrentHashMap<>();
 
-    public static final List<Map<String, Object>> list = new ArrayList<>();
+    public static final List<Map<Integer, Object>> list = new ArrayList<>();
 
     public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
@@ -21,18 +22,45 @@ public class CommonData {
         // -1 表示时间
 //        log.info("数据长度(包含时间):" + map.size());
         if (!map.isEmpty()) {
-            map.put("-1", sdf.format(System.currentTimeMillis()));
+            String nowTime = sdf.format(System.currentTimeMillis());
+            map.put(0, nowTime);
             list.add(new TreeMap<>(map));
         }
     }
 
-    public static void put(String key, Object value) {
+    public static void put(Integer key, Object value) {
         map.put(key, value);
     }
 
-    public static List<Map<String, Object>> getListAndClean() {
-        List<Map<String, Object>> nowList = new ArrayList<>(list);
-        list.clear();
+    public static List<Map<Integer, Object>> getListAndClean() {
+        int index = list.size() - 1;
+        for (int i = list.size() - 1; i >= 0; i--) {
+            if (String.valueOf(list.get(i).get(0)).endsWith("9:50") || String.valueOf(list.get(i).get(0)).endsWith("9:59")) {
+                index = i;
+                break;
+            }
+        }
+
+        List<Map<Integer, Object>> nowList = new ArrayList<>(list.subList(0, index + 1));
+        list.subList(0, index + 1).clear();
         return nowList;
     }
+
+    public static void main(String[] args) throws InterruptedException {
+        put(1, 2);
+        for (int j = 0; j < 3; j++) {
+            for (int i = 0; i < 60; i++) {
+                addList();
+                Thread.sleep(1000);
+            }
+            for (Map<Integer, Object> entry : getListAndClean()) {
+                System.out.println(entry);
+            }
+            System.out.println("----------------------------------");
+            for (Map<Integer, Object> entry : list) {
+                System.out.println(entry);
+            }
+            System.out.println("**************************************");
+        }
+    }
 }

+ 0 - 1
src/main/java/com/energy/online/data/config/AppConfig.java

@@ -24,5 +24,4 @@ public class AppConfig {
         executor.setQueueCapacity(500);
         return executor;
     }
-
 }

+ 48 - 11
src/main/java/com/energy/online/data/crontab/TimeSaveScheduled.java

@@ -1,18 +1,27 @@
 package com.energy.online.data.crontab;
 
-import com.alibaba.fastjson2.JSON;
+import com.energy.online.data.OnlineDataMain;
 import com.energy.online.data.common.CommonData;
 import com.energy.online.data.dto.BaseConfig;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import wei.yigulu.iec104.util.SendDataFrameHelper;
 
-import java.io.PrintWriter;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Component
+@Slf4j
 public class TimeSaveScheduled {
 
     private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
@@ -21,23 +30,51 @@ public class TimeSaveScheduled {
     private BaseConfig baseConfig;
 
     //    @Scheduled(cron = "0/1 * * * * *")
-    @Scheduled(fixedRate = 1000)
+    @Scheduled(cron = "${my.scheduled.cron}")
     public void collectData() {
         CommonData.addList();
     }
 
-    @Scheduled(cron = "0 0/1 * * * *")
+    @Scheduled(cron = "0 0/2 * * * *")
+    public void sendTotal() throws Exception {
+        log.info(baseConfig.getLine().getPort() + "发送总召");
+        SendDataFrameHelper.sendTotalSummonFrame(OnlineDataMain.master.getFuture().channel(), baseConfig.getLine().getCoa(), 6, OnlineDataMain.master.getLog());
+    }
+
+
+    @SneakyThrows
+    @Scheduled(cron = "0 0/10 * * * *")
     public void saveToFile() {
-        List<Map<String, Object>> datas = CommonData.getListAndClean();
+        List<Map<Integer, Object>> datas = CommonData.getListAndClean();
         if (!datas.isEmpty()) {
             String timestamp = sdf.format(System.currentTimeMillis());
-            String fileName = baseConfig.getSaveDir() + timestamp + ".json";
-            try (PrintWriter writer = new PrintWriter(fileName)) {
-                writer.write(JSON.toJSONString(datas));
-                writer.flush();
-            } catch (Exception e) {
-                e.printStackTrace();
+            String filePath = baseConfig.getSaveDir() + timestamp + ".csv";
+            File folder = new File(baseConfig.getSaveDir());
+
+            if (!folder.exists()) {
+                folder.mkdirs(); // 使用mkdirs()可以创建多级目录
+            }
+
+            try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(filePath))) {
+                datas.forEach(map -> {
+                    try {
+                        writer.write(
+                                map.values().stream()
+                                        .map(Object::toString)
+                                        .collect(Collectors.joining(","))
+                        );
+                        writer.newLine();
+                    } catch (IOException e) {
+                        throw new RuntimeException(e);
+                    }
+                });
             }
         }
     }
+
+    @Scheduled(cron = "0 0/2 * * * *")
+    public void printMapCoount() {
+        log.info(baseConfig.getLine().getPort() + ",当前数据大小:" + CommonData.map.size());
+    }
+
 }

+ 12 - 1
src/main/java/com/energy/online/data/dto/BaseConfig.java

@@ -2,15 +2,26 @@ package com.energy.online.data.dto;
 
 import lombok.Data;
 
+import java.nio.file.Paths;
 import java.util.List;
 
 @Data
 public class BaseConfig {
 
-    private List<Line> lines;
+    private Line line;
 
     private String saveDir;
 
+    public String getSaveDir() {
+        if (saveDir == null) {
+            this.saveDir = System.getProperty("user.dir") + "/data/";
+        }
+        if (saveDir.endsWith("/")) {
+            saveDir = saveDir + "/";
+        }
+
+        return saveDir;
+    }
 }
 
 

+ 48 - 0
src/main/java/com/energy/online/data/handle/HandelNormalizedIntegerWithTimeType.java

@@ -0,0 +1,48 @@
+package com.energy.online.data.handle;
+
+import com.energy.online.data.common.CommonData;
+import lombok.extern.slf4j.Slf4j;
+import wei.yigulu.iec104.annotation.AsduType;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.asdudataframe.NormalizedIntegerWithTimeType;
+import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@AsduType(typeId = 34)
+public class HandelNormalizedIntegerWithTimeType extends NormalizedIntegerWithTimeType {
+
+    /**
+     * 处理短整型数据
+     *
+     * @param apdu
+     * @return
+     */
+    @Override
+    public byte[][] handleAndAnswer(Apdu apdu) {
+        log.debug("----------处理NormalizedIntegerWithTimeType型数据---------");
+        HandleShortInteger handleShortFloat = (HandleShortInteger) apdu.getAsdu().getDataFrame();
+        List<InformationBodyAddress> address = handleShortFloat.getAddresses();
+        Map<IeMeasuredQuality, Integer> datas = handleShortFloat.getDatas();
+        int i = 0;
+        //存入共享服务端
+        if (apdu.getAsdu().getVsq().getSq() == 0) {
+            log.debug("------处理NormalizedIntegerWithTimeTypee型单一寻址-----");
+            for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
+                CommonData.put(address.get(i++).getAddress(), e.getValue());
+            }
+        } else if (apdu.getAsdu().getVsq().getSq() == 1) {
+            log.debug("------处理NormalizedIntegerWithTimeType型连续寻址-----");
+            i = address.get(0).getAddress();
+            for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
+                CommonData.put(i++, e.getValue());
+            }
+        }
+
+        //如果有需要返回数据帧可以创建byte数据  向内置入要返回的数据帧encode()后的数组
+        return null;
+    }
+}

+ 49 - 0
src/main/java/com/energy/online/data/handle/HandleNormalizedIntegerType.java

@@ -0,0 +1,49 @@
+package com.energy.online.data.handle;
+
+import com.energy.online.data.common.CommonData;
+import lombok.extern.slf4j.Slf4j;
+import wei.yigulu.iec104.annotation.AsduType;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.asdudataframe.NormalizedIntegerType;
+import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@AsduType(typeId = 9)
+public class HandleNormalizedIntegerType extends NormalizedIntegerType {
+
+    /**
+     * 处理短整型数据
+     *
+     * @param apdu
+     * @return
+     */
+    @Override
+    public byte[][] handleAndAnswer(Apdu apdu) {
+        log.debug("----------处理NormalizedIntegerType型数据---------");
+        HandleShortInteger handleShortFloat = (HandleShortInteger) apdu.getAsdu().getDataFrame();
+        List<InformationBodyAddress> address = handleShortFloat.getAddresses();
+        Map<IeMeasuredQuality, Integer> datas = handleShortFloat.getDatas();
+        int i = 0;
+        //存入共享服务端
+//        log.info("获取到数据{}个", address.size());
+        if (apdu.getAsdu().getVsq().getSq() == 0) {
+            log.debug("------处理NormalizedIntegerType型单一寻址-----");
+            for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
+                CommonData.put(address.get(i++).getAddress(), e.getValue());
+            }
+        } else if (apdu.getAsdu().getVsq().getSq() == 1) {
+            log.debug("------处理NormalizedIntegerType型连续寻址-----");
+            i = address.get(0).getAddress();
+            for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
+                CommonData.put(i++, e.getValue());
+            }
+        }
+
+        //如果有需要返回数据帧可以创建byte数据  向内置入要返回的数据帧encode()后的数组
+        return null;
+    }
+}

+ 4 - 2
src/main/java/com/energy/online/data/handle/HandleShortFloat.java

@@ -27,18 +27,20 @@ public class HandleShortFloat extends ShortFloatType {
         HandleShortFloat handleShortFloat = (HandleShortFloat) apdu.getAsdu().getDataFrame();
         List<InformationBodyAddress> address = handleShortFloat.getAddresses();
         Map<IeMeasuredQuality, Float> datas = handleShortFloat.getDatas();
+//        log.info(JSON.toJSONString(address));
+//        log.info(JSON.toJSONString(datas));
         int i = 0;
         //存入共享服务端
         if (apdu.getAsdu().getVsq().getSq() == 0) {
             log.debug("------处理短浮点单一寻址-----");
             for (Map.Entry<IeMeasuredQuality, Float> e : datas.entrySet()) {
-                CommonData.put(address.get(i++).getAddress() + "", e.getValue());
+                CommonData.put(address.get(i++).getAddress(), e.getValue());
             }
         } else if (apdu.getAsdu().getVsq().getSq() == 1) {
             log.debug("------处理短浮点连续寻址-----");
             i = address.get(0).getAddress();
             for (Map.Entry<IeMeasuredQuality, Float> e : datas.entrySet()) {
-                CommonData.put(i++ + "", e.getValue());
+                CommonData.put(i++, e.getValue());
             }
         }
 

+ 2 - 2
src/main/java/com/energy/online/data/handle/HandleShortInteger.java

@@ -33,13 +33,13 @@ public class HandleShortInteger extends ShortIntegerType {
         if (apdu.getAsdu().getVsq().getSq() == 0) {
             log.debug("------处理短整型单一寻址-----");
             for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
-                CommonData.put(address.get(i++).getAddress() + "", e.getValue());
+                CommonData.put(address.get(i++).getAddress(), e.getValue());
             }
         } else if (apdu.getAsdu().getVsq().getSq() == 1) {
             log.debug("------处理短整型连续寻址-----");
             i = address.get(0).getAddress();
             for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
-                CommonData.put(i++ + "", e.getValue());
+                CommonData.put(i++, e.getValue());
             }
         }
 

+ 49 - 0
src/main/java/com/energy/online/data/handle/HandleShortIntegerWithTimeType.java

@@ -0,0 +1,49 @@
+package com.energy.online.data.handle;
+
+import com.energy.online.data.common.CommonData;
+import lombok.extern.slf4j.Slf4j;
+import wei.yigulu.iec104.annotation.AsduType;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.asdudataframe.ShortIntegerWithTimeType;
+import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@AsduType(typeId = 35)
+public class HandleShortIntegerWithTimeType extends ShortIntegerWithTimeType {
+
+    /**
+     * 处理短整型数据
+     *
+     * @param apdu
+     * @return
+     */
+    @Override
+    public byte[][] handleAndAnswer(Apdu apdu) {
+        log.debug("----------处理短整型带时间数据---------");
+        HandleShortInteger handleShortFloat = (HandleShortInteger) apdu.getAsdu().getDataFrame();
+        List<InformationBodyAddress> address = handleShortFloat.getAddresses();
+        Map<IeMeasuredQuality, Integer> datas = handleShortFloat.getDatas();
+        int i = 0;
+        //存入共享服务端
+//        log.info("获取到数据{}个", address.size());
+        if (apdu.getAsdu().getVsq().getSq() == 0) {
+            log.debug("------处理短整型单一寻址-----");
+            for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
+                CommonData.put(address.get(i++).getAddress(), e.getValue());
+            }
+        } else if (apdu.getAsdu().getVsq().getSq() == 1) {
+            log.debug("------处理短整型连续寻址-----");
+            i = address.get(0).getAddress();
+            for (Map.Entry<IeMeasuredQuality, Integer> e : datas.entrySet()) {
+                CommonData.put(i++, e.getValue());
+            }
+        }
+
+        //如果有需要返回数据帧可以创建byte数据  向内置入要返回的数据帧encode()后的数组
+        return null;
+    }
+}

+ 21 - 0
src/main/resources/application-2404.yml

@@ -0,0 +1,21 @@
+server:
+  port: 8084
+
+spring:
+  application:
+    name: energy-online-service
+
+iec104:
+  saveDir: "/home/caiji/data/2404/"
+  line:
+    ip: 172.21.6.36
+    port: 2404
+    coa: 1
+
+my:
+  scheduled:
+    cron: "0/10 * * * * *"
+    sendTotal: "0 0/10 * * * *"
+
+logging:
+  config: classpath:logback-spring-2404.xml

+ 21 - 0
src/main/resources/application-2405.yml

@@ -0,0 +1,21 @@
+server:
+  port: 8085
+
+spring:
+  application:
+    name: energy-online-service
+
+iec104:
+  saveDir: "/home/caiji/data/2405/"
+  line:
+    ip: 172.21.6.36
+    port: 2405
+    coa: 1
+
+my:
+  scheduled:
+    cron: "0/10 * * * * *"
+    sendTotal: "0 0/10 * * * *"
+
+logging:
+  config: classpath:logback-spring-2405.xml

+ 21 - 0
src/main/resources/application-2406.yml

@@ -0,0 +1,21 @@
+server:
+  port: 8086
+
+spring:
+  application:
+    name: energy-online-service
+
+iec104:
+  saveDir: "/home/caiji/data/2406/"
+  line:
+    ip: 172.21.6.36
+    port: 2406
+    coa: 1
+
+my:
+  scheduled:
+    cron: "0/1 * * * * *"
+    sendTotal: "0 0/1 * * * *"
+
+logging:
+  config: classpath:logback-spring-2406.xml

+ 11 - 14
src/main/resources/application.yml

@@ -1,20 +1,17 @@
+
+
 spring:
   application:
     name: energy-online-service
+  profiles:
+    active: "2404"
 
 iec104:
-  saveDir: "/data/104data/"
-  lines:
-    - ip: 192.168.50.242
-      port: 2404
-      coa: 10
-    - ip: 192.168.50.242
-      port: 2405
-      coa: 1
+  saveDir: "/home/caiji/data/2404/"
+  ip: 172.21.6.36
+  port: 2404
+  coa: 1
 
-  #lines:
-  #  - ip: 172.21.6.36
-  #    port: 2404
-  #
-  #  - ip: 172.21.6.36
-  #    port: 2405
+my:
+  scheduled:
+    cron: "0/10 * * * * *"

+ 21 - 0
src/main/resources/logback-spring-2404.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>/home/caiji/project/logs/104/2404.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>/home/caiji/project/logs/104/history/2404/%d{yyyy-MM-dd}.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+    </root>
+</configuration>

+ 21 - 0
src/main/resources/logback-spring-2405.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>/home/caiji/project/logs/104/2405.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>/home/caiji/project/logs/104/history/2405/%d{yyyy-MM-dd}.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+    </root>
+</configuration>

+ 21 - 0
src/main/resources/logback-spring-2406.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>/home/caiji/project/logs/104/2406.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>/home/caiji/project/logs/104/history/2406/%d{yyyy-MM-dd}.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+    </root>
+</configuration>

+ 1 - 1
src/main/resources/logback-spring.xml

@@ -4,7 +4,7 @@
     <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
 
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>/data/logs/104/104.log</file>
+        <file>/home/caiji/project/logs/104/104.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
         </encoder>