martin 3 년 전
부모
커밋
e047aacb24

+ 7 - 11
api-common/pom.xml

@@ -17,17 +17,7 @@
     </properties>
 
     <dependencies>
-
-        <!-- minio - 开始 -->
-        <dependency>
-            <groupId>com.squareup.okhttp3</groupId>
-            <artifactId>okhttp</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.minio</groupId>
-            <artifactId>minio</artifactId>
-        </dependency>
-        <!-- minio - 结束 -->
+        
         <!-- http 客户端 -->
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
@@ -40,6 +30,12 @@
             <artifactId>lombok</artifactId>
         </dependency>
 
+        <!-- 参数校验 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
         <!-- web 服务 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 17 - 0
api-common/src/main/java/api/common/pojo/vo/KafkaMessageVO.java

@@ -0,0 +1,17 @@
+package api.common.pojo.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class KafkaMessageVO {
+    @NotBlank(message = "主题不能为空!")
+    private String topic;
+    @NotBlank(message = "消息不能为空!")
+    private String data;
+}

+ 0 - 98
api-common/src/main/java/api/common/util/MinioUtil.java

@@ -1,98 +0,0 @@
-package api.common.util;
-
-import io.minio.*;
-import io.minio.errors.ErrorResponseException;
-import io.minio.errors.InsufficientDataException;
-import io.minio.errors.InvalidResponseException;
-import io.minio.errors.XmlParserException;
-import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-
-public class MinioUtil {
-
-    /**
-     * 判断 bucket 是否存在
-     */
-    public static boolean isBucketExist(MinioClient minioClient, String bucketName) throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
-        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
-    }
-
-    /**
-     * 创建 bucket
-     */
-    public static void createBucket(MinioClient minioClient, String bucketName) throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
-        if (!isBucketExist(minioClient, bucketName)) {
-            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
-        }
-    }
-
-    /**
-     * 通过文件路径上传文件上传文件
-     */
-    public static void uploadByFilePath(
-            MinioClient minioClient,
-            String sourceFilePath,
-            String bucketName,
-            String objectName
-    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
-        minioClient.uploadObject(UploadObjectArgs.builder()
-                .filename(sourceFilePath)
-                .bucket(bucketName)
-                .object(objectName)
-                .build());
-    }
-
-    /**
-     * 通过文件路径上传文件上传文件
-     *
-     * @param partSize 分片最小 5MB
-     */
-    public static void uploadByStream(
-            MinioClient minioClient,
-            InputStream inputStream,
-            long objectSize,
-            long partSize,
-            String bucketName,
-            String objectName
-    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
-        minioClient.putObject(PutObjectArgs.builder()
-                .stream(inputStream, objectSize, partSize)
-                .bucket(bucketName)
-                .object(objectName)
-                .build());
-    }
-
-    /**
-     * 下载文件
-     */
-    public static void downloadToFile(
-            MinioClient minioClient,
-            String bucketName,
-            String objectName,
-            String targetFilePath
-    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
-        minioClient.downloadObject(DownloadObjectArgs.builder()
-                .bucket(bucketName)
-                .object(objectName)
-                .filename(targetFilePath)
-                .build());
-    }
-
-    /**
-     * 下载文件
-     */
-    public static InputStream downloadToStream(
-            MinioClient minioClient,
-            String bucketName,
-            String objectName
-    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
-        return minioClient.getObject(GetObjectArgs.builder()
-                .bucket(bucketName)
-                .object(objectName)
-                .build());
-    }
-}

+ 2 - 1
simulation-resource-common/src/main/java/com/css/simulation/resource/common/configuration/kafka/producer/ApacheKafkaPartitioner.java

