فهرست منبع

[chg] 优化日志输出,操作证重复修复

wcz 5 سال پیش
والد
کامیت
347eb7d0db
23فایلهای تغییر یافته به همراه425 افزوده شده و 346 حذف شده
  1. 1 1
      lift-business-service/src/main/java/cn/com/ty/lift/business/framework/aspect/ControllerAspect.java
  2. 153 0
      lift-business-service/src/main/resources/logback-spring-easy.xml
  3. 14 1
      lift-business-service/src/main/resources/logback-spring.xml
  4. 9 9
      lift-business-service/src/main/resources/mapper/annualinspection/AnnualInspectionMapper.xml
  5. 2 2
      lift-business-service/src/main/resources/mapper/emergency/EmergencyRepairMapper.xml
  6. 1 1
      lift-business-service/src/main/resources/mapper/maintenance/MaintenancePlanMapper.xml
  7. 1 1
      lift-business-service/src/main/resources/mapper/maintenance/MaintenanceRecordMapper.xml
  8. 15 0
      lift-common/pom.xml
  9. 36 0
      lift-common/src/main/java/cn.com.ty.lift.common/logger/EasyHighlightingCompositeConverter.java
  10. 134 0
      lift-common/src/main/java/cn.com.ty.lift.common/logger/EasyPatternLayout.java
  11. 28 0
      lift-common/src/main/java/cn.com.ty.lift.common/logger/PidClassicConverter.java
  12. 0 111
      lift-common/src/main/java/cn.com.ty.lift.common/sql/DbType.java
  13. 6 3
      lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlAnalyzer.java
  14. 11 37
      lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlLike.java
  15. 1 5
      lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlFormatter.java
  16. 3 88
      lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlUtils.java
  17. 0 77
      lift-common/src/main/java/cn.com.ty.lift.common/sql/SystemClock.java
  18. 1 1
      lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/common/ControllerAspect.java
  19. 1 1
      lift-enterprise-service/src/main/resources/logback-spring.xml
  20. 5 5
      lift-enterprise-service/src/main/resources/mapper/oa/LiftCertificateMapper.xml
  21. 1 1
      lift-quan-service/src/main/resources/logback-spring.xml
  22. 1 1
      lift-system-service/src/main/java/cn/com/ty/lift/system/config/ControllerAspect.java
  23. 1 1
      lift-system-service/src/main/resources/logback-spring.xml

+ 1 - 1
lift-business-service/src/main/java/cn/com/ty/lift/business/framework/aspect/ControllerAspect.java

@@ -62,7 +62,7 @@ public class ControllerAspect {
         if(null != res){
             int length = res.length();
             int sub = length - StrPool.LOG_PRINT_MAX;
-            res = sub > 0 ? res.substring(0, StrPool.LOG_PRINT_MAX) + StrPool.NEWLINE + "... " + sub + " characters omitted." : res;
+            res = sub < 0 ? res : res.substring(0, StrPool.LOG_PRINT_MAX) + StrPool.NEWLINE + "... " + sub + " characters omitted." + StrPool.NEWLINE + "}";
             log.info(StrPool.LOG_RESPONSE + StrPool.NEWLINE + res);
         }
     }

+ 153 - 0
lift-business-service/src/main/resources/logback-spring-easy.xml

