소스 검색

Merge branch 'test' into project-xiaoan

dsx 2 년 전
부모
커밋
f3bef296b9

+ 50 - 9
pom.xml

@@ -3,9 +3,10 @@
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
-		<groupId>com.fdkankan</groupId>
-		<artifactId>4dkankan-parent</artifactId>
-		<version>2.0.0-SNAPSHOT</version>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.3.12.RELEASE</version>
+		<relativePath/>
 	</parent>
 	<artifactId>4dkankan-center-modeling</artifactId>
 	<version>2.0.0-SNAPSHOT</version>
@@ -48,16 +49,43 @@
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.logging.log4j</groupId>
+					<artifactId>log4j-to-slf4j</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 
 		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-api</artifactId>
+			<version>2.17.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-to-slf4j</artifactId>
+			<version>2.17.0</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.logging.log4j</groupId>
+					<artifactId>log4j-api</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+
+		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
 			<scope>test</scope>
 		</dependency>
+		<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
 		<dependency>
 			<groupId>com.alibaba.cloud</groupId>
 			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+			<version>2.2.7.RELEASE</version>
 		</dependency>
 
 		<dependency>
@@ -66,14 +94,9 @@
 		</dependency>
 
 		<dependency>
-			<groupId>cn.hutool</groupId>
-			<artifactId>hutool-all</artifactId>
-		</dependency>
-
-		<dependency>
 			<groupId>com.fdkankan</groupId>
 			<artifactId>4dkankan-utils-db</artifactId>
-			<version>2.0.0-SNAPSHOT</version>
+			<version>3.0.0-SNAPSHOT</version>
 		</dependency>
 
 		<dependency>
@@ -82,6 +105,24 @@
 			<version>2.3.1</version>
 		</dependency>
 
+		<dependency>
+			<groupId>com.yomahub</groupId>
+			<artifactId>tlog-web-spring-boot-starter</artifactId>
+			<version>1.5.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>net.logstash.logback</groupId>
+			<artifactId>logstash-logback-encoder</artifactId>
+			<version>5.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.yomahub</groupId>
+			<artifactId>tlog-logstash-logback</artifactId>
+			<version>1.5.0</version>
+		</dependency>
+
 	</dependencies>
 
 	<build>

+ 81 - 0
src/main/java/com/fdkankan/modeling/entity/SceneBuildProcessLog.java

@@ -0,0 +1,81 @@
+package com.fdkankan.modeling.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景计算流程状态表
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+@Getter
+@Setter
+@TableName("t_scene_build_process_log")
+public class SceneBuildProcessLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 计算流程(pre-前置处理,call-计算,post-后置处理)
+     */
+    @TableField("process")
+    private String process;
+
+    /**
+     * mq消息队列名称
+     */
+    @TableField("queue_name")
+    private String queueName;
+
+    /**
+     * 处理状态(0-处理中,1-成功,-1-失败)
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 失败原因
+     */
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+
+}

+ 5 - 8
src/main/java/com/fdkankan/modeling/generate/AutoGenerate.java