@@ -16,10 +16,11 @@ public class ApacheKafkaPartitioner implements Partitioner {
 
     /**
      * 返回分区值。
+     * 全部发送到 0 号分区, 保证消息有序性
      */
     @Override
     public int partition(String s, Object o, byte[] bytes, Object o1, byte[] bytes1, Cluster cluster) {
-        // 全部发送到 0 号分区
+
         return 0;
     }
 

+ 23 - 42
simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/KafkaController.java

@@ -1,8 +1,10 @@
 package com.css.simulation.resource.common.controller;
 
+import api.common.pojo.vo.KafkaMessageVO;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.kafka.core.KafkaTemplate;
-import org.springframework.kafka.support.SendResult;
-import org.springframework.util.concurrent.ListenableFutureCallback;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -10,48 +12,27 @@ import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("/kafka")
+@Slf4j
 public class KafkaController {
 
-        @Resource
-        private KafkaTemplate<String, Object> kafkaTemplate;
-
-        // -------------------------------- 简单发送 --------------------------------
-
-        @RequestMapping("/send")
-        public void sendMessage1(String normalMessage) {
-            kafkaTemplate.send("topic1",0,"key", normalMessage);
-        }
-
-        // -------------------------------- 带回调函数的发送 --------------------------------
-        public void sendMessage2(String callbackMessage) {
-            kafkaTemplate.send("topic1", callbackMessage).addCallback(success -> {
-                // 消息发送到的topic
-                String topic = success.getRecordMetadata().topic();
-                // 消息发送到的分区
-                int partition = success.getRecordMetadata().partition();
-                // 消息在分区内的offset
-                long offset = success.getRecordMetadata().offset();
-                System.out.println("发送消息成功:" + topic + "-" + partition + "-" + offset);
-            }, failure -> {
-                System.out.println("发送消息失败:" + failure.getMessage());
-            });
-        }
-
-
-        public void sendMessage3(String callbackMessage) {
-            kafkaTemplate.send("topic1", callbackMessage).addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
-                @Override
-                public void onFailure(Throwable throwable) {
-                    System.out.println("发送消息失败:" + throwable.getMessage());
-                }
-
-                @Override
-                public void onSuccess(SendResult<String, Object> result) {
-                    System.out.println("发送消息成功:" + result.getRecordMetadata().topic() + "-"
-                            + result.getRecordMetadata().partition() + "-" + result.getRecordMetadata().offset());
-                }
-            });
-        }
+    @Resource
+    private KafkaTemplate<String, String> kafkaTemplate;
+
+    // -------------------------------- 带回调函数的发送 --------------------------------
+    @RequestMapping("/send")
+    public void send(@RequestBody @Validated KafkaMessageVO kafkaMessageVO) {
+        kafkaTemplate.send(kafkaMessageVO.getTopic(), kafkaMessageVO.getData()).addCallback(success -> {
+            // 消息发送到的topic
+            String topic = success.getRecordMetadata().topic();
+            // 消息发送到的分区
+            int partition = success.getRecordMetadata().partition();
+            // 消息在分区内的offset
+            long offset = success.getRecordMetadata().offset();
+            log.info("发送消息成功:" + topic + "-" + partition + "-" + offset);
+        }, failure -> {
+            log.error("发送消息失败:" + failure.getMessage());
+        });
+    }
 
 
 }

+ 49 - 5
simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/MinioController.java