@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--debug="true" : 打印 logback 内部状态(默认当 logback 运行出错时才会打印内部状态 ), 配置该属性后打印条件如下(同时满足):
+    1、找到配置文件
+    2、配置文件是一个格式正确的xml文件 也可编程实现打印内部状态,
+    例如: LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); StatusPrinter.print(lc); -->
+<!-- scan="true" : 自动扫描该配置文件,若有修改则重新加载该配置文件 -->
+<!-- scanPeriod="30 seconds" : 配置自动扫面时间间隔
+    (单位可以是:milliseconds, seconds, minutes or hours,默认为:milliseconds),
+    默认为1分钟,scan="true"时该配置才会生效 -->
+<configuration
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
+        debug="false" scan="true" scanPeriod="30 seconds">
+
+    <property name="PROJECT" value="lift-business"/>
+    <property name="ROOT" value="logs/${PROJECT}/"/>
+    <property name="FILESIZE" value="10MB"/>
+    <property name="MAXHISTORY" value="100"/>
+    <timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm"/>
+    <!-- 控制台打印 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!--是否支持ANSI color codes(类似linux中的shell脚本的输出字符串颜色控制代码)。默认为false。如果设置为true。例如:[31m 代表将前景色设置成红色。-->
+        <!--在windows中,需要提供"org.fusesource.jansi:jansi:1.9",而在linux,mac os x中默认支持。-->
+        <withJansi>true</withJansi>
+        <!--如果是自定义的layout,必须在encoder中指定class=ch.qos.logback.core.encoder.LayoutWrappingEncoder-->
+        <!--encoder的class默认ch.qos.logback.classic.encoder.PatternLayoutEncoder-->
+        <encoder charset="utf-8" class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="cn.com.ty.lift.common.logger.EasyPatternLayout">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+            <!--"%black", "%red", "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray", "%boldRed","%boldGreen", -->
+            <!--"%boldYellow", "%boldBlue", "%boldMagenta""%boldCyan", "%boldWhite" and "%highlight"-->
+                <pattern>%easyHighlight([%-5level]) %green(%d{${DATETIME}}) %easyHighlight([%pid %thread]) %boldMagenta(%logger{30}) - %m%n
+                </pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <!-- ERROR 输入到文件,按日期和文件大小 -->
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder charset="utf-8">
+            <pattern>[%-5level] %d{${DATETIME}} %logger{30} - %m%n
+            </pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${ROOT}%d/error.%i.log</fileNamePattern>
+            <maxHistory>${MAXHISTORY}</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${FILESIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+    </appender>
+
+    <!-- WARN 输入到文件,按日期和文件大小 -->
+    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder charset="utf-8">
+            <pattern>[%-5level] %d{${DATETIME}} %logger{30} - %m%n
+            </pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>
+            <maxHistory>${MAXHISTORY}</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${FILESIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+    </appender>
+
+    <!-- INFO 输入到文件,按日期和文件大小 -->
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder charset="utf-8">
+            <pattern>[%-5level] %d{${DATETIME}} %logger{30} - %m%n
+            </pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
+            <maxHistory>${MAXHISTORY}</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${FILESIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+    </appender>
+    <!-- DEBUG 输入到文件,按日期和文件大小 -->
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder charset="utf-8">
+            <pattern>[%-5level] %d{${DATETIME}} %logger{30} - %m%n
+            </pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>
+            <maxHistory>${MAXHISTORY}</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${FILESIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+    </appender>
+    <!-- TRACE 输入到文件,按日期和文件大小 -->
+    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <encoder charset="utf-8">
+            <pattern>[%-5level] %d{${DATETIME}} %logger{30} - %m%n
+            </pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>TRACE</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <rollingPolicy
+                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>
+            <maxHistory>${MAXHISTORY}</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${FILESIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+    </appender>
+
+    <!-- SQL相关日志输出-->
+    <logger name="org.apache.ibatis" level="INFO" additivity="true"/>
+    <logger name="org.mybatis.spring" level="INFO" additivity="false"/>
+    <logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false"/>
+
+    <!-- Logger 根目录 -->
+    <root level="INFO">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="DEBUG"/>
+        <appender-ref ref="ERROR"/>
+        <appender-ref ref="WARN"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="TRACE"/>
+    </root>
+</configuration>

+ 14 - 1
lift-business-service/src/main/resources/logback-spring.xml

@@ -1,4 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--debug="true" : 打印 logback 内部状态(默认当 logback 运行出错时才会打印内部状态 ), 配置该属性后打印条件如下(同时满足):
+    1、找到配置文件
+    2、配置文件是一个格式正确的xml文件 也可编程实现打印内部状态,
+    例如: LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); StatusPrinter.print(lc); -->
+<!-- scan="true" : 自动扫描该配置文件,若有修改则重新加载该配置文件 -->
+<!-- scanPeriod="30 seconds" : 配置自动扫面时间间隔
+    (单位可以是:milliseconds, seconds, minutes or hours,默认为:milliseconds),
+    默认为1分钟,scan="true"时该配置才会生效 -->
 <configuration
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
@@ -11,9 +19,14 @@
     <timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm"/>
     <!-- 控制台打印 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!--是否支持ANSI color codes(类似linux中的shell脚本的输出字符串颜色控制代码)。默认为false。如果设置为true。例如:[31m 代表将前景色设置成红色。-->
+        <!--在windows中,需要提供"org.fusesource.jansi:jansi:1.9",而在linux,mac os x中默认支持。-->
+        <withJansi>true</withJansi>
         <encoder charset="utf-8">
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
-            <pattern>%highlight([%-5level]) %green(%d{${DATETIME}}) %highlight([%thread]) %boldMagenta(%logger{30}) - %m%n
+            <!--"%black", "%red", "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray", "%boldRed","%boldGreen", -->
+            <!--"%boldYellow", "%boldBlue", "%boldMagenta""%boldCyan", "%boldWhite" and "%highlight"-->
+            <pattern>%highlight([%-5level]) %highlight(%d{${DATETIME}}) %cyan([%thread]) %boldMagenta(%logger{30}) - %m%n
             </pattern>
         </encoder>
     </appender>

+ 9 - 9
lift-business-service/src/main/resources/mapper/annualinspection/AnnualInspectionMapper.xml

@@ -53,7 +53,7 @@
             LEFT JOIN lift li ON plr.lift_id = li.id
             LEFT JOIN project pr ON pr.id = plr.project_id
             LEFT JOIN region re ON pr.region_id = re.id
-            LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id
+            LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id AND ai.mt_company_id = plr.mt_company_id
             LEFT JOIN user_info ui ON ui.user_id = re.user_id
             WHERE ai.id = #{cond.id}
             <if test="cond.mtCompanyId != null and cond.mtCompanyId > 0">
@@ -81,14 +81,17 @@
             FROM
                 project_lift_relevance plr
             LEFT JOIN lift li ON plr.lift_id = li.id
-            LEFT JOIN project pr ON pr.id = plr.project_id
-            LEFT JOIN region re ON pr.region_id = re.id
-            LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id
+            LEFT JOIN project pr ON pr.id = plr.project_id AND pr.mt_company_id = plr.mt_company_id
+            LEFT JOIN region re ON pr.region_id = re.id AND re.mt_company_id = plr.mt_company_id
+            LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id AND ai.mt_company_id = plr.mt_company_id
             LEFT JOIN user_info ui ON ui.user_id = re.user_id
             <where>
                 <if test="cond.status != null">
                     AND ai.status = #{cond.status}
                 </if>
+                <if test="cond.stepName != null">
+                    AND ai.step_name = #{cond.stepName}
+                </if>
                 <if test="cond.mtCompanyId != null and cond.mtCompanyId > 0">
                     AND plr.mt_company_id = #{cond.mtCompanyId}
                 </if>
@@ -101,9 +104,6 @@
                 <if test="cond.projectId != null and cond.projectId > 0">
                     AND pr.id = #{cond.projectId}
                 </if>
-                <if test="cond.stepName != null">
-                    AND ai.step_name = #{cond.stepName}
-                </if>
             </where>
             ) t
         LEFT JOIN user_info ui ON ui.user_id = t.worker_id
@@ -123,7 +123,7 @@
         LEFT JOIN lift li ON plr.lift_id = li.id
         LEFT JOIN project pr ON pr.id = plr.project_id
         LEFT JOIN region re ON pr.region_id = re.id
-        LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id
+        LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id AND ai.mt_company_id = plr.mt_company_id
         <where>
             <if test="cond.status != null">
                 AND ai.status = #{cond.status}
@@ -155,7 +155,7 @@
             LEFT JOIN lift li ON plr.lift_id = li.id
             LEFT JOIN project pr ON pr.id = plr.project_id
             LEFT JOIN region re ON pr.region_id = re.id
-            LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id
+            LEFT JOIN annual_inspection ai ON ai.lift_id = plr.lift_id AND ai.mt_company_id = plr.mt_company_id
             LEFT JOIN user_info ui ON ui.user_id = re.user_id
             <where>
                 <if test="cond.status != null">

+ 2 - 2
lift-business-service/src/main/resources/mapper/emergency/EmergencyRepairMapper.xml

@@ -125,7 +125,7 @@
 			TimeStampDiff(SECOND ,er.stop_date,er.recovery_date) AS repair_diff
         FROM
             emergency_repair er
-		LEFT JOIN project pr ON er.project_id = pr.id
+		LEFT JOIN project pr ON er.project_id = pr.id AND pr.mt_company_id = er.mt_company_id
 		LEFT JOIN region re ON pr.region_id = re.id
 		LEFT JOIN lift li ON er.lift_id = li.id
 		LEFT JOIN user_info ui ON ui.user_id = er.worker_id1
@@ -192,7 +192,7 @@
         FROM
 	        project_user pu
         LEFT JOIN project pr ON pu.project_id = pr.id
-        LEFT JOIN emergency_repair er ON er.project_id = pr.id
+        LEFT JOIN emergency_repair er ON er.project_id = pr.id AND er.mt_company_id = pu.mt_company_id
         LEFT JOIN lift li ON er.lift_id = li.id
         LEFT JOIN region re ON re.id = pr.region_id
         <where>

+ 1 - 1
lift-business-service/src/main/resources/mapper/maintenance/MaintenancePlanMapper.xml

@@ -136,7 +136,7 @@
         FROM
             maintenance_plan mp
 		LEFT JOIN lift li ON li.id = mp.lift_id
-		LEFT JOIN project pr ON pr.id = mp.project_id
+		LEFT JOIN project pr ON pr.id = mp.project_id AND pr.mt_company_id = mp.mt_company_id
 		LEFT JOIN user_info ui ON ui.user_id = mp.worker_id
 		LEFT JOIN maintenance_record mr ON mr.mt_plan_id = mp.id
         WHERE mp.plan_date &lt; now() AND mp.work_date IS NULL

+ 1 - 1
lift-business-service/src/main/resources/mapper/maintenance/MaintenanceRecordMapper.xml

@@ -94,7 +94,7 @@
             maintenance_record mr
             LEFT JOIN lift li ON mr.lift_id = li.id
             LEFT JOIN user_info ui ON mr.worker_id1 = ui.user_id
-            LEFT JOIN project pr ON mr.project_id = pr.id
+            LEFT JOIN project pr ON mr.project_id = pr.id AND pr.mt_company_id = mr.mt_company_id
             LEFT JOIN evaluation ev ON mr.id = ev.record_id
         <where>
             <if test="cond.mtCompanyId != null and cond.mtCompanyId > 0">

+ 15 - 0
lift-common/pom.xml

@@ -61,6 +61,21 @@
             <artifactId>pinyin4j</artifactId>
             <version>2.5.1</version>
         </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-access</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 36 - 0
lift-common/src/main/java/cn.com.ty.lift.common/logger/EasyHighlightingCompositeConverter.java

@@ -0,0 +1,36 @@
+package cn.com.ty.lift.common.logger;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.pattern.color.ANSIConstants;
+import ch.qos.logback.core.pattern.color.ForegroundCompositeConverterBase;
+
+/**
+ * 自定义日志等级高亮颜色
+ *
+ * @author wcz
+ * @since 2020/2/7
+ */
+public class EasyHighlightingCompositeConverter extends ForegroundCompositeConverterBase<ILoggingEvent> {
+
+    /**
+     * (non-Javadoc)
+     * 
+     * @see ch.qos.logback.core.pattern.color.ForegroundCompositeConverterBase#
+     *      getForegroundColorCode(java.lang.Object)
+     */
+    protected String getForegroundColorCode(ILoggingEvent event) {
+        switch (event.getLevel().toInt()) {
+            case Level.ERROR_INT:
+                return ANSIConstants.RED_FG;
+            case Level.WARN_INT:
+                return ANSIConstants.YELLOW_FG;
+            case Level.INFO_INT:
+                return ANSIConstants.GREEN_FG;
+            case Level.DEBUG_INT:
+                return ANSIConstants.MAGENTA_FG;
+            default:
+                return ANSIConstants.DEFAULT_FG;
+        }
+    }
+}

+ 134 - 0
lift-common/src/main/java/cn.com.ty.lift.common/logger/EasyPatternLayout.java

@@ -0,0 +1,134 @@
+package cn.com.ty.lift.common.logger;
+
+import ch.qos.logback.classic.pattern.*;
+import ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.pattern.PatternLayoutBase;
+import ch.qos.logback.core.pattern.color.*;
+import ch.qos.logback.core.pattern.parser.Parser;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 日志样式layout
+ *
+ * @author wcz
+ * @since 2020/2/7
+ */
+public class EasyPatternLayout extends PatternLayoutBase<ILoggingEvent> {
+
+    public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
+    public static final String HEADER_PREFIX = "#logback.classic pattern: ";
+
+    static {
+        defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);
+
+        defaultConverterMap.put("d", DateConverter.class.getName());
+        defaultConverterMap.put("date", DateConverter.class.getName());
+
+        defaultConverterMap.put("r", RelativeTimeConverter.class.getName());
+        defaultConverterMap.put("relative", RelativeTimeConverter.class.getName());
+
+        defaultConverterMap.put("level", LevelConverter.class.getName());
+        defaultConverterMap.put("le", LevelConverter.class.getName());
+        defaultConverterMap.put("p", LevelConverter.class.getName());
+
+        defaultConverterMap.put("t", ThreadConverter.class.getName());
+        defaultConverterMap.put("thread", ThreadConverter.class.getName());
+
+        defaultConverterMap.put("lo", LoggerConverter.class.getName());
+        defaultConverterMap.put("logger", LoggerConverter.class.getName());
+        defaultConverterMap.put("c", LoggerConverter.class.getName());
+
+        defaultConverterMap.put("m", MessageConverter.class.getName());
+        defaultConverterMap.put("msg", MessageConverter.class.getName());
+        defaultConverterMap.put("message", MessageConverter.class.getName());
+
+        defaultConverterMap.put("C", ClassOfCallerConverter.class.getName());
+        defaultConverterMap.put("class", ClassOfCallerConverter.class.getName());
+
+        defaultConverterMap.put("M", MethodOfCallerConverter.class.getName());
+        defaultConverterMap.put("method", MethodOfCallerConverter.class.getName());
+
+        defaultConverterMap.put("L", LineOfCallerConverter.class.getName());
+        defaultConverterMap.put("line", LineOfCallerConverter.class.getName());
+
+        defaultConverterMap.put("F", FileOfCallerConverter.class.getName());
+        defaultConverterMap.put("file", FileOfCallerConverter.class.getName());
+
+        defaultConverterMap.put("X", MDCConverter.class.getName());
+        defaultConverterMap.put("mdc", MDCConverter.class.getName());
+
+        defaultConverterMap.put("ex", ThrowableProxyConverter.class.getName());
+        defaultConverterMap.put("exception", ThrowableProxyConverter.class.getName());
+        defaultConverterMap.put("rEx", RootCauseFirstThrowableProxyConverter.class.getName());
+        defaultConverterMap.put("rootException", RootCauseFirstThrowableProxyConverter.class.getName());
+        defaultConverterMap.put("throwable", ThrowableProxyConverter.class.getName());
+
+        defaultConverterMap.put("xEx", ExtendedThrowableProxyConverter.class.getName());
+        defaultConverterMap.put("xException", ExtendedThrowableProxyConverter.class.getName());
+        defaultConverterMap.put("xThrowable", ExtendedThrowableProxyConverter.class.getName());
+
+        defaultConverterMap.put("nopex", NopThrowableInformationConverter.class.getName());
+        defaultConverterMap.put("nopexception", NopThrowableInformationConverter.class.getName());
+
+        defaultConverterMap.put("cn", ContextNameConverter.class.getName());
+        defaultConverterMap.put("contextName", ContextNameConverter.class.getName());
+
+        defaultConverterMap.put("caller", CallerDataConverter.class.getName());
+
+        defaultConverterMap.put("marker", MarkerConverter.class.getName());
+
+        defaultConverterMap.put("property", PropertyConverter.class.getName());
+
+        defaultConverterMap.put("n", LineSeparatorConverter.class.getName());
+
+        defaultConverterMap.put("black", BlackCompositeConverter.class.getName());
+        defaultConverterMap.put("red", RedCompositeConverter.class.getName());
+        defaultConverterMap.put("green", GreenCompositeConverter.class.getName());
+        defaultConverterMap.put("yellow", YellowCompositeConverter.class.getName());
+        defaultConverterMap.put("blue", BlueCompositeConverter.class.getName());
+        defaultConverterMap.put("magenta", MagentaCompositeConverter.class.getName());
+        defaultConverterMap.put("cyan", CyanCompositeConverter.class.getName());
+        defaultConverterMap.put("white", WhiteCompositeConverter.class.getName());
+        defaultConverterMap.put("gray", GrayCompositeConverter.class.getName());
+        defaultConverterMap.put("boldRed", BoldRedCompositeConverter.class.getName());
+        defaultConverterMap.put("boldGreen", BoldGreenCompositeConverter.class.getName());
+        defaultConverterMap.put("boldYellow", BoldYellowCompositeConverter.class.getName());
+        defaultConverterMap.put("boldBlue", BoldBlueCompositeConverter.class.getName());
+        defaultConverterMap.put("boldMagenta", BoldMagentaCompositeConverter.class.getName());
+        defaultConverterMap.put("boldCyan", BoldCyanCompositeConverter.class.getName());
+        defaultConverterMap.put("boldWhite", BoldWhiteCompositeConverter.class.getName());
+        defaultConverterMap.put("highlight", HighlightingCompositeConverter.class.getName());
+
+        defaultConverterMap.put("lsn", LocalSequenceNumberConverter.class.getName());
+
+        //加入自定义的highlight和pid转换器
+        defaultConverterMap.put("easyHighlight", EasyHighlightingCompositeConverter.class.getName());
+        defaultConverterMap.put("pid", PidClassicConverter.class.getName());
+
+    }
+
+    public EasyPatternLayout() {
+        this.postCompileProcessor = new EnsureExceptionHandling();
+    }
+
+    public Map<String, String> getDefaultConverterMap() {
+        return defaultConverterMap;
+    }
+
+    public String doLayout(ILoggingEvent event) {
+        if (!isStarted()) {
+            return CoreConstants.EMPTY_STRING;
+        }
+        return writeLoopOnConverters(event);
+    }
+
+    @Override
+    protected String getPresentationHeaderPrefix() {
+        return HEADER_PREFIX;
+    }
+
+}

+ 28 - 0
lift-common/src/main/java/cn.com.ty.lift.common/logger/PidClassicConverter.java

@@ -0,0 +1,28 @@
+package cn.com.ty.lift.common.logger;
+
+import ch.qos.logback.classic.pattern.ClassicConverter;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+
+/**
+ * 进程ID 获取
+ *
+ * @author wcz
+ * @since 2020/2/7
+ */
+public class PidClassicConverter extends ClassicConverter {
+
+    /**
+     * (non-Javadoc)
+     * 
+     * @see ch.qos.logback.core.pattern.Converter#convert(java.lang.Object)
+     */
+    public String convert(ILoggingEvent event) {
+        RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
+        String name = runtime.getName();
+        return name.substring(0, name.indexOf("@"));
+    }
+
+}

+ 0 - 111
lift-common/src/main/java/cn.com.ty.lift.common/sql/DbType.java

@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package cn.com.ty.lift.common.sql;
-
-import lombok.Getter;
-
-/**
- * MybatisPlus 数据库类型
- *
- * @author hubin
- * @since 2018-06-23
- */
-@Getter
-public enum DbType {
-    /**
-     * MYSQL
-     */
-    MYSQL("mysql", "%s LIKE CONCAT('%%',#{%s},'%%')", "MySql数据库"),
-    /**
-     * MARIADB
-     */
-    MARIADB("mariadb", "%s LIKE CONCAT('%%',#{%s},'%%')", "MariaDB数据库"),
-    /**
-     * ORACLE
-     */
-    ORACLE("oracle", "%s LIKE CONCAT(CONCAT('%%',#{%s}),'%%')", "Oracle数据库"),
-    /**
-     * DB2
-     */
-    DB2("db2", "%s LIKE CONCAT(CONCAT('%%',#{%s}),'%%')", "DB2数据库"),
-    /**
-     * H2
-     */
-    H2("h2", "%s LIKE CONCAT('%%',#{%s},'%%')", "H2数据库"),
-    /**
-     * HSQL
-     */
-    HSQL("hsql", "%s LIKE CONCAT('%%',#{%s},'%%')", "HSQL数据库"),
-    /**
-     * SQLITE
-     */
-    SQLITE("sqlite", "%s LIKE CONCAT('%%',#{%s},'%%')", "SQLite数据库"),
-    /**
-     * POSTGRE
-     */
-    POSTGRE_SQL("postgresql", "%s LIKE CONCAT('%%',#{%s},'%%')", "Postgre数据库"),
-    /**
-     * SQLSERVER2005
-     */
-    SQL_SERVER2005("sqlserver2005", "%s LIKE '%%'+#{%s}+'%%'", "SQLServer2005数据库"),
-    /**
-     * SQLSERVER
-     */
-    SQL_SERVER("sqlserver", "%s LIKE '%%'+#{%s}+'%%'", "SQLServer数据库"),
-    /**
-     * DM
-     */
-    DM("dm", null, "达梦数据库"),
-    /**
-     * UNKONWN DB
-     */
-    OTHER("other", null, "其他数据库");
-
-    /**
-     * 数据库名称
-     */
-    private final String db;
-    /**
-     * LIKE 拼接模式
-     */
-    private final String like;
-    /**
-     * 描述
-     */
-    private final String desc;
-
-
-    DbType(String db, String like, String desc) {
-        this.db = db;
-        this.like = like;
-        this.desc = desc;
-    }
-
-    /**
-     * 获取数据库类型(默认 MySql)
-     *
-     * @param dbType 数据库类型字符串
-     */
-    public static DbType getDbType(String dbType) {
-        DbType[] dts = DbType.values();
-        for (DbType dt : dts) {
-            if (dt.getDb().equalsIgnoreCase(dbType)) {
-                return dt;
-            }
-        }
-        return OTHER;
-    }
-}

+ 6 - 3
lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlAnalyzer.java

@@ -29,6 +29,8 @@ import org.apache.ibatis.session.ResultHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.sql.Statement;
+import java.time.Duration;
+import java.time.Instant;
 import java.util.*;
 
 /**
@@ -158,9 +160,10 @@ public class SqlAnalyzer implements Interceptor {
         }
 
         // 计算执行 SQL 耗时
-        long start = SystemClock.now();
+        Instant start = Instant.now();
         Object result = invocation.proceed();
-        long timing = SystemClock.now() - start;
+        Instant end = Instant.now();
+        long timing = Duration.between(start, end).toMillis();
 
         // 格式化 SQL 打印执行结果
         Object target = SqlUtils.realTarget(invocation.getTarget());
@@ -182,7 +185,7 @@ public class SqlAnalyzer implements Interceptor {
         } else {
             System.err.println(sql);
             if (this.getMaxTime() >= 1 && timing > this.getMaxTime()) {
-                throw new IllegalArgumentException("The SQL execution time is too large, please optimize ! ");
+                throw new SqlAnalyzerException("The SQL execution time is too large, please optimize ! ");
             }
         }
         return result;

+ 11 - 37
lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlLike.java

@@ -16,50 +16,24 @@
 package cn.com.ty.lift.common.sql;
 
 /**
- * SQL like 枚举
+ * SqlAnalyzer 异常类
  *
- * @author Caratacus
- * @since 2016-12-4
+ * @author wcz
+ * @since 2016-01-23
  */
-public enum SqlLike {
-    /**
-     * LEFT
-     */
-    LEFT("left", "左边%"),
-    /**
-     * RIGHT
-     */
-    RIGHT("right", "右边%"),
-    /**
-     * CUSTOM
-     */
-    CUSTOM("custom", "定制"),
-    /**
-     * DEFAULT
-     */
-    DEFAULT("default", "两边%");
+public class SqlAnalyzerException extends RuntimeException {
 
-    /**
-     * 主键
-     */
-    private final String type;
+    private static final long serialVersionUID = 1L;
 
-    /**
-     * 描述
-     */
-    private final String desc;
-
-    SqlLike(final String type, final String desc) {
-        this.type = type;
-        this.desc = desc;
+    public SqlAnalyzerException(String message) {
+        super(message);
     }
 
-    public String getType() {
-        return type;
+    public SqlAnalyzerException(Throwable throwable) {
+        super(throwable);
     }
 
-    public String getDesc() {
-        return desc;
+    public SqlAnalyzerException(String message, Throwable throwable) {
+        super(message, throwable);
     }
-
 }

+ 1 - 5
lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlFormatter.java

@@ -90,11 +90,7 @@ public class SqlFormatter {
         String lcToken;
 
         FormatProcess(String sql) {
-            tokens = new StringTokenizer(
-                    sql,
-                    "()+*/-=<>'`\"[]," + WHITESPACE,
-                    true
-            );
+            tokens = new StringTokenizer(sql, "()+*/-=<>'`\"[]," + WHITESPACE, true);
         }
 
         private static boolean isFunctionName(String tok) {

+ 3 - 88
lift-common/src/main/java/cn.com.ty.lift.common/sql/SqlUtils.java

@@ -15,14 +15,11 @@
  */
 package cn.com.ty.lift.common.sql;
 
-import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.reflection.SystemMetaObject;
 
 import java.lang.reflect.Proxy;
 import java.util.Collection;
-import java.util.Properties;
-import java.util.regex.Pattern;
 
 /**
  * SqlUtils工具类
@@ -32,14 +29,8 @@ import java.util.regex.Pattern;
  */
 public class SqlUtils {
 
-    /**
-     * 验证字符串是否是数据库字段
-     */
-    private static final Pattern      P_IS_COLUMN           = Pattern.compile("^\\w\\S*[\\w\\d]*$");
-    private static final String       PERCENT               = "%";
-    private static final String       EMPTY                 = "";
-    public static final  String       DELEGATE_BOUNDSQL_SQL = "delegate.boundSql.sql";
-    private final static SqlFormatter SQL_FORMATTER         = new SqlFormatter();
+    private static final SqlFormatter SQL_FORMATTER = new SqlFormatter();
+    private static final String       h_target      = "h.target";
 
     /**
      * 格式sql
@@ -58,74 +49,6 @@ public class SqlUtils {
         return boundSql;
     }
 
-    /**
-     * 用%连接like
-     *
-     * @param str 原字符串
-     * @return
-     */
-    public static String concatLike(String str, SqlLike type) {
-        StringBuilder builder = new StringBuilder(str.length() + 3);
-        switch (type) {
-            case LEFT:
-                builder.append(PERCENT).append(str);
-                break;
-            case RIGHT:
-                builder.append(str).append(PERCENT);
-                break;
-            case CUSTOM:
-                builder.append(str);
-                break;
-            default:
-                builder.append(PERCENT).append(str).append(PERCENT);
-        }
-        return builder.toString();
-    }
-
-    /**
-     * 获取需要转义的SQL字段
-     *
-     * @param dbType   数据库类型
-     * @param val      值
-     * @param isColumn val 是否是数据库字段
-     */
-    public static String sqlWordConvert(DbType dbType, String val, boolean isColumn) {
-        if (dbType == DbType.POSTGRE_SQL) {
-            if (isColumn && (isNotColumnName(val) || val.toLowerCase().equals(val))) {
-                // 都是数据库字段的情况下
-                // 1.手动加了转义符
-                // 2.全小写之后和原值一样
-                // 都直接返回
-                return val;
-            }
-            return String.format("\"%s\"", val);
-        }
-        return val;
-    }
-
-    /**
-     * SQL注入内容剥离
-     *
-     * @param sql 待处理 SQL 内容
-     * @return this
-     */
-    public static String stripSqlInjection(String sql) {
-        if (null == sql || sql.length() == 0) {
-            throw new MybatisPlusException("strip sql is null.");
-        }
-        return sql.replaceAll("('.+--)|(--)|(\\|)|(%7C)", EMPTY);
-    }
-
-    /**
-     * 判断字符串是否符合数据库字段的命名
-     *
-     * @param str 字符串
-     * @return 判断结果
-     */
-    public static boolean isNotColumnName(String str) {
-        return !P_IS_COLUMN.matcher(str).matches();
-    }
-
     /**
      * 判断字符串是否为空
      *
@@ -172,16 +95,8 @@ public class SqlUtils {
     public static <T> T realTarget(Object target) {
         if (Proxy.isProxyClass(target.getClass())) {
             MetaObject metaObject = SystemMetaObject.forObject(target);
-            return realTarget(metaObject.getValue("h.target"));
+            return realTarget(metaObject.getValue(h_target));
         }
         return (T) target;
     }
-
-    /**
-     * 根据 key 获取 Properties 的值
-     */
-    public static String getProperty(Properties properties, String key) {
-        String value = properties.getProperty(key);
-        return isEmpty(value) ? null : value;
-    }
 }

+ 0 - 77
lift-common/src/main/java/cn.com.ty.lift.common/sql/SystemClock.java

@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package cn.com.ty.lift.common.sql;
-
-import java.sql.Timestamp;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * 高并发场景下System.currentTimeMillis()的性能问题的优化
- *
- * <p>System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我还没测试过,有人说是100倍左右)</p>
- * <p>System.currentTimeMillis()之所以慢是因为去跟系统打了一次交道</p>
- * <p>后台定时更新时钟,JVM退出时,线程自动回收</p>
- * <p>10亿:43410,206,210.72815533980582%</p>
- * <p>1亿:4699,29,162.0344827586207%</p>
- * <p>1000万:480,12,40.0%</p>
- * <p>100万:50,10,5.0%</p>
- *
- * @author hubin
- * @since 2016-08-01
- */
-public class SystemClock {
-
-    private final long period;
-    private final AtomicLong now;
-
-    private SystemClock(long period) {
-        this.period = period;
-        this.now = new AtomicLong(System.currentTimeMillis());
-        scheduleClockUpdating();
-    }
-
-    private static SystemClock instance() {
-        return InstanceHolder.INSTANCE;
-    }
-
-    public static long now() {
-        return instance().currentTimeMillis();
-    }
-
-    public static String nowDate() {
-        return new Timestamp(now()).toString();
-    }
-
-    private void scheduleClockUpdating() {
-        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> {
-            Thread thread = new Thread(runnable, "Sql Clock");
-            thread.setDaemon(true);
-            return thread;
-        });
-        scheduler.scheduleAtFixedRate(() -> now.set(System.currentTimeMillis()), period, period, TimeUnit.MILLISECONDS);
-    }
-
-    private long currentTimeMillis() {
-        return now.get();
-    }
-
-    private static class InstanceHolder {
-        public static final SystemClock INSTANCE = new SystemClock(1);
-    }
-}

+ 1 - 1
lift-enterprise-service/src/main/java/cn/com/ty/lift/enterprise/common/ControllerAspect.java

@@ -61,7 +61,7 @@ public class ControllerAspect {
         if(null != res){
             int length = res.length();
             int sub = length - StrPool.LOG_PRINT_MAX;
-            res = sub > 0 ? res.substring(0, StrPool.LOG_PRINT_MAX) + StrPool.NEWLINE + "... " + sub + " characters omitted." : res;
+            res = sub < 0 ? res : res.substring(0, StrPool.LOG_PRINT_MAX) + StrPool.NEWLINE + "... " + sub + " characters omitted." + StrPool.NEWLINE + "}";
             log.info(StrPool.LOG_RESPONSE + StrPool.NEWLINE + res);
         }
     }

+ 1 - 1
lift-enterprise-service/src/main/resources/logback-spring.xml

@@ -13,7 +13,7 @@
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder charset="utf-8">
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
-            <pattern>%highlight([%-5level]) %green(%d{${DATETIME}}) %highlight([%thread]) %boldMagenta(%logger{30}) - %m%n
+            <pattern>%highlight([%-5level]) %highlight(%d{${DATETIME}}) %cyan([%thread]) %boldMagenta(%logger{30}) - %m%n
             </pattern>
         </encoder>
     </appender>

+ 5 - 5
lift-enterprise-service/src/main/resources/mapper/oa/LiftCertificateMapper.xml

@@ -27,11 +27,14 @@
 		FROM
 			`lift_certificate` lc
 			LEFT JOIN user_info ui ON ui.user_id = lc.owner_id
-            LEFT JOIN mt_company_user mcu ON mcu.user_id = lc.owner_id
+            LEFT JOIN mt_company_user mcu ON mcu.user_id = lc.owner_id AND mcu.mt_company_id = lc.mt_company_id
 		<where>
             <if test="cond.mtCompanyId != null and cond.mtCompanyId > 0">
                 AND lc.mt_company_id = #{cond.mtCompanyId}
             </if>
+            <if test="cond.status != null">
+                AND lc.`status` = #{cond.status}
+            </if>
             <if test="cond.certificateType == 1">
                 AND mcu.user_role IN (12,13)
             </if>
@@ -41,9 +44,6 @@
 			<if test="cond.username != null and cond.username !=''">
                 AND ui.`name` LIKE concat('%',#{cond.username},'%')
             </if>
-            <if test="cond.status != null">
-                AND lc.`status` = #{cond.status}
-            </if>
         </where>
     </select>
 
@@ -52,7 +52,7 @@
           count(*)
         FROM
           `lift_certificate` lc
-        LEFT JOIN mt_company_user mcu ON mcu.user_id = lc.owner_id
+        LEFT JOIN mt_company_user mcu ON mcu.user_id = lc.owner_id AND mcu.mt_company_id = lc.mt_company_id
         <where>
             <if test="cond.mtCompanyId != null and cond.mtCompanyId > 0">
                 AND lc.mt_company_id = #{cond.mtCompanyId}

+ 1 - 1
lift-quan-service/src/main/resources/logback-spring.xml

@@ -12,7 +12,7 @@
     <!-- 控制台打印 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder charset="utf-8">
-            <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
+            <pattern>%highlight([%-5level]) %highlight(%d{${DATETIME}}) %cyan([%thread]) %boldMagenta(%logger{30}) - %m%n
             </pattern>
         </encoder>
     </appender>

+ 1 - 1
lift-system-service/src/main/java/cn/com/ty/lift/system/config/ControllerAspect.java

@@ -56,7 +56,7 @@ public class ControllerAspect {
         if(null != res){
             int length = res.length();
             int sub = length - StrPool.LOG_PRINT_MAX;
-            res = sub > 0 ? res.substring(0, StrPool.LOG_PRINT_MAX) + StrPool.NEWLINE + "... " + sub + " characters omitted." : res;
+            res = sub < 0 ? res : res.substring(0, StrPool.LOG_PRINT_MAX) + StrPool.NEWLINE + "... " + sub + " characters omitted." + StrPool.NEWLINE + "}";
             log.info(StrPool.LOG_RESPONSE + StrPool.NEWLINE + res);
         }
     }

+ 1 - 1
lift-system-service/src/main/resources/logback-spring.xml

@@ -13,7 +13,7 @@
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder charset="utf-8">
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
-            <pattern>%highlight([%-5level]) %green(%d{${DATETIME}}) %highlight([%thread]) %boldMagenta(%logger{30}) - %m%n
+            <pattern>%highlight([%-5level]) %highlight(%d{${DATETIME}}) %cyan([%thread]) %boldMagenta(%logger{30}) - %m%n
             </pattern>
         </encoder>
     </appender>