浏览代码

Merge branch 'dev/ez-security210625' into dev/ez-analyze210917

rengb 3 年之前
父节点
当前提交
e967db7622
共有 58 个文件被更改,包括 1667 次插入991 次删除
  1. 5 0
      common/src/main/java/com/lantone/common/dto/AbnormalLogDTO.java
  2. 2 0
      common/src/main/java/com/lantone/common/dto/GetDataAuthDeptDTO.java
  3. 19 0
      common/src/main/java/com/lantone/common/dto/GetRealHospitalDTO.java
  4. 4 0
      common/src/main/java/com/lantone/common/dto/OperationLogDTO.java
  5. 4 0
      common/src/main/java/com/lantone/common/util/AddressUtils.java
  6. 50 60
      common/src/main/java/com/lantone/common/util/IpUtils.java
  7. 2 2
      common/src/main/java/com/lantone/common/vo/AddNoticeVO.java
  8. 2 0
      common/src/main/java/com/lantone/common/vo/GetMyNoticeListVO.java
  9. 3 3
      common/src/main/java/com/lantone/common/vo/SaveDictionaryVO.java
  10. 2 1
      common/src/main/java/com/lantone/common/vo/SaveHospitalSetVO.java
  11. 5 2
      config-center/src/main/resources/bootstrap.yml
  12. 53 102
      config-center/src/main/resources/logback-spring.xml
  13. 16 0
      config-center/src/main/resources/shared/structure-center-debug.yml
  14. 0 14
      config-center/src/main/resources/shared/structure-center-dev.yml
  15. 30 0
      config-center/src/main/resources/shared/structure-center-inner.yml
  16. 16 0
      config-center/src/main/resources/shared/structure-center-local.yml
  17. 0 14
      config-center/src/main/resources/shared/structure-center-master.yml
  18. 30 0
      config-center/src/main/resources/shared/structure-center-outer.yml
  19. 16 0
      config-center/src/main/resources/shared/structure-center-test.yml
  20. 6 0
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/entity/NoticeUser.java
  21. 6 0
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/DeptUserMapper.java
  22. 1 1
      dblayer-mbg/src/main/resources/application-debug.yml
  23. 11 2
      dblayer-mbg/src/main/resources/mapper/AbnormalLogMapper.xml
  24. 9 6
      dblayer-mbg/src/main/resources/mapper/DeptMapper.xml
  25. 18 0
      dblayer-mbg/src/main/resources/mapper/DeptUserMapper.xml
  26. 1 0
      dblayer-mbg/src/main/resources/mapper/LoginLogMapper.xml
  27. 3 0
      dblayer-mbg/src/main/resources/mapper/NoticeUserMapper.xml
  28. 11 2
      dblayer-mbg/src/main/resources/mapper/OperationLogMapper.xml
  29. 1 0
      dblayer-mbg/src/main/resources/mapper/base/BaseNoticeUserMapper.xml
  30. 1 1
      dblayer-mbg/src/test/java/com/lantone/dblayermbg/CodeAutoGenerator.java
  31. 148 0
      document/docker/docker-compose-debug.yml
  32. 148 0
      document/docker/docker-compose-inner.yml
  33. 148 0
      document/docker/docker-compose-outer.yml
  34. 148 0
      document/docker/docker-compose-test.yml
  35. 182 0
      document/docker/wait-for-it.sh
  36. 6 3
      gateway-service/src/main/resources/bootstrap.yml
  37. 53 102
      gateway-service/src/main/resources/logback-spring.xml
  38. 5 2
      message-service/src/main/resources/bootstrap.yml
  39. 53 102
      message-service/src/main/resources/logback-spring.xml
  40. 4 2
      monitor-service/src/main/resources/application.yml
  41. 53 102
      monitor-service/src/main/resources/logback-spring.xml
  42. 36 8
      pom.xml
  43. 8 7
      register-center/src/main/resources/bootstrap.yml
  44. 53 102
      register-center/src/main/resources/logback-spring.xml
  45. 13 3
      security-center/src/main/java/com/lantone/security/aop/LogAspect.java
  46. 5 3
      security-center/src/main/java/com/lantone/security/facade/DataAuthManagementFacade.java
  47. 3 0
      security-center/src/main/java/com/lantone/security/facade/DictionaryManagementFacade.java
  48. 26 8
      security-center/src/main/java/com/lantone/security/facade/HospitalSetManagementFacade.java
  49. 43 24
      security-center/src/main/java/com/lantone/security/facade/NoticeManagementFacade.java
  50. 2 1
      security-center/src/main/java/com/lantone/security/web/HospitalSetManagementController.java
  51. 5 2
      security-center/src/main/resources/bootstrap.yml
  52. 53 102
      security-center/src/main/resources/logback-spring.xml
  53. 13 0
      structure-center/src/main/java/com/lantone/structure/config/RedisConfig.java
  54. 16 0
      structure-center/src/main/java/com/lantone/structure/config/SwaggerConfig.java
  55. 5 2
      structure-center/src/main/resources/bootstrap.yml
  56. 53 102
      structure-center/src/main/resources/logback-spring.xml
  57. 5 2
      user-auth/src/main/resources/bootstrap.yml
  58. 53 102
      user-auth/src/main/resources/logback-spring.xml

+ 5 - 0
common/src/main/java/com/lantone/common/dto/AbnormalLogDTO.java

@@ -68,4 +68,9 @@ public class AbnormalLogDTO implements Serializable {
      * 记录创建时间
      */
     private Date gmtCreate;
+
+    /**
+     * 记录
+     */
+    private String remark;
 }

+ 2 - 0
common/src/main/java/com/lantone/common/dto/GetDataAuthDeptDTO.java