@@ -1,5 +1,49 @@
-package com.css.simulation.resource.common.controller;
-
-@RestController
-public class MinioController {
-}
+//package com.css.simulation.resource.common.controller;
+//
+//import com.css.simulation.resource.common.util.MinioUtil;
+//import io.minio.MinioClient;
+//import io.minio.errors.*;
+//import org.springframework.validation.annotation.Validated;
+//import org.springframework.web.bind.annotation.RequestBody;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//import org.springframework.web.multipart.MultipartFile;
+//
+//import javax.annotation.Resource;
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.security.InvalidKeyException;
+//import java.security.NoSuchAlgorithmException;
+//
+//@RestController
+//@RequestMapping("/minio")
+//public class MinioController {
+//
+//    @Resource
+//    private MinioClient minioClient;
+//
+//    @RequestMapping("/upload")
+//    public void upload(
+//            MultipartFile multipartFile,
+//            @RequestBody @Validated MinioParameter minioParameter
+//    ) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+//        MinioUtil.uploadFromMultipartFile(
+//                minioClient,
+//                multipartFile,
+//                minioParameter.getBucketName(),
+//                minioParameter.getObjectName()
+//        );
+//    }
+//
+//    @RequestMapping("/download")
+//    public InputStream download(
+//            @RequestBody @Validated MinioParameter minioParameter
+//    ) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+//        return MinioUtil.downloadToStream(
+//                minioClient,
+//                minioParameter.getBucketName(),
+//                minioParameter.getObjectName()
+//        );
+//    }
+//
+//}

+ 42 - 1
simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/RedisController.java

@@ -1,7 +1,48 @@
 package com.css.simulation.resource.common.controller;
 
+import api.common.pojo.common.ResponseBodyVO;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import java.time.Duration;
+
+
+/**
+ * https://blog.csdn.net/lzb348110175/article/details/105349109/
+ */
 @RestController
+@RequestMapping("/redis")
 public class RedisController {
-}
+
+    @Resource
+    RedisTemplate<String, String> redisTemplate;
+
+    @RequestMapping("/get")
+    public ResponseBodyVO<String> get(@RequestParam("key") String key) {
+        //1 获取 key 对应的值
+        String value1 = redisTemplate.opsForValue().get(key);
+        //2 存储键值对并设置时间。
+        redisTemplate.opsForValue().set("key2", "value2", Duration.ofMinutes(30L));
+        //3 获取指定 key 的剩余时间,单位秒。
+        Long time3 = redisTemplate.getExpire("key3");
+        //4 根据 key 删除
+        redisTemplate.delete("key4");
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
+    }
+
+    @RequestMapping("/set")
+    public ResponseBodyVO<String> set(@RequestParam("key") String key) {
+        //2 存储键值对并设置时间。
+        redisTemplate.opsForValue().set("key2", "value2", Duration.ofMinutes(30L));
+        //3 获取指定 key 的剩余时间,单位秒。
+        Long time3 = redisTemplate.getExpire("key3");
+        //4 根据 key 删除
+        redisTemplate.delete("key4");
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
+    }
+
+
+}

+ 119 - 0
simulation-resource-common/src/main/java/com/css/simulation/resource/common/util/MinioUtil.java

