Browse Source

上传未提交文件

lengfaqiang 3 năm trước cách đây
mục cha
commit
66af4a4091

+ 1 - 1
pom.xml

@@ -160,7 +160,7 @@
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
         </dependency>
-        <!-- Sentinel Datasource Nacos -->
+        <!-- Sentinel Datasource Nacos 持久化存储-->
         <dependency>
             <groupId>com.alibaba.csp</groupId>
             <artifactId>sentinel-datasource-nacos</artifactId>

+ 34 - 0
sckw-modules/sckw-file/src/main/java/com/sckw/file/FileApplication.java

@@ -0,0 +1,34 @@
+package com.sckw.file;
+
+
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * @author lfdc
+ * @version 1.0
+ * @className FileApplication
+ * @description 文件上传下载启动类
+ * @company sckw
+ * @date 2023-06-02 17:06:43
+ */
+//@MapperScan("com.sckw.file.*.mapper")
+@EnableDubbo
+@EnableFeignClients({"com.sckw.*.api.feign"})
+@EnableDiscoveryClient
+@SpringBootApplication
+public class FileApplication {
+
+    public static void main(String[] args) {
+        // 关闭nacos日志
+        System.setProperty("nacos.logging.default.config.enabled", "false");
+        try {
+            SpringApplication.run(FileApplication.class, args);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 102 - 0
sckw-modules/sckw-file/src/main/java/com/sckw/file/controller/FileApiController.java

@@ -0,0 +1,102 @@
+package com.sckw.file.controller;
+
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.file.service.FileService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+
+/**
+ * @author lfdc
+ * @version 1.0
+ * @className FileApiController
+ * @description alibaba-oss测试用例
+ *
+ * @company sckw
+ * @date 2023-06-02 16:06:43
+ */
+@Slf4j
+@RestController
+@RequestMapping("/file")
+@AllArgsConstructor
+public class FileApiController {
+
+    @Autowired
+    private FileService fileService;
+
+    /**
+     * 上传文件至OSS
+     *
+     * @param file
+     * @return
+     */
+    @RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
+    public HttpResult fileUpload(@RequestParam("file") MultipartFile file) {
+        //获取上传文件
+        return fileService.uploadFile(file);
+
+    }
+
+    /**
+     * feign接收上传文件至OSS
+     *
+     * @param file
+     * @return
+     */
+    @RequestMapping(value = "/fileFeignUpload", method = RequestMethod.POST)
+    public HttpResult fileFeignUpload(@RequestParam("file") MultipartFile file) {
+        //获取上传文件
+        return fileService.uploadFile(file);
+
+    }
+
+    /**
+     * 批量上传文件至OSS
+     * @param file
+     * @return
+     */
+    @RequestMapping(value = "/fileUploadList", method = RequestMethod.POST)
+    public HttpResult uploadFileList(@RequestParam("file") MultipartFile[] file) {
+        //获取上传文件
+        return fileService.uploadFileList(file);
+
+    }
+
+    /**
+     * OSS下载文件/获取文件地址
+     * @return
+     */
+    @GetMapping("/fileDownload")
+    public HttpResult fileDownload() {
+        String fileName = "https://kaiwu-saas.oss-cn-chengdu.aliyuncs.com/kll/uploads/20230605/14633197602917990420230605demo.txt";
+        //获取上传文件
+        fileService.fileDownload(fileName);
+        return HttpResult.ok();
+    }
+
+    /**
+     * file-feign-demo
+     * @param userName
+     * @return
+     */
+    @GetMapping(value = "/fileFeignDemo")
+    public HttpResult fileFeignDemo(@RequestParam("userName") String userName) {
+        return HttpResult.ok(userName);
+    }
+
+
+    /**
+     * file-feign-demo1
+     * @param map
+     * @return
+     */
+    @RequestMapping(value = "fileFeignDemo1",method = RequestMethod.POST)
+    public HttpResult fileFeignDemo1(@RequestBody Map<String, String> map) {
+        return HttpResult.ok(map);
+    }
+
+}

+ 158 - 0
sckw-modules/sckw-file/src/main/java/com/sckw/file/service/FileService.java

@@ -0,0 +1,158 @@
+package com.sckw.file.service;
+
+
+import com.sckw.core.utils.IdWorker;
+import com.sckw.core.utils.StringUtils;
+import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.excel.common.NumberConstant;
+import com.sckw.file.common.enums.FileEnum;
+import com.sckw.file.dao.KwsFileInfoDao;
+import com.sckw.file.model.FileInfo;
+import com.sckw.file.utils.FileUtils;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.*;
+
+
+/**
+ * @author lfdc
+ * @version 1.0
+ * @className FileService
+ * @description 文件上传下载service
+ * @company sckw
+ * @date 2023-06-02 16:06:46
+ */
+@Slf4j
+@Service
+public class FileService {
+
+    @Autowired
+    KwsFileInfoDao fileInfoDao;
+
+    /**
+     * 上传文件至OSS
+     *
+     * @param file
+     * @return
+     */
+    public HttpResult uploadFile(MultipartFile file) {
+        HttpResult result = new HttpResult();
+        List<Map<String, Object>> resultList = new ArrayList<>();
+        result.setCode(HttpStatus.SUCCESS_CODE);
+        boolean isEmpty = file.isEmpty();
+        if (isEmpty) {
+            result.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
+            result.setMsg("上传请选择文件");
+            return result;
+        }
+        //获取文件类型
+        String contentType = file.getContentType();
+        //获取上传文件的原始文件名
+        String oFileName = file.getOriginalFilename();
+        //文件大小
+        BigDecimal fileSize = FileUtils.getFileSize(file, "KB");
+        FileInfo fileInfo = new FileInfo();
+        fileInfo.setOriginalName(oFileName);
+        //获取文件后缀
+        fileInfo.setFileSuffix(FilenameUtils.getExtension(oFileName));
+        fileInfo.setFileSize(StringUtils.isBlank(fileSize) ? new BigDecimal("0") : fileSize);
+        Map<String, String> infoMap = FileUtils.uploadFileByInfo(file, FileEnum.DOCUMENT_ADDRESS);
+        FileInfo infoDo = new FileInfo();
+        infoDo.setId(new IdWorker(1).nextId());
+        infoDo.setType(FileEnum.FILE_STORE_TYPE_OSS.getFileType());
+        infoDo.setFileName(infoMap.get("fileName"));
+        infoDo.setMd5(infoMap.get("fileMd5"));
+        infoDo.setFilePath(infoMap.get("filePath"));
+        infoDo.setCreateTime(LocalDateTime.now());
+        infoDo.setUpdateTime(LocalDateTime.now());
+//        int insert = fileInfoDao.insert(infoDo);
+        //上传至oss文件地址
+        if (StringUtils.isNotBlank(infoMap.get("filePath"))) {
+            String oosUrl = infoMap.get("filePath");
+            result.setCode(HttpStatus.SUCCESS_CODE);
+            result.setMsg("上传成功");
+            Map<String, Object> map = new HashMap<>(NumberConstant.SIXTEEN);
+            map.put("fileKey", infoMap.get("filePath"));
+            map.put("fileName", infoMap.get("fileName"));
+            resultList.add(map);
+            result.setData(resultList);
+        } else {
+            result.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
+            result.setMsg("上传请选择文件");
+        }
+        return result;
+    }
+
+
+    /**
+     * 批量上传文件至OSS
+     *
+     * @param file
+     * @return
+     */
+    @Async
+    public HttpResult uploadFileList(MultipartFile[] file) {
+        HttpResult result = new HttpResult();
+        List<Map<String, Object>> resultList = new ArrayList<>();
+        if (!ObjectUtils.isEmpty(file) && file.length > 0) {
+            List<MultipartFile> multipartFiles = Arrays.asList(file);
+            for (MultipartFile multipartFile : multipartFiles) {
+                Map<String, Object> map = new HashMap<>();
+                //文件大小
+                String fileSize = FileUtils.getFileSize(multipartFile);
+                //文件名称
+                String originalFilename = multipartFile.getOriginalFilename();
+                map.put("code", HttpStatus.SUCCESS_CODE);
+                map.put("fileName", originalFilename);
+                map.put("message", HttpStatus.SUCCESS_MESSAGE);
+                String url = null;
+                //上传文件是否成功
+                try {
+                    url = FileUtils.uploadFile(multipartFile, FileEnum.DOCUMENT_ADDRESS);
+                } catch (Exception e) {
+                    map.put("code", HttpStatus.GLOBAL_EXCEPTION_CODE);
+                    map.put("fileName", originalFilename);
+                    map.put("message", e);
+                }
+                if (StringUtils.isBlank(url)) {
+                    map.put("code", HttpStatus.GLOBAL_EXCEPTION_CODE);
+                    map.put("fileName", originalFilename);
+                    map.put("message", HttpStatus.SUCCESS_MESSAGE);
+                }
+                //上传至oss文件地址
+                String oosUrl = url;
+                resultList.add(map);
+            }
+        } else {
+            result.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
+            result.setMsg("上传选择文件为空");
+        }
+        result.setData(resultList);
+        return result;
+    }
+
+
+    /**
+     * OSS下载文件/获取文件地址
+     *
+     * @return
+     */
+    public void fileDownload(String fileName) {
+        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+        FileUtils.downloadByUrl(response,fileName);
+        FileUtils.downOSSFile(fileName, response);
+//        FileUtils.downloadByFileName(fileName);
+    }
+}

+ 15 - 0
sckw-modules/sckw-file/src/main/java/com/sckw/file/service/dubbo/RemoteUserService1Impl.java

@@ -0,0 +1,15 @@
+package com.sckw.file.service.dubbo;
+
+import com.sckw.system.api.RemoteUserService;
+import org.apache.dubbo.config.annotation.DubboService;
+
+import java.util.Date;
+
+@DubboService(group = "design", version = "2.0.0")
+public class RemoteUserService1Impl implements RemoteUserService {
+
+    @Override
+    public String getUserInfoV1(String account) {
+        return "getUserInfoV1:"+new Date() +account;
+    }
+}

+ 13 - 0
sckw-modules/sckw-file/src/main/java/com/sckw/file/service/feign/FileApiFeignServiceImpl.java

@@ -0,0 +1,13 @@
+package com.sckw.file.service.feign;
+
+/**
+ * @author lfdc
+ * @version 1.0
+ * @className FileApiFeignServiceImpl
+ * @description file文件feign实现类
+ * @company sckw
+ * @date 2023-06-06 10:06:52
+ */
+public class FileApiFeignServiceImpl {
+
+}

+ 5 - 0
sckw-modules/sckw-file/src/main/resources/banner.txt

@@ -0,0 +1,5 @@
+====================================================================================================================
+
+                    欢迎使用 [sckw-example] 开物供应链服务平台-文件服务 - Powered By https://www.xxxx.com
+
+====================================================================================================================

+ 154 - 0
sckw-modules/sckw-file/src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,154 @@
+spring:
+  rabbitmq:
+    username: admin
+    password: admin
+    host: 10.10.10.138
+    port: 5672
+    virtual-host: /
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        #        server-addr: 47.108.162.14:8848
+        server-addr: 127.0.0.1:8848
+        # 命名空间
+        namespace: sckw-service-platform-dev
+        # nacos用户名
+        username: nacos
+        # nacos密码
+        password: nacos
+        # 共享配置
+        group: sckw-service-platform
+        # 权重 1-100 数值越大权重越大分配的流量就越大,通常结合权重负载均衡策略
+      #        weight: 100
+      config:
+        # 配置中心地址
+        #        server-addr: 47.108.162.14:8848
+        server-addr: 127.0.0.1:8848
+        # 配置文件格式
+        file-extension: yaml
+        # 命名空间
+        namespace: sckw-service-platform-dev
+        # 共享配置
+        group: sckw-service-platform
+        enabled: true
+    stream:
+      bindings:
+        sckwSms-out-0:
+          destination: sckw-sms
+          content-type: application/json
+          default-binder: defaultRabbit
+          group: sckw
+        sckwMessage-out-0:
+          destination: sckw-message
+          content-type: application/json
+          default-binder: defaultRabbit
+          group: sckw
+      binders:
+        defaultRabbit:
+          type: rabbit
+          environment:
+            spring:
+              rabbitmq:
+                virtual-host: /
+                host: 39.104.134.114
+                port: 5672
+                username: wph
+                password: Yy123...
+    # sentinel降级配置
+    sentinel:
+      transport:
+        client-ip: ${spring.cloud.client.ip-address} # 获取本机IP地址
+        port: 8719  #默认8719端口,如果被占用会向上扫描。
+        #控制台地址
+        #dashboard: 47.108.162.14:19527
+        dashboard: 127.0.0.1:19527
+      log:
+        #日志路径
+        dir: logs/sentinel
+        # 默认将调用链路收敛,导致链路流控效果无效
+        web-context-unify: false
+        #持久化nacos配置中
+      datasource:
+        #sentinel-rule: # 唯一名称可自定义
+        #限流
+        flow:
+          nacos:
+            # 设置Nacos的连接地址、命名空间和Group ID
+            namespace:  sckw-service-platform-dev
+            server-addr:  ${spring.cloud.nacos.discovery.server-addr}
+            # username: ${spring.cloud.nacos.discovery.username}
+            # password: ${spring.cloud.nacos.discovery.password}
+            # 设置Nacos中配置文件的命名规则
+            #            data-id:  ${spring.application.name}-sentinel-flow-rules
+            data-id:  sckw-file-sentinel-flow-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            # 必填的重要字段,指定当前规则类型是"限流"
+            rule-type: flow
+        #熔断
+        degrade:
+          nacos:
+            namespace:  sckw-service-platform-dev
+            server-addr: ${spring.cloud.nacos.discovery.server-addr}
+            #data-id: ${spring.application.name}-sentinel-degrade-rules
+            data-id: sckw-file-sentinel-degrade-rules
+            group-id: SENTINEL_GROUP
+            #熔断
+            rule-type: degrade
+      #取消慢加载
+      eager: true
+  datasource:
+    dynamic:
+      seata: true
+seata:
+  # seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应
+  # 事务分组名称,要和服务端对应
+  tx-service-group: file-seata-group
+  service:
+    vgroup-mapping:
+      # key是事务分组名称 value要和服务端的机房名称保持一致
+      file-seata-group: default
+  registry:
+    # 指定nacos作为注册中心
+    type: nacos
+    nacos:
+      server-addr: ${spring.cloud.nacos.discovery.server-addr}
+      namespace: ${spring.cloud.nacos.discovery.namespace}
+      #group: SEATA_GROUP为默认分组
+      group: ${spring.cloud.nacos.discovery.group}
+  config:
+    # 指定nacos作为配置中心
+    type: nacos
+    nacos:
+      server-addr: ${spring.cloud.nacos.discovery.server-addr}
+      #server-addr: 47.108.162.14:8848
+      namespace: ${spring.cloud.nacos.discovery.namespace}
+      group: ${spring.cloud.nacos.discovery.group}
+  application-id: ${spring.application.name}
+# 支持feign对sentinel支持
+#feign:
+#  sentinel:
+#    enabled: true
+
+dubbo:
+  application:
+    # 此处没有延用spring.application.name是因为当前项目本身也会注册到nacos中,如果dubbo也延用相同的名称,在nacos服务里会看到注册的producer-server服务数为2
+    name: file-dubbo-server
+  protocol:
+    name: dubbo
+    port: -1
+    prefer-serialization: java
+  registry:
+    # 配置dubbo的注册中心为nacos
+    address: nacos://${spring.cloud.nacos.discovery.server-addr}
+    group: ${spring.cloud.nacos.config.group}
+    protocol: nacos
+    #use-as-config-center: false
+    #use-as-metadata-center: false
+aliyun:
+  oss:
+    endpoint: oss-cn-chengdu.aliyuncs.com
+    accessKeyId: LTAI5tPEbubCGq5Rdwygbz4Q
+    secret: 7mQLWMaBJeZPRV1SRGogctYGXwppjQ
+    bucket: kaiwu-saas

+ 167 - 0
sckw-modules/sckw-file/src/main/resources/bootstrap-local.yml

@@ -0,0 +1,167 @@
+spring:
+  rabbitmq:
+    username: admin
+    password: admin
+    host: 10.10.10.138
+    port: 5672
+    virtual-host: /
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+#        server-addr: 47.108.162.14:8848
+        server-addr: 127.0.0.1:8848
+        # 命名空间
+        namespace: sckw-service-platform-dev
+        # nacos用户名
+        username: nacos
+        # nacos密码
+        password: nacos
+        # 共享配置
+        group: sckw-service-platform
+        # 权重 1-100 数值越大权重越大分配的流量就越大,通常结合权重负载均衡策略
+      #        weight: 100
+      config:
+        # 配置中心地址
+#        server-addr: 47.108.162.14:8848
+        server-addr: 127.0.0.1:8848
+        # 配置文件格式
+        file-extension: yaml
+        # 命名空间
+        namespace: sckw-service-platform-dev
+        # 共享配置
+        group: sckw-service-platform
+        enabled: true
+    stream:
+      bindings:
+        sckwSms-out-0:
+          destination: sckw-sms
+          content-type: application/json
+          default-binder: defaultRabbit
+          group: sckw
+        sckwMessage-out-0:
+          destination: sckw-message
+          content-type: application/json
+          default-binder: defaultRabbit
+          group: sckw
+      binders:
+        defaultRabbit:
+          type: rabbit
+          environment:
+            spring:
+              rabbitmq:
+                virtual-host: /
+                host: 39.104.134.114
+                port: 5672
+                username: wph
+                password: Yy123...
+    # sentinel降级配置
+    sentinel:
+      transport:
+        client-ip: ${spring.cloud.client.ip-address} # 获取本机IP地址
+        port: 8719  #默认8719端口,如果被占用会向上扫描。
+        #控制台地址
+        #dashboard: 47.108.162.14:19527
+        dashboard: 127.0.0.1:19527
+      log:
+        #日志路径
+        dir: logs/sentinel
+        # 默认将调用链路收敛,导致链路流控效果无效
+        web-context-unify: false
+        #持久化nacos配置中
+      datasource:
+        #sentinel-rule: # 唯一名称可自定义
+        #限流
+        flow:
+          nacos:
+            # 设置Nacos的连接地址、命名空间和Group ID
+            namespace:  sckw-service-platform-dev
+            server-addr:  ${spring.cloud.nacos.discovery.server-addr}
+            # username: ${spring.cloud.nacos.discovery.username}
+            # password: ${spring.cloud.nacos.discovery.password}
+            # 设置Nacos中配置文件的命名规则
+            #            data-id:  ${spring.application.name}-sentinel-flow-rules
+            data-id:  sckw-file-sentinel-flow-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            # 必填的重要字段,指定当前规则类型是"限流"
+            rule-type: flow
+        #熔断
+        degrade:
+          nacos:
+            namespace:  sckw-service-platform-dev
+            server-addr: ${spring.cloud.nacos.discovery.server-addr}
+            #data-id: ${spring.application.name}-sentinel-degrade-rules
+            data-id: sckw-file-sentinel-degrade-rules
+            group-id: SENTINEL_GROUP
+            #熔断
+            rule-type: degrade
+      #取消慢加载
+      eager: true
+  datasource:
+    dynamic:
+      seata: true
+#sfs:
+#  nacos:
+#    server-addr: 127.0.0.1:8848
+#    namespace: 967df0d8-156b-441a-a5ab-615b4a865168
+#    group: MY_GROUP
+#
+#    nacos:
+#      server-addr: ${sfs.nacos.server-addr}
+#      namespace: ${sfs.nacos.namespace}
+#      group: ${sfs.nacos.group}
+
+seata:
+  # seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应
+  # 事务分组名称,要和服务端对应
+  tx-service-group: file-seata-group
+  service:
+    vgroup-mapping:
+      # key是事务分组名称 value要和服务端的机房名称保持一致
+      file-seata-group: default
+  registry:
+    # 指定nacos作为注册中心
+    type: nacos
+    nacos:
+      server-addr: ${spring.cloud.nacos.discovery.server-addr}
+      #server-addr: 47.108.162.14:8848
+      namespace: ${spring.cloud.nacos.discovery.namespace}
+      #      group: SEATA_GROUP
+      group: ${spring.cloud.nacos.discovery.group}
+  config:
+    # 指定nacos作为配置中心
+    type: nacos
+    nacos:
+      server-addr: ${spring.cloud.nacos.discovery.server-addr}
+      #server-addr: 47.108.162.14:8848
+      namespace: ${spring.cloud.nacos.discovery.namespace}
+      group: ${spring.cloud.nacos.discovery.group}
+  application-id: ${spring.application.name}
+#  application-id: sckw-seata-file
+# 支持feign对sentinel支持
+#feign:
+#  sentinel:
+#    enabled: true
+
+dubbo:
+  application:
+    # 此处没有延用spring.application.name是因为当前项目本身也会注册到nacos中,如果dubbo也延用相同的名称,在nacos服务里会看到注册的producer-server服务数为2
+    name: file-dubbo-server
+  protocol:
+    name: dubbo
+    port: -1
+    prefer-serialization: java
+  registry:
+    # 配置dubbo的注册中心为nacos
+    address: nacos://${spring.cloud.nacos.discovery.server-addr}
+    group: ${spring.cloud.nacos.config.group}
+    protocol: nacos
+    #use-as-config-center: false
+    #use-as-metadata-center: false
+aliyun:
+  oss:
+    endpoint: oss-cn-chengdu.aliyuncs.com
+    accessKeyId: LTAI5tPEbubCGq5Rdwygbz4Q
+    secret: 7mQLWMaBJeZPRV1SRGogctYGXwppjQ
+    bucket: kaiwu-saas

+ 10 - 0
sckw-modules/sckw-file/src/main/resources/bootstrap.yml

@@ -0,0 +1,10 @@
+server:
+  port: 10050
+
+spring:
+  application:
+    name: sckw-file
+  profiles:
+    active: ${DEPLOY_MODE:local}
+  main:
+    allow-bean-definition-overriding: true

+ 45 - 0
sckw-modules/sckw-file/src/main/resources/logback-spring.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+说明:
+    1. 文件的命名和加载顺序有关
+       logback.xml早于application.yml加载,logback-spring.xml晚于application.yml加载
+       如果logback配置需要使用application.yml中的属性,需要命名为logback-spring.xml
+    2. logback使用application.yml中的属性
+       使用springProperty才可使用application.yml中的值 可以设置默认值
+-->
+<configuration debug="false">
+    <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="service"/>
+
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <property name="LOG_HOME" value="/tmp/log/${applicationName}" />
+    <!-- 控制台输出 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- 按照每天生成日志文件 -->
+    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_HOME}/${applicationName}.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/${applicationName}-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>30</MaxHistory>
+            <MaxFileSize>1024MB</MaxFileSize>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- 日志输出级别 -->
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+        <appender-ref ref="FILE" />
+    </root>
+
+</configuration>