@@ -12,6 +12,8 @@ import lombok.Data;
 public class GetDataAuthDeptDTO {
     @ApiModelProperty(value = "医院id")
     private Long hospitalId;
+    @ApiModelProperty(value = "医院名称")
+    private String hospitalName;
     @ApiModelProperty(value = "科室id")
     private Long id;
     @ApiModelProperty(value = "科室名称")

+ 19 - 0
common/src/main/java/com/lantone/common/dto/GetRealHospitalDTO.java

@@ -0,0 +1,19 @@
+package com.lantone.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description:
+ * @Author: cy
+ * @time: 2021/11/9 14:28
+ */
+@Data
+public class GetRealHospitalDTO {
+
+    @ApiModelProperty(value = "编号")
+    private Long hospitalId;
+
+    @ApiModelProperty(value = "名称")
+    private String hospitalName;
+}

+ 4 - 0
common/src/main/java/com/lantone/common/dto/OperationLogDTO.java

@@ -79,4 +79,8 @@ public class OperationLogDTO implements Serializable {
      */
     private Date gmtCreate;
 
+    /**
+     * 记录
+     */
+    private String remark;
 }

+ 4 - 0
common/src/main/java/com/lantone/common/util/AddressUtils.java

@@ -1,6 +1,7 @@
 package com.lantone.common.util;
 
 import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,6 +22,9 @@ public class AddressUtils {
 
     public static String getRealAddressByIP(String ip) {
         String address = UNKNOWN;
+        if(StringUtils.isBlank(ip)){
+            return UNKNOWN;
+        }
         // 内网不查询
         if (IpUtils.internalIp(ip)) {
             return "内网IP";

+ 50 - 60
common/src/main/java/com/lantone/common/util/IpUtils.java

@@ -11,6 +11,11 @@ import java.net.UnknownHostException;
  */
 
 public class IpUtils {
+
+    private static final int INADDR4SZ = 4;
+    private static final int INADDR16SZ = 16;
+    private static final int INT16SZ = 2;
+
     public static String getIpAddr(HttpServletRequest request) {
         if (request == null) {
             return "unknown";
@@ -76,75 +81,55 @@ public class IpUtils {
     /**
      * 将IPv4地址转换成字节
      *
-     * @param text IPv4地址
+     * @param src IPv4地址
      * @return byte 字节
      */
-    public static byte[] textToNumericFormatV4(String text) {
-        if (text.length() == 0) {
+    public static byte[] textToNumericFormatV4(String src)
+    {
+        byte[] res = new byte[INADDR4SZ];
+
+        long tmpValue = 0;
+        int currByte = 0;
+        boolean newOctet = true;
+
+        int len = src.length();
+        if (len == 0 || len > 15) {
             return null;
         }
 
-        byte[] bytes = new byte[4];
-        String[] elements = text.split("\\.", -1);
-        try {
-            long l;
-            int i;
-            switch (elements.length) {
-                case 1:
-                    l = Long.parseLong(elements[0]);
-                    if ((l < 0L) || (l > 4294967295L)) {
-                        return null;
-                    }
-                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
-                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
-                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
-                    bytes[3] = (byte) (int) (l & 0xFF);
-                    break;
-                case 2:
-                    l = Integer.parseInt(elements[0]);
-                    if ((l < 0L) || (l > 255L)) {
-                        return null;
-                    }
-                    bytes[0] = (byte) (int) (l & 0xFF);
-                    l = Integer.parseInt(elements[1]);
-                    if ((l < 0L) || (l > 16777215L)) {
-                        return null;
-                    }
-                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
-                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
-                    bytes[3] = (byte) (int) (l & 0xFF);
-                    break;
-                case 3:
-                    for (i = 0; i < 2; ++i) {
-                        l = Integer.parseInt(elements[i]);
-                        if ((l < 0L) || (l > 255L)) {
-                            return null;
-                        }
-                        bytes[i] = (byte) (int) (l & 0xFF);
-                    }
-                    l = Integer.parseInt(elements[2]);
-                    if ((l < 0L) || (l > 65535L)) {
-                        return null;
-                    }
-                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
-                    bytes[3] = (byte) (int) (l & 0xFF);
-                    break;
-                case 4:
-                    for (i = 0; i < 4; ++i) {
-                        l = Integer.parseInt(elements[i]);
-                        if ((l < 0L) || (l > 255L)) {
-                            return null;
-                        }
-                        bytes[i] = (byte) (int) (l & 0xFF);
-                    }
-                    break;
-                default:
+        for (int i = 0; i < len; i++) {
+            char c = src.charAt(i);
+            if (c == '.') {
+                if (newOctet || tmpValue < 0 || tmpValue > 0xff || currByte == 3) {
+                    return null;
+                }
+                res[currByte++] = (byte) (tmpValue & 0xff);
+                tmpValue = 0;
+                newOctet = true;
+            } else {
+                int digit = Character.digit(c, 10);
+                if (digit < 0) {
                     return null;
+                }
+                tmpValue *= 10;
+                tmpValue += digit;
+                newOctet = false;
             }
-        } catch (NumberFormatException e) {
+        }
+        if (newOctet || tmpValue < 0 || tmpValue >= (1L << ((4 - currByte) * 8))) {
             return null;
         }
-        return bytes;
+        switch (currByte) {
+            case 0:
+                res[0] = (byte) ((tmpValue >> 24) & 0xff);
+            case 1:
+                res[1] = (byte) ((tmpValue >> 16) & 0xff);
+            case 2:
+                res[2] = (byte) ((tmpValue >>  8) & 0xff);
+            case 3:
+                res[3] = (byte) ((tmpValue >>  0) & 0xff);
+        }
+        return res;
     }
 
     public static String getHostIp() {
@@ -162,4 +147,9 @@ public class IpUtils {
         }
         return "未知";
     }
+
+    public static boolean isIPv4LiteralAddress(String src) {
+        return textToNumericFormatV4(src) != null;
+    }
+
 }

+ 2 - 2
common/src/main/java/com/lantone/common/vo/AddNoticeVO.java

@@ -26,8 +26,8 @@ public class AddNoticeVO {
     @ApiModelProperty(value = "通知内容",required = true)
     @NotBlank(message = "通知内容不能为空")
     private String content;
-    @ApiModelProperty(value = "发送用户集合")
-    private List<Long> sendUsers;
+    @ApiModelProperty(value = "发送用户集合 组织id-用户id")
+    private List<String> sendUsers;
     @ApiModelProperty(value = "发送科室集合")
     private List<Long> sendDepts;
     @ApiModelProperty(value = "发送医院集合")

+ 2 - 0
common/src/main/java/com/lantone/common/vo/GetMyNoticeListVO.java

@@ -14,6 +14,8 @@ import javax.validation.constraints.NotBlank;
 @Data
 public class GetMyNoticeListVO extends BasePageVo {
 
+    @ApiModelProperty(value = "我的通知组织id" ,hidden = true)
+    private Long hospitalId;
     @ApiModelProperty(value = "我的通知用户id" ,hidden = true)
     private Long id;
     @ApiModelProperty(value = "通知类型 0:公告,1:其他")

+ 3 - 3
common/src/main/java/com/lantone/common/vo/SaveDictionaryVO.java

@@ -24,7 +24,7 @@ public class SaveDictionaryVO implements Serializable {
 
     @ApiModelProperty(value = "代码类别",required = true)
     @NotNull(message = "代码类别不能为空")
-    private Long groupType;
+    private String groupType;
 
     @ApiModelProperty(value = "代码名称",required = true)
     @NotBlank(message = "代码名称不能为空")
@@ -35,8 +35,8 @@ public class SaveDictionaryVO implements Serializable {
     private String val;
 
     @ApiModelProperty(value = "是否启用(0-否 1-是)",required = true)
-    @NotNull(message = "是否启用不能为空")
-    private Long status;
+    @NotBlank(message = "是否启用不能为空")
+    private String status;
 
     @ApiModelProperty(value = "字典说明",required = true)
     @NotBlank(message = "字典说明不能为空")

+ 2 - 1
common/src/main/java/com/lantone/common/vo/SaveHospitalSetVO.java

@@ -2,6 +2,7 @@ package com.lantone.common.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 /**
@@ -22,7 +23,7 @@ public class SaveHospitalSetVO implements Serializable {
     /**
      * 组织机构ID
      */
-    @ApiModelProperty(value = "医院id",hidden = true)
+    @ApiModelProperty(value = "医院id")
     private Long hospitalId;
 
     /**

+ 5 - 2
config-center/src/main/resources/bootstrap.yml

@@ -15,11 +15,14 @@ spring:
 eureka:
   client:
     service-url:
-      defaultZone: http://localhost:6751/eureka/
+      defaultZone: http://${eureka-addr:localhost}:${eureka-port:6751}/eureka/
 
 logging:
   config: classpath:logback-spring.xml
-  file: logs/config-center/log_info.log
+  level:
+    root: ${log-level:info}
+  file:
+    path: /logs/config-center
 
 management:
   endpoints:

+ 53 - 102
config-center/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="config-center"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/config-center" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+    
 </configuration>

+ 16 - 0
config-center/src/main/resources/shared/structure-center-debug.yml

@@ -1,3 +1,19 @@
+spring:
+  redis:
+    database: 12
+    host: 192.168.2.237 # Redis服务器地址
+    port: 63791 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
+    password: emrais # Redis服务器连接密码(默认为空)
+    jedis:
+      pool:
+        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
+        max-idle: 5 # 连接池中的最大空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        min-idle: 0 # 连接池中的最小空闲连接
+    timeout: 20000 # 连接超时时间(毫秒)
+
+swagger.show: true
+
 CRF:
   url: http://192.168.2.234:3457/api/mr_info_ex/entity_predict
 

+ 0 - 14
config-center/src/main/resources/shared/structure-center-dev.yml

@@ -1,14 +0,0 @@
-CRF:
-  url: http://192.168.2.234:3457/api/mr_info_ex/entity_predict
-
-Similarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/similarity
-
-NewSimilarity:
-  url: http://192.168.2.234:23232/api/similarity
-
-NewBatchSimilarity:
-  url: http://192.168.2.234:23232/api/similarity_batch
-
-ChiefPresentSimilarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/chief_present_similarity

+ 30 - 0
config-center/src/main/resources/shared/structure-center-inner.yml

@@ -0,0 +1,30 @@
+spring:
+  redis:
+    database: 12
+    host: 192.168.2.237 # Redis服务器地址
+    port: 63791 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
+    password: emrais # Redis服务器连接密码(默认为空)
+    jedis:
+      pool:
+        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
+        max-idle: 5 # 连接池中的最大空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        min-idle: 0 # 连接池中的最小空闲连接
+    timeout: 20000 # 连接超时时间(毫秒)
+
+swagger.show: false
+
+CRF:
+  url: http://192.168.2.234:3457/api/mr_info_ex/entity_predict
+
+Similarity:
+  url: http://192.168.2.234:3456/api/mr_info_ex/similarity
+
+NewSimilarity:
+  url: http://192.168.2.234:23232/api/similarity
+
+NewBatchSimilarity:
+  url: http://192.168.2.234:23232/api/similarity_batch
+
+ChiefPresentSimilarity:
+  url: http://192.168.2.234:3456/api/mr_info_ex/chief_present_similarity

+ 16 - 0
config-center/src/main/resources/shared/structure-center-local.yml

@@ -1,3 +1,19 @@
+spring:
+  redis:
+    database: 12
+    host: 192.168.2.237 # Redis服务器地址
+    port: 63791 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
+    password: emrais # Redis服务器连接密码(默认为空)
+    jedis:
+      pool:
+        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
+        max-idle: 5 # 连接池中的最大空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        min-idle: 0 # 连接池中的最小空闲连接
+    timeout: 20000 # 连接超时时间(毫秒)
+
+swagger.show: true
+
 CRF:
   url: http://192.168.2.234:3457/api/mr_info_ex/entity_predict
 

+ 0 - 14
config-center/src/main/resources/shared/structure-center-master.yml

@@ -1,14 +0,0 @@
-CRF:
-  url: http://192.168.2.234:3457/api/mr_info_ex/entity_predict
-
-Similarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/similarity
-
-NewSimilarity:
-  url: http://192.168.2.234:23232/api/similarity
-
-NewBatchSimilarity:
-  url: http://192.168.2.234:23232/api/similarity_batch
-
-ChiefPresentSimilarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/chief_present_similarity

+ 30 - 0
config-center/src/main/resources/shared/structure-center-outer.yml

@@ -0,0 +1,30 @@
+spring:
+  redis:
+    database: 12
+    host: 192.168.2.237 # Redis服务器地址
+    port: 63791 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
+    password: emrais # Redis服务器连接密码(默认为空)
+    jedis:
+      pool:
+        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
+        max-idle: 5 # 连接池中的最大空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        min-idle: 0 # 连接池中的最小空闲连接
+    timeout: 20000 # 连接超时时间(毫秒)
+
+swagger.show: false
+
+CRF:
+  url: http://192.168.2.234:3457/api/mr_info_ex/entity_predict
+
+Similarity:
+  url: http://192.168.2.234:3456/api/mr_info_ex/similarity
+
+NewSimilarity:
+  url: http://192.168.2.234:23232/api/similarity
+
+NewBatchSimilarity:
+  url: http://192.168.2.234:23232/api/similarity_batch
+
+ChiefPresentSimilarity:
+  url: http://192.168.2.234:3456/api/mr_info_ex/chief_present_similarity

+ 16 - 0
config-center/src/main/resources/shared/structure-center-test.yml

@@ -1,3 +1,19 @@
+spring:
+  redis:
+    database: 12
+    host: 192.168.2.237 # Redis服务器地址
+    port: 63791 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
+    password: emrais # Redis服务器连接密码(默认为空)
+    jedis:
+      pool:
+        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
+        max-idle: 5 # 连接池中的最大空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        min-idle: 0 # 连接池中的最小空闲连接
+    timeout: 20000 # 连接超时时间(毫秒)
+
+swagger.show: true
+
 CRF:
   url: http://192.168.2.234:3457/api/mr_info_ex/entity_predict
 

+ 6 - 0
dblayer-mbg/src/main/java/com/lantone/dblayermbg/entity/NoticeUser.java

@@ -28,6 +28,12 @@ public class NoticeUser implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    /**
+     * 组织id
+     */
+    @TableField("hospital_id")
+    private Long hospitalId;
+
     /**
      * 用户ID
      */

+ 6 - 0
dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/DeptUserMapper.java

@@ -2,6 +2,11 @@ package com.lantone.dblayermbg.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.lantone.dblayermbg.entity.DeptUser;
+import com.lantone.dblayermbg.entity.HospitalUser;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.stream.DoubleStream;
 
 /**
  * <p>
@@ -10,4 +15,5 @@ import com.lantone.dblayermbg.entity.DeptUser;
  */
 public interface DeptUserMapper extends BaseMapper<DeptUser> {
 
+    List<HospitalUser> getDeptUser(@Param("depts") List<Long> depts);
 }

+ 1 - 1
dblayer-mbg/src/main/resources/application-debug.yml

@@ -3,7 +3,7 @@ spring:
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
       platform: mysql
-      url: jdbc:mysql://192.168.2.236:3306/emrais?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
+      url: jdbc:mysql://192.168.2.237:3306/emrais?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
       username: root
       password: lantone
       # 连接池的配置信息

+ 11 - 2
dblayer-mbg/src/main/resources/mapper/AbnormalLogMapper.xml

@@ -2,8 +2,16 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.lantone.dblayermbg.mapper.AbnormalLogMapper">
     <insert id="addOperErrorLog">
-    insert into sys_abnormal_log(operation_id,operation_name,operation_ip,operation_agent,operation_error_info,operation_method,operation_way,operation_url,operation_param,gmt_create)
-    values (#{operationId},#{operationName},INET_ATON(#{operationIp}),#{operationAgent},#{operationErrorInfo},#{operationMethod},#{operationWay},#{operationUrl},#{operationParam},#{gmtCreate})
+        insert into
+        sys_abnormal_log(operation_id,operation_name,operation_ip,operation_agent,operation_error_info,operation_method,operation_way,operation_url,operation_param,gmt_create)
+        values (#{operationId},#{operationName},
+        <choose>
+            <when test="operationIp != null || operationIp = !''">
+                INET_ATON(#{operationIp}),
+            </when>
+            <otherwise>#{operationIp}),</otherwise>
+        </choose>
+        #{operationAgent},#{operationErrorInfo},#{operationMethod},#{operationWay},#{operationUrl},#{operationParam},#{gmtCreate})
     </insert>
 
     <select id="getAbnormalLog" resultType="com.lantone.common.dto.AbnormalLogDTO">
@@ -29,6 +37,7 @@
         <if test="operationIp != null and operationIp != ''">
             AND INET_NTOA(a.operation_ip) like CONCAT('%',#{operationIp},'%')
         </if>
+        order by a.gmt_create desc
     </select>
 
     <select id="getAbnormalLogWayAndIp" resultType="java.lang.String">

+ 9 - 6
dblayer-mbg/src/main/resources/mapper/DeptMapper.xml

@@ -43,14 +43,17 @@
     </select>
     <select id="getDepts" resultType="com.lantone.common.dto.GetDataAuthDeptDTO">
         SELECT
-            d.id,
-          d.hospital_id hospitalId,
-            d.`name`,
-            2 detailType
+        d.id,
+        d.hospital_id hospitalId,
+        h.`name` hospitalName,
+        d.`name`,
+        2 detailType
         FROM
-            sys_dept d
+        sys_dept d
+        LEFT JOIN sys_hospital h ON h.id = d.hospital_id
+        AND h.is_deleted = 'N'
         WHERE
-            d.is_deleted = 'N'
+        d.is_deleted = 'N'
         AND d.`status` = 1
         <if test="deptIds !=null and deptIds.size!=0">
             AND d.id IN

+ 18 - 0
dblayer-mbg/src/main/resources/mapper/DeptUserMapper.xml

@@ -2,4 +2,22 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.lantone.dblayermbg.mapper.DeptUserMapper">
 
+    <select id="getDeptUser" resultType="com.lantone.dblayermbg.entity.HospitalUser">
+        SELECT DISTINCT
+            du.user_id userId,
+            d.hospital_id hospitalId
+        FROM
+            `sys_dept_user` du,
+            sys_dept d
+        WHERE
+          du.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND	d.id = du.dept_id
+        <if test="depts !=null and depts.size!=0">
+            AND du.dept_id IN
+            <foreach collection="depts" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+    </select>
 </mapper>

+ 1 - 0
dblayer-mbg/src/main/resources/mapper/LoginLogMapper.xml

@@ -23,6 +23,7 @@
         <if test="loginIp != null and loginIp != ''">
             AND INET_NTOA(a.login_ip) like CONCAT('%',#{loginIp},'%')
         </if>
+        order by a.login_date desc
     </select>
 
     <select id="getLoginLogNameAndIp" resultType="java.lang.String">

+ 3 - 0
dblayer-mbg/src/main/resources/mapper/NoticeUserMapper.xml

@@ -39,6 +39,9 @@
         u.is_deleted = 'N'
         AND n.is_deleted = 'N'
         AND u.notice_id = n.id
+        <if test="getMyNoticeListVO.hospitalId != null">
+            AND u.hospital_id = #{getMyNoticeListVO.hospitalId}
+        </if>
         <if test="getMyNoticeListVO.id != null">
             AND u.user_id = #{getMyNoticeListVO.id}
         </if>

+ 11 - 2
dblayer-mbg/src/main/resources/mapper/OperationLogMapper.xml

@@ -2,8 +2,16 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.lantone.dblayermbg.mapper.OperationLogMapper">
     <insert id="addOperLog">
-    insert into sys_operation_log(operation_id,operation_name,operation_date,operation_ip,operation_address,operation_method,operation_way,operation_url,operation_param,json_result,gmt_create)
-    values (#{operationId},#{operationName},#{operationDate},INET_ATON(#{operationIp}),#{operationAddress},#{operationMethod},#{operationWay},#{operationUrl},#{operationParam},#{jsonResult},#{gmtCreate})
+        insert into
+        sys_operation_log(operation_id,operation_name,operation_date,operation_ip,operation_address,operation_method,operation_way,operation_url,operation_param,json_result,gmt_create,remark)
+        values (#{operationId},#{operationName},#{operationDate},
+        <choose>
+            <when test="operationIp != null || operationIp = !''">
+                INET_ATON(#{operationIp}),
+            </when>
+            <otherwise>#{operationIp}),</otherwise>
+        </choose>
+        #{operationAddress},#{operationMethod},#{operationWay},#{operationUrl},#{operationParam},#{jsonResult},#{gmtCreate},#{remark})
     </insert>
 
     <select id="getOperationLog" resultType="com.lantone.common.dto.OperationLogDTO">
@@ -30,5 +38,6 @@
             <![CDATA[ AND a.operation_date >= #{startDate}]]>
             <![CDATA[ AND a.operation_date <= #{endDate}]]>
         </if>
+        order by a.operation_date desc
     </select>
 </mapper>

+ 1 - 0
dblayer-mbg/src/main/resources/mapper/base/BaseNoticeUserMapper.xml

@@ -5,6 +5,7 @@
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.lantone.dblayermbg.entity.NoticeUser">
         <id column="id" property="id"/>
+        <result column="hospital_id" property="hospitalId"/>
         <result column="user_id" property="userId"/>
         <result column="notice_id" property="noticeId"/>
         <result column="status" property="status"/>

+ 1 - 1
dblayer-mbg/src/test/java/com/lantone/dblayermbg/CodeAutoGenerator.java

@@ -14,7 +14,7 @@ public class CodeAutoGenerator {
      */
     private static String username = "root";
     private static String password = "lantone";
-    private static String url = "jdbc:mysql://192.168.2.236:3306/emrais?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
+    private static String url = "jdbc:mysql://192.168.2.237:3306/emrais?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
 
     /**
      * 表名

+ 148 - 0
document/docker/docker-compose-debug.yml

@@ -0,0 +1,148 @@
+version: '3'
+services:
+  register-center:
+    image: 192.168.2.125:4490/emrais.debug/register-center:latest
+    container_name: register-center
+    ports:
+      - 6751:6751
+    environment:
+      - TZ=Asia/Shanghai
+      - monitor-addr=monitor-service
+      - monitor-port=9985
+      - monitor-username=admin
+      - monitor-password=lantone
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    command: ["java", "-jar", "/app.jar"]
+  config-center:
+    image: 192.168.2.125:4490/emrais.debug/config-center:latest
+    container_name: config-center
+    ports:
+      - 7751:7751
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  monitor-service:
+    image: 192.168.2.125:4490/emrais.debug/monitor-service:latest
+    container_name: monitor-service
+    ports:
+      - 9985:9985
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  security-center:
+    image: 192.168.2.125:4490/emrais.debug/security-center:latest
+    container_name: security-center
+    ports:
+      - 8849:8849
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=debug
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  user-auth:
+    image: 192.168.2.125:4490/emrais.debug/user-auth:latest
+    container_name: user-auth
+    ports:
+      - 8869:8869
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  message-service:
+    image: 192.168.2.125:4490/emrais.debug/message-service:latest
+    container_name: message-service
+    ports:
+      - 8879:8879
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=debug
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  structure-center:
+    image: 192.168.2.125:4490/emrais.debug/structure-center:latest
+    container_name: structure-center
+    ports:
+      - 8859:8859
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=debug
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  gateway-service:
+    image: 192.168.2.125:4490/emrais.debug/gateway-service:latest
+    container_name: gateway-service
+    ports:
+      - 8871:8871
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - gateway-addr=gateway-service
+      - gateway-port=8871
+      - spring.profiles.active=debug
+      - log-level=debug
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]

+ 148 - 0
document/docker/docker-compose-inner.yml

@@ -0,0 +1,148 @@
+version: '3'
+services:
+  register-center:
+    image: 192.168.2.125:4490/emrais.inner/register-center:latest
+    container_name: register-center
+    ports:
+      - 6751:6751
+    environment:
+      - TZ=Asia/Shanghai
+      - monitor-addr=monitor-service
+      - monitor-port=9985
+      - monitor-username=admin
+      - monitor-password=lantone
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    command: ["java", "-jar", "/app.jar"]
+  config-center:
+    image: 192.168.2.125:4490/emrais.inner/config-center:latest
+    container_name: config-center
+    ports:
+      - 7751:7751
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  monitor-service:
+    image: 192.168.2.125:4490/emrais.inner/monitor-service:latest
+    container_name: monitor-service
+    ports:
+      - 9985:9985
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  security-center:
+    image: 192.168.2.125:4490/emrais.inner/security-center:latest
+    container_name: security-center
+    ports:
+      - 8849:8849
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=inner
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  user-auth:
+    image: 192.168.2.125:4490/emrais.inner/user-auth:latest
+    container_name: user-auth
+    ports:
+      - 8869:8869
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  message-service:
+    image: 192.168.2.125:4490/emrais.inner/message-service:latest
+    container_name: message-service
+    ports:
+      - 8879:8879
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=inner
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  structure-center:
+    image: 192.168.2.125:4490/emrais.inner/structure-center:latest
+    container_name: structure-center
+    ports:
+      - 8859:8859
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=inner
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  gateway-service:
+    image: 192.168.2.125:4490/emrais.inner/gateway-service:latest
+    container_name: gateway-service
+    ports:
+      - 8871:8871
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - gateway-addr=gateway-service
+      - gateway-port=8871
+      - spring.profiles.active=inner
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]

+ 148 - 0
document/docker/docker-compose-outer.yml

@@ -0,0 +1,148 @@
+version: '3'
+services:
+  register-center:
+    image: 192.168.2.125:4490/emrais.outer/register-center:latest
+    container_name: register-center
+    ports:
+      - 6751:6751
+    environment:
+      - TZ=Asia/Shanghai
+      - monitor-addr=monitor-service
+      - monitor-port=9985
+      - monitor-username=admin
+      - monitor-password=lantone
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    command: ["java", "-jar", "/app.jar"]
+  config-center:
+    image: 192.168.2.125:4490/emrais.outer/config-center:latest
+    container_name: config-center
+    ports:
+      - 7751:7751
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  monitor-service:
+    image: 192.168.2.125:4490/emrais.outer/monitor-service:latest
+    container_name: monitor-service
+    ports:
+      - 9985:9985
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  security-center:
+    image: 192.168.2.125:4490/emrais.outer/security-center:latest
+    container_name: security-center
+    ports:
+      - 8849:8849
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=outer
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  user-auth:
+    image: 192.168.2.125:4490/emrais.outer/user-auth:latest
+    container_name: user-auth
+    ports:
+      - 8869:8869
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  message-service:
+    image: 192.168.2.125:4490/emrais.outer/message-service:latest
+    container_name: message-service
+    ports:
+      - 8879:8879
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=outer
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  structure-center:
+    image: 192.168.2.125:4490/emrais.outer/structure-center:latest
+    container_name: structure-center
+    ports:
+      - 8859:8859
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=outer
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  gateway-service:
+    image: 192.168.2.125:4490/emrais.outer/gateway-service:latest
+    container_name: gateway-service
+    ports:
+      - 8871:8871
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - gateway-addr=gateway-service
+      - gateway-port=8871
+      - spring.profiles.active=outer
+      - log-level=error
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]

+ 148 - 0
document/docker/docker-compose-test.yml

@@ -0,0 +1,148 @@
+version: '3'
+services:
+  register-center:
+    image: 192.168.2.125:4490/emrais.test/register-center:latest
+    container_name: register-center
+    ports:
+      - 6751:6751
+    environment:
+      - TZ=Asia/Shanghai
+      - monitor-addr=monitor-service
+      - monitor-port=9985
+      - monitor-username=admin
+      - monitor-password=lantone
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    command: ["java", "-jar", "/app.jar"]
+  config-center:
+    image: 192.168.2.125:4490/emrais.test/config-center:latest
+    container_name: config-center
+    ports:
+      - 7751:7751
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  monitor-service:
+    image: 192.168.2.125:4490/emrais.test/monitor-service:latest
+    container_name: monitor-service
+    ports:
+      - 9985:9985
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  security-center:
+    image: 192.168.2.125:4490/emrais.test/security-center:latest
+    container_name: security-center
+    ports:
+      - 8849:8849
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=test
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  user-auth:
+    image: 192.168.2.125:4490/emrais.test/user-auth:latest
+    container_name: user-auth
+    ports:
+      - 8869:8869
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+    command: ["/wait-for-it.sh", "-t", "6000", "register-center:6751", "--", "java", "-jar", "/app.jar"]
+  message-service:
+    image: 192.168.2.125:4490/emrais.test/message-service:latest
+    container_name: message-service
+    ports:
+      - 8879:8879
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=test
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  structure-center:
+    image: 192.168.2.125:4490/emrais.test/structure-center:latest
+    container_name: structure-center
+    ports:
+      - 8859:8859
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - spring.profiles.active=test
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]
+  gateway-service:
+    image: 192.168.2.125:4490/emrais.test/gateway-service:latest
+    container_name: gateway-service
+    ports:
+      - 8871:8871
+    environment:
+      - TZ=Asia/Shanghai
+      - eureka-addr=register-center
+      - eureka-port=6751
+      - gateway-addr=gateway-service
+      - gateway-port=8871
+      - spring.profiles.active=test
+      - log-level=info
+    volumes:
+      - /logs:/logs
+      - /etc/localtime:/etc/localtime
+    restart: always
+    depends_on:
+      - register-center
+      - config-center
+    command: ["/wait-for-it.sh", "-t", "6000", "config-center:7751", "--", "java", "-jar", "/app.jar"]

+ 182 - 0
document/docker/wait-for-it.sh

@@ -0,0 +1,182 @@
+#!/usr/bin/env bash
+# Use this script to test if a given TCP host/port are available
+
+WAITFORIT_cmdname=${0##*/}
+
+echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
+
+usage()
+{
+    cat << USAGE >&2
+Usage:
+    $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
+    -h HOST | --host=HOST       Host or IP under test
+    -p PORT | --port=PORT       TCP port under test
+                                Alternatively, you specify the host and port as host:port
+    -s | --strict               Only execute subcommand if the test succeeds
+    -q | --quiet                Don't output any status messages
+    -t TIMEOUT | --timeout=TIMEOUT
+                                Timeout in seconds, zero for no timeout
+    -- COMMAND ARGS             Execute command with args after the test finishes
+USAGE
+    exit 1
+}
+
+wait_for()
+{
+    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
+        echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
+    else
+        echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
+    fi
+    WAITFORIT_start_ts=$(date +%s)
+    while :
+    do
+        if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
+            nc -z $WAITFORIT_HOST $WAITFORIT_PORT
+            WAITFORIT_result=$?
+        else
+            (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
+            WAITFORIT_result=$?
+        fi
+        if [[ $WAITFORIT_result -eq 0 ]]; then
+            WAITFORIT_end_ts=$(date +%s)
+            echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
+            break
+        fi
+        sleep 1
+    done
+    return $WAITFORIT_result
+}
+
+wait_for_wrapper()
+{
+    # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
+    if [[ $WAITFORIT_QUIET -eq 1 ]]; then
+        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
+    else
+        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
+    fi
+    WAITFORIT_PID=$!
+    trap "kill -INT -$WAITFORIT_PID" INT
+    wait $WAITFORIT_PID
+    WAITFORIT_RESULT=$?
+    if [[ $WAITFORIT_RESULT -ne 0 ]]; then
+        echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
+    fi
+    return $WAITFORIT_RESULT
+}
+
+# process arguments
+while [[ $# -gt 0 ]]
+do
+    case "$1" in
+        *:* )
+        WAITFORIT_hostport=(${1//:/ })
+        WAITFORIT_HOST=${WAITFORIT_hostport[0]}
+        WAITFORIT_PORT=${WAITFORIT_hostport[1]}
+        shift 1
+        ;;
+        --child)
+        WAITFORIT_CHILD=1
+        shift 1
+        ;;
+        -q | --quiet)
+        WAITFORIT_QUIET=1
+        shift 1
+        ;;
+        -s | --strict)
+        WAITFORIT_STRICT=1
+        shift 1
+        ;;
+        -h)
+        WAITFORIT_HOST="$2"
+        if [[ $WAITFORIT_HOST == "" ]]; then break; fi
+        shift 2
+        ;;
+        --host=*)
+        WAITFORIT_HOST="${1#*=}"
+        shift 1
+        ;;
+        -p)
+        WAITFORIT_PORT="$2"
+        if [[ $WAITFORIT_PORT == "" ]]; then break; fi
+        shift 2
+        ;;
+        --port=*)
+        WAITFORIT_PORT="${1#*=}"
+        shift 1
+        ;;
+        -t)
+        WAITFORIT_TIMEOUT="$2"
+        if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
+        shift 2
+        ;;
+        --timeout=*)
+        WAITFORIT_TIMEOUT="${1#*=}"
+        shift 1
+        ;;
+        --)
+        shift
+        WAITFORIT_CLI=("$@")
+        break
+        ;;
+        --help)
+        usage
+        ;;
+        *)
+        echoerr "Unknown argument: $1"
+        usage
+        ;;
+    esac
+done
+
+if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
+    echoerr "Error: you need to provide a host and port to test."
+    usage
+fi
+
+WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
+WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
+WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
+WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
+
+# Check to see if timeout is from busybox?
+WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
+WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
+
+WAITFORIT_BUSYTIMEFLAG=""
+if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
+    WAITFORIT_ISBUSY=1
+    # Check if busybox timeout uses -t flag
+    # (recent Alpine versions don't support -t anymore)
+    if timeout &>/dev/stdout | grep -q -e '-t '; then
+        WAITFORIT_BUSYTIMEFLAG="-t"
+    fi
+else
+    WAITFORIT_ISBUSY=0
+fi
+
+if [[ $WAITFORIT_CHILD -gt 0 ]]; then
+    wait_for
+    WAITFORIT_RESULT=$?
+    exit $WAITFORIT_RESULT
+else
+    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
+        wait_for_wrapper
+        WAITFORIT_RESULT=$?
+    else
+        wait_for
+        WAITFORIT_RESULT=$?
+    fi
+fi
+
+if [[ $WAITFORIT_CLI != "" ]]; then
+    if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
+        echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
+        exit $WAITFORIT_RESULT
+    fi
+    exec "${WAITFORIT_CLI[@]}"
+else
+    exit $WAITFORIT_RESULT
+fi

+ 6 - 3
gateway-service/src/main/resources/bootstrap.yml

@@ -8,7 +8,7 @@ spring:
     oauth2:
       resourceserver:
         jwt:
-          jwk-set-uri: 'http://localhost:8871/user-auth/rsa/publicKey' #配置RSA的公钥访问地址
+          jwk-set-uri: 'http://${gateway-addr:localhost}:${gateway-port:8871}/user-auth/rsa/publicKey' #配置RSA的公钥访问地址
   cloud:
     gateway:
       discovery:
@@ -49,11 +49,14 @@ spring:
 eureka:
   client:
     service-url:
-      defaultZone: http://localhost:6751/eureka/
+      defaultZone: http://${eureka-addr:localhost}:${eureka-port:6751}/eureka/
 
 logging:
   config: classpath:logback-spring.xml
-  file: logs/gateway-service/log_info.log
+  level:
+    root: ${log-level:info}
+  file:
+    path: /logs/gateway-service
 
 management:
   endpoints:

+ 53 - 102
gateway-service/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="gateway-service"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/gateway-service" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+
 </configuration>

+ 5 - 2
message-service/src/main/resources/bootstrap.yml

@@ -17,11 +17,14 @@ spring:
 eureka:
   client:
     service-url:
-      defaultZone: http://localhost:6751/eureka/
+      defaultZone: http://${eureka-addr:localhost}:${eureka-port:6751}/eureka/
 
 logging:
   config: classpath:logback-spring.xml
-  file: logs/message-service/log_info.log
+  level:
+    root: ${log-level:info}
+  file:
+    path: /logs/message-service
 
 management:
   endpoints:

+ 53 - 102
message-service/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="message-service"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/message-service" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+
 </configuration>

+ 4 - 2
monitor-service/src/main/resources/application.yml

@@ -16,7 +16,9 @@ spring:
 eureka:
   client:
     service-url:
-      defaultZone: http://localhost:6751/eureka/
+      defaultZone: http://${eureka-addr:localhost}:${eureka-port:6751}/eureka/
 
 logging:
-  config: classpath:logback-spring.xml
+  config: classpath:logback-spring.xml
+  level:
+    root: ${log-level:info}

+ 53 - 102
monitor-service/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="monitor-service"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/monitor-service" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+
 </configuration>

+ 36 - 8
pom.xml

@@ -62,8 +62,9 @@
         <txlcn-tc.version>5.0.2.RELEASE</txlcn-tc.version>
         <txlcn-txmsg-netty.version>5.0.2.RELEASE</txlcn-txmsg-netty.version>
         <docker-maven-plugin.version>1.2.2</docker-maven-plugin.version>
-        <docker.image.prefix>192.168.2.121:5000/diagbotcloud</docker.image.prefix>
-        <registryUrl>http://192.168.2.121:5000/repository/diagbotcloud/</registryUrl>
+        <registryUrl>192.168.2.125:4490</registryUrl>
+        <serverId>private-registry</serverId>
+        <harbor.folder>emrais</harbor.folder>
     </properties>
 
     <dependencyManagement>
@@ -282,6 +283,7 @@
         </dependency>
     </dependencies>
 
+    <!-- 打包(跳过docker):mvn clean package -DskipDocker -->
     <build>
         <pluginManagement>
             <plugins>
@@ -294,24 +296,50 @@
                     <artifactId>docker-maven-plugin</artifactId>
                     <version>${docker-maven-plugin.version}</version>
                     <configuration>
-                        <imageName>emrais/${project.artifactId}:${project.version}</imageName>
-                        <baseImage>java:8</baseImage>
                         <forceTags>true</forceTags>
-                        <entryPoint>["/bin/sh", "-c", "java $JAVA_OPTS", "-jar", "/${project.build.finalName}.jar"]
-                        </entryPoint>
+                        <imageTags>
+                            <imageTag>latest</imageTag>
+                        </imageTags>
+                        <imageName>${registryUrl}/${harbor.folder}/${project.artifactId}</imageName>
+                        <baseImage>${registryUrl}/java/prijava:latest</baseImage>
+                        <workdir>/opt</workdir>
+                        <rm>true</rm>
+                        <runs>
+                            <run>chmod -R 777 /wait-for-it.sh</run>
+                        </runs>
+                        <cmd>["java", "-version"]</cmd>
+                        <useGitCommitId>true</useGitCommitId>
                         <resources>
                             <resource>
                                 <targetPath>/</targetPath>
                                 <directory>${project.build.directory}</directory>
                                 <include>${project.build.finalName}.jar</include>
                             </resource>
+                            <resource>
+                                <targetPath>/</targetPath>
+                                <!--suppress UnresolvedMavenProperty -->
+                                <directory>${pom.parent.basedir}/document/docker</directory>
+                                <include>wait-for-it.sh</include>
+                            </resource>
                         </resources>
-                        <serverId>docker-registry</serverId>
-                        <registryUrl>${registryUrl}</registryUrl>
+                        <pushImageTag>true</pushImageTag>
+                        <retryPushCount>3</retryPushCount>
+                        <retryPushTimeout>8</retryPushTimeout>
+                        <serverId>${serverId}</serverId>
                     </configuration>
+                    <executions>
+                        <execution>
+                            <id>build-image</id>
+                            <phase>package</phase>
+                            <goals>
+                                <goal>build</goal>
+                            </goals>
+                        </execution>
+                    </executions>
                 </plugin>
             </plugins>
         </pluginManagement>
+        <finalName>app</finalName>
     </build>
 
 </project>

+ 8 - 7
register-center/src/main/resources/bootstrap.yml

@@ -7,9 +7,9 @@ spring:
   boot:
     admin:
       client: # 用户名密码需要配置,否则到监控中心报名
-        url: http://localhost:9985 # 配置监控服务端的地址
-        username: admin
-        password: lantone
+        url: http://${monitor-addr:localhost}:${monitor-port:9985} # 配置监控服务端的地址
+        username: ${monitor-username:admin}
+        password: ${monitor-password:lantone}
 
 eureka:
   instance:
@@ -22,7 +22,10 @@ eureka:
 
 logging:
   config: classpath:logback-spring.xml
-  file: logs/register-center/log_info.log
+  level:
+    root: ${log-level:info}
+  file:
+    path: /logs/register-center
 
 management:
   endpoints:
@@ -31,6 +34,4 @@ management:
         include: '*'
   endpoint:
     health:
-      show-details: always
-
-myname: testJdk
+      show-details: always

+ 53 - 102
register-center/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="register-center"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/register-center" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+
 </configuration>

+ 13 - 3
security-center/src/main/java/com/lantone/security/aop/LogAspect.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.lantone.common.dto.AbnormalLogDTO;
 import com.lantone.common.dto.OperationLogDTO;
 import com.lantone.common.util.HttpUtils;
+import com.lantone.common.util.IpUtils;
 import com.lantone.common.util.SysUserUtils;
 import com.lantone.security.service.MessageService;
 import org.apache.commons.collections4.MapUtils;
@@ -40,10 +41,13 @@ public class LogAspect {
      "||execution(public * com.lantone.security.web.FuncManagementController.*(..))"+
      "||execution(public * com.lantone.security.web.HospitalManagementController.*(..))"+
      "||execution(public * com.lantone.security.web.HospitalSetManagementController.*(..))"+
-     "||execution(public * com.lantone.security.web.LogManagementController.*(..))"+
+     "||execution(public * com.lantone.security.web.LogManagementController.*(..))" +
+     "&& !execution(public * com.lantone.security.web.LogManagementController.getOperationLog(..))"+
      "||execution(public * com.lantone.security.web.RegionManagementController.*(..))"+
      "||execution(public * com.lantone.security.web.RoleManagementController.*(..))"+
-     "||execution(public * com.lantone.security.web.UserManagementController.*(..))"
+     "||execution(public * com.lantone.security.web.UserManagementController.*(..))"+
+     "&& !execution(public * com.lantone.security.web.UserManagementController.login(..))"+
+     "&& !execution(public * com.lantone.security.web.UserManagementController.loadUserByUsername(..))"
     )
     public void operPointCut() {
     }
@@ -126,7 +130,13 @@ public class LogAspect {
         operationLog.setGmtCreate(date);
         operationLog.setOperationId(SysUserUtils.getCurrentPrincipleId());
         operationLog.setOperationName(SysUserUtils.getCurrentPrinciple());
-        operationLog.setOperationIp(HttpUtils.getIpAddress());
+        String ip = HttpUtils.getIpAddress();
+       if(IpUtils.isIPv4LiteralAddress(ip)){
+           operationLog.setOperationIp(ip);
+       }else{
+           operationLog.setRemark("[非ipv4地址]:"+ip);
+       }
+
         // 设置方法名称
         String className = joinPoint.getTarget().getClass().getName();
         String methodName = joinPoint.getSignature().getName();

+ 5 - 3
security-center/src/main/java/com/lantone/security/facade/DataAuthManagementFacade.java

@@ -348,11 +348,13 @@ public class DataAuthManagementFacade {
             software.setRoles(roles);
             //2.3数据权限详情
             List<SoftwareDataAuthDetail> softwareDataAuthDetails = softwareDataAuthFacade.getBaseMapper().getDataAuthDetail(softwareDataAuth.getId());
+            if(ListUtil.isEmpty(softwareDataAuthDetails)){
+                Asserts.fail("该数据权限有误,请联系管理员");
+            }
+            software.setDataType(softwareDataAuthDetails.get(0).getDataType());
             //--非自定义处理
-            if (softwareDataAuthDetails.size() == 1 && softwareDataAuthDetails.get(0).getDataType() != DataAuthDataTypeEnum.CUSTOMIZE.getKey()) {
-                software.setDataType(softwareDataAuthDetails.get(0).getDataType());
                 //--自定义处理
-            } else if (softwareDataAuthDetails.get(0).getDataType() == DataAuthDataTypeEnum.CUSTOMIZE.getKey()) {
+            if (softwareDataAuthDetails.get(0).getDataType() == DataAuthDataTypeEnum.CUSTOMIZE.getKey()) {
                 //按自定义类型分类
                 Map<Integer, List<SoftwareDataAuthDetail>> softwareDataAuthDetailMap = EntityUtil.makeEntityListMap(softwareDataAuthDetails, "detailType");
                 //自定义数据

+ 3 - 0
security-center/src/main/java/com/lantone/security/facade/DictionaryManagementFacade.java

@@ -69,6 +69,8 @@ public class DictionaryManagementFacade {
      */
     public IPage<DictionaryInfo> getDictionary(GetDictionaryVO getDictionaryVO) {
         IPage<DictionaryInfo> pageInfo = new Page();
+        pageInfo.setCurrent(getDictionaryVO.getCurrent());
+        pageInfo.setSize(getDictionaryVO.getSize());
         LambdaQueryChainWrapper<DictionaryInfo> dictionaryInfoLambdaQuery = dictionaryInfoFacade.lambdaQuery();
         dictionaryInfoLambdaQuery.eq(DictionaryInfo::getIsDeleted, IsDeleteEnum.N.getKey());
         if (StringUtil.isNotEmpty(getDictionaryVO.getName())) {
@@ -122,6 +124,7 @@ public class DictionaryManagementFacade {
                     .eq(DictionaryInfo::getIsDeleted, IsDeleteEnum.N.getKey())
                     .eq(DictionaryInfo::getName, saveDictionaryVO.getName())
                     .eq(DictionaryInfo::getVal, saveDictionaryVO.getVal())
+                    .eq(DictionaryInfo::getStatus, saveDictionaryVO.getStatus())
                     .eq(DictionaryInfo::getGroupType, saveDictionaryVO.getGroupType())
                     .count();
             if (count > 0) {

+ 26 - 8
security-center/src/main/java/com/lantone/security/facade/HospitalSetManagementFacade.java

@@ -2,17 +2,23 @@ package com.lantone.security.facade;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
+import com.lantone.common.dto.GetRealHospitalDTO;
 import com.lantone.common.enums.IsDeleteEnum;
+import com.lantone.common.enums.StatusEnum;
 import com.lantone.common.exception.ApiException;
 import com.lantone.common.util.StringUtil;
 import com.lantone.common.util.SysUserUtils;
 import com.lantone.common.vo.GetHospitalSetVO;
 import com.lantone.common.vo.SaveHospitalSetVO;
+import com.lantone.dblayermbg.entity.Hospital;
 import com.lantone.dblayermbg.entity.HospitalSet;
+import com.lantone.dblayermbg.facade.HospitalFacade;
 import com.lantone.dblayermbg.facade.HospitalSetFacade;
+import com.lantone.security.enums.HospitalTypeEnum;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
@@ -27,6 +33,9 @@ import java.util.stream.Collectors;
 public class HospitalSetManagementFacade {
     @Autowired
     private HospitalSetFacade hospitalSetFacade;
+    @Autowired
+    private HospitalFacade hospitalFacade;
+
 
     /**
      * @Description:  新增参数
@@ -66,6 +75,8 @@ public class HospitalSetManagementFacade {
      */
     public IPage<HospitalSet> getHospitalSet(GetHospitalSetVO getHospitalSetVO) {
         IPage<HospitalSet> pageInfo = new Page();
+        pageInfo.setCurrent(getHospitalSetVO.getCurrent());
+        pageInfo.setSize(getHospitalSetVO.getSize());
         LambdaQueryChainWrapper<HospitalSet> hospitalSetLambdaQuery = hospitalSetFacade.lambdaQuery();
         hospitalSetLambdaQuery.eq(HospitalSet::getIsDeleted, IsDeleteEnum.N.getKey());
         if (StringUtil.isNotEmpty(getHospitalSetVO.getHospitalName())) {
@@ -106,11 +117,10 @@ public class HospitalSetManagementFacade {
      * @Date: 2021/7/30
      */
     public void checkHospitalSet(SaveHospitalSetVO saveHospitalSetVO) {
-        saveHospitalSetVO.setHospitalId(SysUserUtils.getCurrentHospitalId());
         saveHospitalSetVO.setUserId(SysUserUtils.getCurrentPrincipleId());
         if (null == saveHospitalSetVO.getId()) {
             Integer count = hospitalSetFacade.lambdaQuery()
-                    .eq(HospitalSet::getHospitalId, saveHospitalSetVO.getHospitalId())
+                    .eq(HospitalSet::getHospitalName, saveHospitalSetVO.getHospitalName())
                     .eq(HospitalSet::getCode, saveHospitalSetVO.getCode())
                     .eq(HospitalSet::getIsDeleted, IsDeleteEnum.N.getKey())
                     .eq(HospitalSet::getName, saveHospitalSetVO.getName())
@@ -155,13 +165,21 @@ public class HospitalSetManagementFacade {
      * @Author: cy
      * @Date: 2021/8/9
      */
-    public List<String> getHospitalNames(String hospitalName) {
-        LambdaQueryChainWrapper<HospitalSet> hospitalSetLambdaQuery = hospitalSetFacade.lambdaQuery();
+    public List<GetRealHospitalDTO> getHospitalNames(String hospitalName) {
+        List<GetRealHospitalDTO> getRealHospitalDTOS = new ArrayList<>();
+        LambdaQueryChainWrapper<Hospital> hospitalSetLambdaQuery = hospitalFacade.lambdaQuery();
         if(StringUtil.isNotBlank(hospitalName)){
-            hospitalSetLambdaQuery.like(HospitalSet::getHospitalName,hospitalName);
+            hospitalSetLambdaQuery.like(Hospital::getName,hospitalName);
         }
-        hospitalSetLambdaQuery.eq(HospitalSet::getIsDeleted, IsDeleteEnum.N.getKey());
-        hospitalSetLambdaQuery.groupBy(HospitalSet::getHospitalName);
-        return  hospitalSetLambdaQuery.list().stream().filter(obj -> StringUtil.isNotBlank(obj.getHospitalName())).sorted(Comparator.comparing(HospitalSet::getHospitalId)).map(obj -> obj.getHospitalName()).collect(Collectors.toList());
+        hospitalSetLambdaQuery.eq(Hospital::getIsDeleted, IsDeleteEnum.N.getKey());
+        hospitalSetLambdaQuery.eq(Hospital::getType, HospitalTypeEnum.SINGLE_HOSPITAL.getKey());
+        List<Hospital> hspitals = hospitalSetLambdaQuery.list().stream().filter(obj -> StringUtil.isNotBlank(obj.getName())).sorted(Comparator.comparing(Hospital::getId)).collect(Collectors.toList());
+        hspitals.forEach(kfc->{
+            GetRealHospitalDTO getRealHospitalDTO = new GetRealHospitalDTO();
+            getRealHospitalDTO.setHospitalId(kfc.getId());
+            getRealHospitalDTO.setHospitalName(kfc.getName());
+            getRealHospitalDTOS.add(getRealHospitalDTO);
+        });
+        return getRealHospitalDTOS;
     }
 }

+ 43 - 24
security-center/src/main/java/com/lantone/security/facade/NoticeManagementFacade.java

@@ -14,6 +14,7 @@ import com.lantone.common.enums.StatusEnum;
 import com.lantone.common.exception.Asserts;
 import com.lantone.common.util.DateUtil;
 import com.lantone.common.util.ListUtil;
+import com.lantone.common.util.StringUtil;
 import com.lantone.common.util.SysUserUtils;
 import com.lantone.common.vo.AddNoticeVO;
 import com.lantone.common.vo.GetHospitalUserVO;
@@ -39,6 +40,7 @@ import com.lantone.security.enums.ReadTypeEnum;
 import com.lantone.security.enums.ReceiveTypeEnum;
 import com.lantone.security.enums.ReturnTypeEnum;
 import com.lantone.security.service.MessageService;
+import org.apache.commons.collections.SetUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -84,6 +86,7 @@ public class NoticeManagementFacade {
      */
     public IPage<GetMyNoticeListDTO> listPage(GetMyNoticeListVO getMyNoticeListVO) {
         getMyNoticeListVO.setId(SysUserUtils.getCurrentPrincipleId());
+        getMyNoticeListVO.setHospitalId(SysUserUtils.getCurrentHospitalId());
         return noticeUserFacade.getBaseMapper().listPage(getMyNoticeListVO);
     }
 
@@ -113,14 +116,14 @@ public class NoticeManagementFacade {
         notice.setCreator(SysUserUtils.getCurrentPrincipleId() + "");
         notice.setGmtCreate(DateUtil.now());
         //根据通知类型查询通知用户
-        Set<Long> userIds = new HashSet<>();
+        Set<HospitalUser> hospitalUsers = new HashSet<>();
         if (ReceiveTypeEnum.ALL.getKey().equals(addNoticeVO.getReceiveType())) {
             //获取当前登录用户管理的医院
             List<Long> hospitals = hospitalFacade.getBaseMapper()
                     .getHospitalTreeInfo(SysUserUtils.getCurrentHospitalId(), StatusEnum.Enable.getKey()).stream()
                     .map(GetHospitalTreeDTO::getHospitalId).collect(Collectors.toList());
             //获取这些组织的用户
-            getUserByHospitals(hospitals, userIds);
+            getUserByHospitals(hospitals, hospitalUsers);
         } else if (ReceiveTypeEnum.CUSTOM.getKey().equals(addNoticeVO.getReceiveType())) {
             if (ListUtil.isEmpty(addNoticeVO.getSendHospitals()) &&
                     ListUtil.isEmpty(addNoticeVO.getSendDepts()) &&
@@ -129,46 +132,58 @@ public class NoticeManagementFacade {
             }
             //获取通知的医院-转成用户
             if (ListUtil.isNotEmpty(addNoticeVO.getSendHospitals())) {
-                getUserByHospitals(addNoticeVO.getSendHospitals(), userIds);
+                getUserByHospitals(addNoticeVO.getSendHospitals(), hospitalUsers);
             }
             //获取通知的科室-转成用户
             if (ListUtil.isNotEmpty(addNoticeVO.getSendDepts())) {
-                getUserByDepts(addNoticeVO.getSendDepts(), userIds);
+                getUserByDepts(addNoticeVO.getSendDepts(), hospitalUsers);
             }
             if (ListUtil.isNotEmpty(addNoticeVO.getSendUsers())) {
-                userIds.addAll(addNoticeVO.getSendUsers());
+                try {
+                    addNoticeVO.getSendUsers().stream().forEach(temp -> {
+                        if (StringUtil.isNotBlank(temp) && temp.contains("-")) {
+                            HospitalUser hospitaluser = new HospitalUser();
+                            hospitaluser.setHospitalId(Long.parseLong(temp.split("-")[0]));
+                            hospitaluser.setUserId(Long.parseLong(temp.split("-")[1]));
+                            hospitalUsers.add(hospitaluser);
+                        }
+                    });
+                } catch (Exception e) {
+
+                }
             }
         } else {
             Asserts.fail("接收类型不存在,请检查重新输入~");
         }
-        if (userIds.isEmpty()) {
+        if (hospitalUsers.isEmpty()) {
             Asserts.fail("通知用户为空,请联系管理员~");
         }
         if (noticeFacade.save(notice)) {
             //发送通知
-            return sendNotice(userIds, notice.getId());
+            return sendNotice(hospitalUsers, notice.getId());
         }
         return false;
     }
 
     /**
-     * @param userIds
+     * @param hospitalUsers
      * @param id
      * @Description发送通知
      * @Return java.lang.Boolean
      */
-    private Boolean sendNotice(Set<Long> userIds, Long id) {
+    private Boolean sendNotice(Set<HospitalUser> hospitalUsers, Long id) {
         List<NoticeUser> noticeUsers = new ArrayList<>();
         List<SendToTopicDTO> sendToTopics = new ArrayList<>();
-        userIds.stream().forEach(userId -> {
+        hospitalUsers.stream().forEach(hospitalUser -> {
             NoticeUser noticeUser = new NoticeUser();
-            noticeUser.setUserId(userId);
+            noticeUser.setHospitalId(hospitalUser.getHospitalId());
+            noticeUser.setUserId(hospitalUser.getUserId());
             noticeUser.setNoticeId(id);
             noticeUsers.add(noticeUser);
             SendToTopicDTO sendToTopicDTO = new SendToTopicDTO();
             sendToTopicDTO.setMessage("+1");
             sendToTopicDTO.setType("count");
-            sendToTopicDTO.setTopic(userId+"");
+            sendToTopicDTO.setTopic(hospitalUser.getHospitalId() + "-" + hospitalUser.getUserId() + "");
             sendToTopics.add(sendToTopicDTO);
         });
         messageService.sendToTopic(sendToTopics);
@@ -177,40 +192,43 @@ public class NoticeManagementFacade {
 
     /**
      * @param hospitals
-     * @param userIds
+     * @param hospitalUsers
      * @Description获取医院的用户
      * @Return void
      */
-    private void getUserByHospitals(List<Long> hospitals, Set<Long> userIds) {
+    private void getUserByHospitals(List<Long> hospitals, Set<HospitalUser> hospitalUsers) {
 
         if (ListUtil.isEmpty(hospitals)) {
             Asserts.fail("当前管理员发送通知的组织集合为空,请联系管理员~");
         }
         //获取该医院的用户
-        userIds.addAll(hospitalUserFacade.list(new QueryWrapper<HospitalUser>()
+        Set<HospitalUser> tempUsers = hospitalUserFacade.list(new QueryWrapper<HospitalUser>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
-                .in("hospital_id", hospitals)).stream().map(HospitalUser::getUserId).collect(Collectors.toSet()));
-
+                .in("hospital_id", hospitals)).stream().collect(Collectors.toSet());
+        if (tempUsers != null && tempUsers.size()>0) {
+            hospitalUsers.addAll(tempUsers);
+        }
         //获取医院的科室
-        getUserByDepts(deptFacade.list(new QueryWrapper<Dept>()
+        List<Long> tempDepts = deptFacade.list(new QueryWrapper<Dept>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
-                .in("hospital_id", hospitals)).stream().map(Dept::getId).collect(Collectors.toList()), userIds);
+                .in("hospital_id", hospitals)).stream().map(Dept::getId).collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(tempDepts)) {
+            getUserByDepts(tempDepts, hospitalUsers);
+        }
     }
 
     /**
      * @param depts
-     * @param userIds
+     * @param hospitalUsers
      * @Description获取科室的用户
      * @Return void
      */
-    private void getUserByDepts(List<Long> depts, Set<Long> userIds) {
+    private void getUserByDepts(List<Long> depts, Set<HospitalUser> hospitalUsers) {
         if (ListUtil.isEmpty(depts)) {
             Asserts.fail("当前管理员发送通知的组织集合为空,请联系管理员~");
         }
         //获取该医院的用户
-        userIds.addAll(deptUserFacade.list(new QueryWrapper<DeptUser>()
-                .eq("is_deleted", IsDeleteEnum.N.getKey())
-                .in("dept_id", depts)).stream().map(DeptUser::getUserId).collect(Collectors.toSet()));
+        hospitalUsers.addAll(deptUserFacade.getBaseMapper().getDeptUser(depts).stream().collect(Collectors.toSet()));
     }
 
     /**
@@ -271,6 +289,7 @@ public class NoticeManagementFacade {
     public Map<String, Integer> getNotNoticeCount() {
         Map<String, Integer> out = new HashMap<>();
         out.put("count", noticeUserFacade.count(new QueryWrapper<NoticeUser>()
+                .eq("hospital_id", SysUserUtils.getCurrentHospitalId())
                 .eq("user_id", SysUserUtils.getCurrentPrincipleId())
                 .eq("status", ReadTypeEnum.NOT_READ.getKey())
                 .eq("is_deleted", IsDeleteEnum.N.getKey())));

+ 2 - 1
security-center/src/main/java/com/lantone/security/web/HospitalSetManagementController.java

@@ -2,6 +2,7 @@ package com.lantone.security.web;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.lantone.common.api.CommonResult;
+import com.lantone.common.dto.GetRealHospitalDTO;
 import com.lantone.common.vo.GetHospitalSetVO;
 import com.lantone.common.vo.SaveHospitalSetVO;
 import com.lantone.dblayermbg.entity.HospitalSet;
@@ -61,7 +62,7 @@ public class HospitalSetManagementController {
 
     @ApiOperation(value = "查看参数管理所属组织[by:cy]")
     @PostMapping("/getHospitalNames")
-    public CommonResult<List<String>> getHospitalNames(@RequestParam("hospitalName") String hospitalName) {
+    public CommonResult<List<GetRealHospitalDTO>> getHospitalNames(@RequestParam("hospitalName") String hospitalName) {
         return CommonResult.success(hospitalSetManagementFacade.getHospitalNames(hospitalName));
     }
 }

+ 5 - 2
security-center/src/main/resources/bootstrap.yml

@@ -15,11 +15,14 @@ spring:
 eureka:
   client:
     service-url:
-      defaultZone: http://localhost:6751/eureka/
+      defaultZone: http://${eureka-addr:localhost}:${eureka-port:6751}/eureka/
 
 logging:
   config: classpath:logback-spring.xml
-  file: logs/security-center/log_info.log
+  level:
+    root: ${log-level:info}
+  file:
+    path: /logs/security-center
 
 management:
   endpoints:

+ 53 - 102
security-center/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="security-center"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/security-center" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+
 </configuration>

+ 13 - 0
structure-center/src/main/java/com/lantone/structure/config/RedisConfig.java

@@ -0,0 +1,13 @@
+package com.lantone.structure.config;
+
+import com.lantone.common.config.BaseRedisConfig;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Redis相关配置
+ * Created by macro on 2020/6/19.
+ */
+@Configuration
+public class RedisConfig extends BaseRedisConfig {
+
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/config/SwaggerConfig.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.config;
+
+import com.lantone.common.config.BaseSwaggerConfig;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @Description: Swagger相关配置
+ * @author: rengb
+ * @time: 2021/1/5 18:27
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig extends BaseSwaggerConfig {
+
+}

+ 5 - 2
structure-center/src/main/resources/bootstrap.yml

@@ -19,11 +19,14 @@ spring:
 eureka:
   client:
     service-url:
-      defaultZone: http://localhost:6751/eureka/
+      defaultZone: http://${eureka-addr:localhost}:${eureka-port:6751}/eureka/
 
 logging:
   config: classpath:logback-spring.xml
-  file: logs/structure-center/log_info.log
+  level:
+    root: ${log-level:info}
+  file:
+    path: /logs/structure-center
 
 management:
   endpoints:

+ 53 - 102
structure-center/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="structure-center"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/structure-center" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+
 </configuration>

+ 5 - 2
user-auth/src/main/resources/bootstrap.yml

@@ -8,11 +8,14 @@ spring:
 eureka:
   client:
     service-url:
-      defaultZone: http://localhost:6751/eureka/
+      defaultZone: http://${eureka-addr:localhost}:${eureka-port:6751}/eureka/
 
 logging:
   config: classpath:logback-spring.xml
-  file: logs/user-auth/log_info.log
+  level:
+    root: ${log-level:info}
+  file:
+    path: /logs/user-auth
 
 management:
   endpoints:

+ 53 - 102
user-auth/src/main/resources/logback-spring.xml

@@ -1,61 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
+<configuration scanPeriod="10 seconds">
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
+
+    <property name="APP_NAME" value="user-auth"/>
+    <contextName>${APP_NAME}</contextName>
+    <property name="LOG_FILE_PATH" value="/logs/${APP_NAME}"/>
+
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
 
-    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
-
-    <contextName>logback</contextName>
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="logs/user-auth" />
-
-    <!-- 彩色日志 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-    <!--输出到控制台-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>info</level>
         </filter>
         <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-
-    <!--输出到文件-->
-
-    <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_debug.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_debug.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录debug级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
@@ -63,26 +46,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 INFO 日志 -->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_info.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_info.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录info级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
@@ -90,25 +66,19 @@
         </filter>
     </appender>
 
-    <!-- 时间滚动输出 level为 WARN 日志 -->
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_warn.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_warn.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录warn级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
@@ -116,67 +86,48 @@
         </filter>
     </appender>
 
-
-    <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文件的路径及文件名 -->
-        <file>${log.path}/log_error.log</file>
-        <!--日志文件输出格式-->
+        <file>${LOG_FILE_PATH}/log_error.log</file>
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+            <charset>UTF-8</charset>
         </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <fileNamePattern>${LOG_FILE_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文件保留天数-->
-            <maxHistory>15</maxHistory>
+            <maxHistory>90</maxHistory>
         </rollingPolicy>
-        <!-- 此日志文件只记录ERROR级别的 -->
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
+            <level>error</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-    -->
-    <!--<logger name="org.springframework.web" level="info"/>-->
-    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
-    <!--
-        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
-        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
-        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-     -->
-
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!--开发环境:打印控制台-->
-    <springProfile name="dev">
-        <logger name="org.lantone.qc" level="debug"/>
-    </springProfile>
+    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_FILE_PATH}/spring.log</file>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_FILE_PATH}/all/spring-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>100MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>90</maxHistory>
+        </rollingPolicy>
+    </appender>
 
-    <root level="info">
+    <root>
         <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="INFO_FILE" />
-        <appender-ref ref="ERROR_FILE" />
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="ALL_FILE"/>
     </root>
+
 </configuration>