@@ -0,0 +1,119 @@
+//package com.css.simulation.resource.common.util;
+//
+//import io.minio.*;
+//import io.minio.errors.ErrorResponseException;
+//import io.minio.errors.InsufficientDataException;
+//import io.minio.errors.InvalidResponseException;
+//import io.minio.errors.XmlParserException;
+//import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
+//import org.springframework.web.multipart.MultipartFile;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.rmi.ServerException;
+//import java.security.InvalidKeyException;
+//import java.security.NoSuchAlgorithmException;
+//
+//public class MinioUtil {
+//
+//    /**
+//     * 判断 bucket 是否存在
+//     */
+//    public static boolean isBucketExist(MinioClient minioClient, String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
+//        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+//    }
+//
+//    /**
+//     * 创建 bucket
+//     */
+//    public static void createBucket(MinioClient minioClient, String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
+//        if (!isBucketExist(minioClient, bucketName)) {
+//            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+//        }
+//    }
+//
+//    /**
+//     * 通过文件路径上传文件上传文件
+//     */
+//    public static void uploadFromFile(
+//            MinioClient minioClient,
+//            String sourceFilePath,
+//            String bucketName,
+//            String objectName
+//    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
+//        minioClient.uploadObject(UploadObjectArgs.builder()
+//                .filename(sourceFilePath)
+//                .bucket(bucketName)
+//                .object(objectName)
+//                .build());
+//    }
+//
+//    /**
+//     * 通过文件路径上传文件上传文件
+//     *
+//     * @param partSize 分片最小 5MB
+//     */
+//    public static void uploadFromStream(
+//            MinioClient minioClient,
+//            InputStream inputStream,
+//            long objectSize,
+//            long partSize,
+//            String bucketName,
+//            String objectName
+//    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
+//        minioClient.putObject(PutObjectArgs.builder()
+//                .stream(inputStream, objectSize, partSize)
+//                .bucket(bucketName)
+//                .object(objectName)
+//                .build());
+//    }
+//
+//    /**
+//     * 通过文件路径上传文件上传文件
+//     */
+//    public static void uploadFromMultipartFile(
+//            MinioClient minioClient,
+//            MultipartFile multipartFile,
+//            String bucketName,
+//            String objectName
+//    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
+//        InputStream inputStream = multipartFile.getInputStream();
+//        long objectSize = multipartFile.getSize();
+//        long partSize = 5 * 1024 * 1024L; // 分片最小 5M
+//        minioClient.putObject(PutObjectArgs.builder()
+//                .stream(inputStream, objectSize, partSize)
+//                .bucket(bucketName)
+//                .object(objectName)
+//                .build());
+//    }
+//
+//    /**
+//     * 下载文件
+//     */
+//    public static void downloadToFile(
+//            MinioClient minioClient,
+//            String bucketName,
+//            String objectName,
+//            String targetFilePath
+//    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
+//        minioClient.downloadObject(DownloadObjectArgs.builder()
+//                .bucket(bucketName)
+//                .object(objectName)
+//                .filename(targetFilePath)
+//                .build());
+//    }
+//
+//    /**
+//     * 下载文件
+//     */
+//    public static InputStream downloadToStream(
+//            MinioClient minioClient,
+//            String bucketName,
+//            String objectName
+//    ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
+//        return minioClient.getObject(GetObjectArgs.builder()
+//                .bucket(bucketName)
+//                .object(objectName)
+//                .build());
+//    }
+//}

+ 119 - 0
simulation-resource-common/src/main/resources/logback-spring.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="true">
+    <!-- 项目名称 -->
+    <property name="PROJECT_NAME" value="changjingyun"/>
+
+    <!--定义不同环境的日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <springProfile name="dev">
+        <property name="LOG_HOME" value="D:\\idea-log\\simulation-cloud\\simulation-resource-common"/>
+    </springProfile>
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <!--输出到debug-->
+    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/debug.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--输出到info-->
+    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--输出到error-->
+    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--输出到warn-->
+    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 -->
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--分别设置对应的日志输出节点 -->
+    <root level="info">
+        <appender-ref ref="console"/>
+        <appender-ref ref="debug"/>
+        <appender-ref ref="info"/>
+        <appender-ref ref="error"/>
+        <appender-ref ref="warn"/>
+    </root>
+</configuration>

+ 119 - 0
simulation-resource-scheduler/src/main/resources/logback-spring.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="true">
+    <!-- 项目名称 -->
+    <property name="PROJECT_NAME" value="changjingyun"/>
+
+    <!--定义不同环境的日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <springProfile name="dev">
+        <property name="LOG_HOME" value="D:\\idea-log\\simulation-cloud\\simulation-resource-scheduler"/>
+    </springProfile>
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <!--输出到debug-->
+    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/debug.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--输出到info-->
+    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--输出到error-->
+    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--输出到warn-->
+    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>15</MaxHistory>
+            <!--日志文件最大的大小-->
+            <MaxFileSize>10MB</MaxFileSize>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 -->
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--分别设置对应的日志输出节点 -->
+    <root level="info">
+        <appender-ref ref="console"/>
+        <appender-ref ref="debug"/>
+        <appender-ref ref="info"/>
+        <appender-ref ref="error"/>
+        <appender-ref ref="warn"/>
+    </root>
+</configuration>