@@ -14,13 +14,10 @@ public class AutoGenerate {
 
     public static void main(String[] args) {
 
-        System.out.println("相对路径指定到:"+ System.getProperty("user.dir"));
-
-
-        String path =System.getProperty("user.dir") + "\\4dkankan-center-modeling";
+        String path =System.getProperty("user.dir");
 
         generate(path,"modeling", getTables(new String[]{
-                "t_build_log",
+                "t_scene_build_process_log"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -48,8 +45,8 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://192.168.0.47:13306/4dkankan-center-modeling",
-                "root","4dkk2020cuikuan%")
+        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
+                "root","4Dage@4Dage#@168")
                 .globalConfig(builder -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)
@@ -80,7 +77,7 @@ public class AutoGenerate {
 
                             .entityBuilder()
                             .enableLombok()
-                            .logicDeleteColumnName("tb_status")
+                            .logicDeleteColumnName("rec_status")
                             .enableTableFieldAnnotation()
 //                            .superClass(BaseEntity.class)
 

+ 18 - 0
src/main/java/com/fdkankan/modeling/mapper/ISceneBuildProcessLogMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.modeling.mapper;
+
+import com.fdkankan.modeling.entity.SceneBuildProcessLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景计算流程状态表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+@Mapper
+public interface ISceneBuildProcessLogMapper extends BaseMapper<SceneBuildProcessLog> {
+
+}

+ 53 - 11
src/main/java/com/fdkankan/modeling/receiver/RabbitMqListener.java

@@ -6,6 +6,7 @@ import cn.hutool.core.io.watch.Watcher;
 import cn.hutool.core.lang.Console;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonOperStatus;
 import com.fdkankan.common.constant.ModelingBuildStatus;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.model.utils.ComputerUtil;
@@ -15,13 +16,18 @@ import com.fdkankan.modeling.entity.BuildLog;
 import com.fdkankan.modeling.exception.BuildException;
 import com.fdkankan.modeling.handler.LaserSceneObjGenerateHandler;
 import com.fdkankan.modeling.service.IBuildLogService;
+import com.fdkankan.modeling.service.IBuildService;
+import com.fdkankan.modeling.service.ISceneBuildProcessLogService;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
+import com.fdkankan.rabbitmq.bean.BuildSceneProcessLogMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
 import com.fdkankan.rabbitmq.util.RabbitMqProducer;
 import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.rabbitmq.client.Channel;
+import com.fdkankan.model.constants.SceneBuildProcessType;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.StopWatch;
 import org.springframework.amqp.core.Message;
 import org.springframework.amqp.rabbit.annotation.Queue;
@@ -59,6 +65,8 @@ public class RabbitMqListener {
     private String queueModelingCall;
     @Value("${queue.modeling.modeling-post}")
     private String queueModelingPost;
+    @Value("${queue.modeling.modeling-process-log}")
+    private String queueModelingProcessLog;
 
     @Autowired
     private RedisUtil redisUtil;
@@ -74,6 +82,11 @@ public class RabbitMqListener {
 
     @Autowired
     private LaserSceneObjGenerateHandler laserSceneObjGenerateHandler;
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
+
+    @Autowired
+    private IBuildService buildService;
 
     /**
      * 场景计算
@@ -128,6 +141,12 @@ public class RabbitMqListener {
         //开始计时
         StopWatch watch = new StopWatch();
         watch.start();
+
+        String num = message.getSceneNum();
+
+        //发送记录计算状态为计算中
+        this.sendCallBuildProcessLog(message, ModelingBuildStatus.CALCULATING);
+
         final BuildSceneResultBean buildSceneResult = new BuildSceneResultBean();
         String resultQueueName = StrUtil.isNotBlank(message.getResultReceiverMqName()) ?
                 message.getResultReceiverMqName() : queueModelingPost;
@@ -147,6 +166,7 @@ public class RabbitMqListener {
                 }
             });
             status = future.get(SysConstants.modelTimeOut, TimeUnit.HOURS);
+
             //结束计时
             watch.stop();
             buildLog.setDuration(watch.getTime(TimeUnit.SECONDS));
@@ -213,6 +233,14 @@ public class RabbitMqListener {
             } catch (Exception e) {
                 e.printStackTrace();
             }
+
+            // 检测计算结果文件是否有生成
+            String resultsPath = path + File.separator + "results" + File.separator;
+            if (!new File(resultsPath + "upload.json").exists()) {
+                log.error("未检测到计算结果文件:upload.json");
+                return ModelingBuildStatus.FAILED;
+            }
+
             return ModelingBuildStatus.SUCCESS;
         }
 
@@ -222,7 +250,7 @@ public class RabbitMqListener {
          */
         this.deleteCachesAndResult(path,message);
 
-        Map<String, String> dataMap = ComputerUtil.getTypeString(cameraType, algorithm, resolution,dataJson);
+        Map<String, String> dataMap = buildService.getTypeString(cameraType, algorithm, resolution,dataJson);
 
         String splitType = dataMap.get("splitType");
         String skyboxType = dataMap.get("skyboxType");
@@ -231,8 +259,13 @@ public class RabbitMqListener {
         //计算模型并返回需要上传oss的文件集合
         ComputerUtil.computer(num, path, buildType);
 
+        // 检测计算结果文件是否有生成
+        String resultsPath = path + File.separator + "results" + File.separator;
+        if (!new File(resultsPath + "upload.json").exists()) {
+            log.error("未检测到计算结果文件:upload.json");
+            return ModelingBuildStatus.FAILED;
+        }
         log.info("八目上完oss结束修改数据:"+num);
-
         return ModelingBuildStatus.SUCCESS;
     }
 
@@ -291,9 +324,20 @@ public class RabbitMqListener {
             //发送计算结果mq
             buildSceneResult.setDuration(buildLog.getDuration());
             this.sendCallResult(message, buildSceneResult);
+            this.sendCallBuildProcessLog(message, buildStatus);
         }
     }
 
+    /**
+     * 发送计算流程状态日志mq
+     * @param message
+     * @param buildStatus
+     */
+    private void sendCallBuildProcessLog(BuildSceneCallMessage message, ModelingBuildStatus buildStatus){
+        rabbitMqProducer.sendByWorkQueue(queueModelingProcessLog,
+                BuildSceneProcessLogMessage.builder().num(message.getSceneNum()).buildStatus(buildStatus.code()).build());
+    }
+
     private void preBuild(Map<String,Object> buildContext,BuildSceneCallMessage message, BuildLog buildLog) throws BuildException {
 
         // 初始化日志参数
@@ -304,8 +348,14 @@ public class RabbitMqListener {
         buildLog.setCreateTime(new Date());
         buildLog.setUpdateTime(new Date());
         buildLog.setBuildType(0);
+        buildLog.setStatus(0);
         // 设置缓存锁
         String key = SysConstants.SCENE_BUILDING + buildLog.getSceneNum();
+        // 如果是强制重新计算,则删除key。
+        if (StringUtils.equals(message.getRebuild(), "1")) {
+            redisUtil.del(key);
+        }
+
         // 获取缓存锁,防止重复消费
         Long building = redisUtil.incr(key, 1);
         buildLogService.save(buildLog);
@@ -353,15 +403,7 @@ public class RabbitMqListener {
         //判断是否计算过资源,若计算过删除缓存, 如果caches中存在_images文件或者目录,就删除掉,否则就删除除了images以外的所有文件和目录
         File caches = new File(path + File.separator + "caches");
         if (caches.exists()) {
-            for (File deleteFile : caches.listFiles()) {
-                if (!deleteFile.getAbsolutePath().contains("images")) {
-                    if (deleteFile.isDirectory()) {
-                        FileUtils.delAllFile(deleteFile.getAbsolutePath());
-                    } else {
-                        FileUtils.deleteFile(deleteFile.getAbsolutePath());
-                    }
-                }
-            }
+            FileUtils.deleteDirectory(path + File.separator + "caches");
         }
         //删除上一次计算出来的result目录
         if (new File(path + File.separator + "results").exists()) {

+ 11 - 0
src/main/java/com/fdkankan/modeling/service/IBuildService.java

@@ -0,0 +1,11 @@
+package com.fdkankan.modeling.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Map;
+
+public interface IBuildService {
+
+    Map<String, String> getTypeString(String cameraType, String algorithm, String resolution, JSONObject fdageData);
+
+}

+ 20 - 0
src/main/java/com/fdkankan/modeling/service/ISceneBuildProcessLogService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.modeling.service;
+
+import com.fdkankan.modeling.entity.SceneBuildProcessLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景计算流程状态表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+public interface ISceneBuildProcessLogService extends IService<SceneBuildProcessLog> {
+
+    public void clearSceneBuildProcessLog(String num, String process, String queueName);
+
+    public void saveSceneBuildProcessLog(String num, String process, String queueName, int status, String reason);
+
+}

+ 95 - 0
src/main/java/com/fdkankan/modeling/service/impl/BuildServiceImpl.java

@@ -0,0 +1,95 @@
+package com.fdkankan.modeling.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.model.enums.ModelTypeEnums;
+import com.fdkankan.modeling.service.IBuildService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class BuildServiceImpl implements IBuildService {
+
+    @Override
+    public Map<String, String> getTypeString(String cameraType, String algorithm, String resolution, JSONObject fdageData){
+        Map<String, String> map = new HashMap<>();
+        String splitType = "";
+        String skyboxType = "";
+        String dataDescribe = "";
+        if(Integer.parseInt(cameraType) >= 4){
+            if("0".equals(resolution)){
+//            skyboxType = "SKYBOX_V4";  //tiles
+//            skyboxType = "SKYBOX_V6";    //high,low,4k
+                skyboxType = "SKYBOX_V7";    //high,low,2k
+            }else {
+                skyboxType = "SKYBOX_V1";
+            }
+            splitType = "SPLIT_V1";
+//            skyboxType = "SKYBOX_V4";  //tiles
+            dataDescribe = "double spherical";
+
+            if(Integer.parseInt(cameraType) == 5 ){
+                //新双目相机
+//              skyboxType = "SKYBOX_V9";
+                splitType = "SPLIT_V9";
+                skyboxType = "SKYBOX_V1";
+            }
+            if(Integer.parseInt(cameraType) == 6){
+                //小红屋新双目相机
+//                    skyboxType = "SKYBOX_V9";
+                splitType = "SPLIT_V3";
+                skyboxType = "SKYBOX_V7";
+            }
+
+            if(Integer.parseInt(cameraType) == 13){
+                //转台相机
+                skyboxType = "SKYBOX_V6";
+                splitType = "SPLIT_V12";
+            }
+
+            if(Integer.parseInt(cameraType) == 14){
+                //转台相机
+                log.info("激光转台相机调用算法");
+                skyboxType = "SKYBOX_V11";
+                splitType = "SPLIT_V14";
+                if (!ObjectUtils.isEmpty(fdageData)) {
+                    if ((fdageData.containsKey("exportMeshObj") && fdageData.getIntValue("exportMeshObj") == 1)) {
+                        splitType = "SPLIT_V22";
+                    }
+                    if(fdageData.containsKey("OnlyExportMeshObj")){
+                        splitType = "SPLIT_V20";
+                    }
+                }
+            }
+
+        }else {
+            if("sfm".equals(algorithm)){
+                splitType = "SPLIT_V2";
+                skyboxType = "SKYBOX_V1";
+                dataDescribe = "old sfm";
+            }else {
+                splitType = "SPLIT_V3";
+                skyboxType = "SKYBOX_V1";
+                dataDescribe = "old slam";
+            }
+        }
+        if (!ObjectUtils.isEmpty(fdageData) && !ObjectUtils.isEmpty(fdageData.getString("modelType"))) {
+            switch (fdageData.getString("modelType")){
+                case ModelTypeEnums.TILE_CODE:
+                    if(skyboxType.equals("SKYBOX_V6")){
+                        skyboxType = "SKYBOX_V14";
+                    }else{
+                        skyboxType = "SKYBOX_V13";
+                    }
+            }
+        }
+        map.put("splitType", splitType);
+        map.put("skyboxType", skyboxType);
+        map.put("dataDescribe", dataDescribe);
+        return map;
+    }
+}

+ 50 - 0
src/main/java/com/fdkankan/modeling/service/impl/SceneBuildProcessLogServiceImpl.java

@@ -0,0 +1,50 @@
+package com.fdkankan.modeling.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.modeling.entity.SceneBuildProcessLog;
+import com.fdkankan.modeling.mapper.ISceneBuildProcessLogMapper;
+import com.fdkankan.modeling.service.ISceneBuildProcessLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * <p>
+ * 场景计算流程状态表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+@Service
+public class SceneBuildProcessLogServiceImpl extends ServiceImpl<ISceneBuildProcessLogMapper, SceneBuildProcessLog> implements ISceneBuildProcessLogService {
+
+    @Override
+    public void clearSceneBuildProcessLog(String num, String process, String queueName) {
+        this.remove(new LambdaQueryWrapper<SceneBuildProcessLog>()
+                .eq(SceneBuildProcessLog::getNum, num)
+                .eq(SceneBuildProcessLog::getProcess, process)
+                .eq(SceneBuildProcessLog::getQueueName, queueName));
+    }
+
+    @Override
+    public void saveSceneBuildProcessLog(String num, String process, String queueName, int status, String reason) {
+
+        SceneBuildProcessLog log = this.getOne(new LambdaQueryWrapper<SceneBuildProcessLog>()
+                .eq(SceneBuildProcessLog::getNum, num)
+                .eq(SceneBuildProcessLog::getProcess,process)
+                .eq(SceneBuildProcessLog::getQueueName, queueName));
+        if(Objects.isNull(log)){
+            log = new SceneBuildProcessLog();
+        }
+        log.setNum(num);
+        log.setProcess(process);
+        log.setProcess(process);
+        log.setQueueName(queueName);
+        log.setState(status);
+        log.setReason(reason);
+        this.saveOrUpdate(log);
+    }
+
+}

+ 0 - 9
src/main/resources/bootstrap-test.yml

@@ -31,12 +31,3 @@ spring:
           - data-id: common-fyun-config.yaml
             group: DEFAULT_GROUP
             refresh: true
-
-#management:
-#  endpoints:
-#    web:
-#      exposure:
-#        include: '*'
-#  endpoint:
-#    health:
-#      show-details: ALWAYS

+ 31 - 66
src/main/resources/logback-spring.xml

@@ -4,9 +4,9 @@
 <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
 <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
 <configuration scan="true" scanPeriod="10 seconds">
+	<contextName>nacos</contextName>
 	<springProperty scope="context" name="LOG_PATH" source="logging.path"/>
 
-	<contextName>logback</contextName>
 	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
 	<property name="log.path" value="${LOG_PATH}/modeling/logs" />
 
@@ -143,65 +143,40 @@
 			<onMismatch>DENY</onMismatch>
 		</filter>
 	</appender>
-	
-	<appender name="PROGRAM_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<!-- 正在记录的日志文件的路径及文件名 -->
-		<file>${log.path}/program/log_program.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}/program/log-program-%d{yyyy-MM-dd}.%i.log
-			</fileNamePattern>
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<maxFileSize>100MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!--日志文件保留天数 -->
-			<maxHistory>15</maxHistory>
-		</rollingPolicy>
-		<!-- 此日志文件只记录ERROR级别的 -->
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-			<onMatch>ACCEPT</onMatch>
-			<onMismatch>DENY</onMismatch>
-		</filter>
-	</appender>
-	<logger name="programLog" level="INFO" additivity="true">
-        <appender-ref ref="PROGRAM_FILE"/>
-    </logger>
 
-	<appender name="VISIT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<!-- 正在记录的日志文件的路径及文件名 -->
-		<file>${log.path}/visit/log_visit.log</file>
-		<!--日志文件输出格式 -->
-		<encoder>
-			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+	<springProperty scope="context" name="logstash_dest" source="logstash.ipAndPort"/>
+	<!--	<springProperty scope="context" name="preIvkApp" source="logstash.preIvkApp"/>-->
+	<springProperty scope="context" name="application_name" source="spring.application.name"/>
+	<springProperty scope="context" name="profiles_active" source="spring.profiles.active"/>
+	<appender name="LOGSTASH_ERROR_FILE" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+		<destination>${logstash_dest}</destination>
+		<keepAliveDuration>5 minutes</keepAliveDuration>
+		<!-- 日志输出编码 -->
+		<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+			<providers>
+				<provider class="com.yomahub.tlog.logstash.logback.TLogLogstashLogbackProvider"/>
+				<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+				<pattern>
+					<pattern>
+						{
+						"level": "%level",
+						"thread": "%thread",
+						"class": "%logger{40}",
+						"message": "%message",
+						"stack_trace": "%exception{10}",
+						"client_time": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
+						"preIvkApp":"${application_name}-${profiles_active}"
+						}
+					</pattern>
+				</pattern>
+			</providers>
 		</encoder>
-		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-			<fileNamePattern>${log.path}/visit/log-visit-%d{yyyy-MM-dd}.%i.log
-			</fileNamePattern>
-
-			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-				<maxFileSize>100MB</maxFileSize>
-			</timeBasedFileNamingAndTriggeringPolicy>
-			<!--日志文件保留天数 -->
-			<maxHistory>15</maxHistory>
-		</rollingPolicy>
-		<!-- 此日志文件只记录ERROR级别的 -->
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-			<onMatch>ACCEPT</onMatch>
-			<onMismatch>DENY</onMismatch>
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>ERROR</level>
 		</filter>
 	</appender>
-	<logger name="visitLog" level="INFO" additivity="true">
-        <appender-ref ref="VISIT_FILE"/>
-    </logger>
 
-	<!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, 
+	<!-- <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"/> -->
@@ -214,19 +189,9 @@
 		<appender-ref ref="INFO_FILE" />
 		<appender-ref ref="WARN_FILE" />
 		<appender-ref ref="ERROR_FILE" />
+		<appender-ref ref="LOGSTASH_ERROR_FILE" />
 	</root>
 
-	<!--生产环境:输出到文件 -->
-	<!--<springProfile name="pro"> -->
-	<!--<root level="info"> -->
-	<!--<appender-ref ref="CONSOLE" /> -->
-	<!--<appender-ref ref="DEBUG_FILE" /> -->
-	<!--<appender-ref ref="INFO_FILE" /> -->
-	<!--<appender-ref ref="ERROR_FILE" /> -->
-	<!--<appender-ref ref="WARN_FILE" /> -->
-	<!--</root> -->
-	<!--</springProfile> -->
-
 </configuration>
 
 

+ 5 - 0
src/main/resources/mapper/modeling/SceneBuildProcessLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.modeling.mapper.ISceneBuildProcessLogMapper">
+
+</mapper>