修改:流程服务增加日志配置,hpc优化日志打印

This commit is contained in:
2026-01-31 17:16:42 +08:00
parent 20ac35a69e
commit 03510c6409
3 changed files with 160 additions and 48 deletions

View File

@@ -3,7 +3,6 @@ package com.sdm.common.feign.impl.pbs;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.pbs.SubmitHpcTaskRemoteReq;
import com.sdm.common.feign.inter.pbs.ITaskFeignClient;
import com.sdm.common.log.CoreLogger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -22,7 +21,7 @@ public class TaskClientFeignClientImpl implements ITaskFeignClient {
response = taskFeignClient.adapterSubmitHpcJob(req);
return response;
} catch (Exception e) {
CoreLogger.error("SubmitHpcJob Exception:{}", e.getMessage());
log.error("SubmitHpcJob Exception:{}", e.getMessage());
return SdmResponse.failed("Hpc任务提交失败:"+e.getMessage());
}

View File

@@ -16,6 +16,7 @@ import com.sdm.common.feign.impl.system.MessageFeignClientImpl;
import com.sdm.common.feign.inter.data.IDataFeignClient;
import com.sdm.common.feign.inter.pbs.ITaskFeignClient;
import com.sdm.common.log.CoreLogger;
import com.sdm.common.utils.MdcUtil;
import com.sdm.flowable.entity.ProcessNodeParam;
import com.sdm.flowable.enums.AsyncTaskStatusEnum;
import com.sdm.flowable.service.IAsyncTaskRecordService;
@@ -58,7 +59,8 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
* */
@Override
public void execute(DelegateExecution execution, Map<String, Object> params, HPCExecuteConfig config) {
CoreLogger.info("hpc process excute,params:{},config:{}",JSONObject.toJSONString(params),JSONObject.toJSONString(config));
MdcUtil.generateAndPutTraceId();
log.info("hpc process excute,params:{},config:{}",JSONObject.toJSONString(params),JSONObject.toJSONString(config));
SubmitHpcTaskRemoteReq submitHpcTaskRemoteReq = convertParamsToReq(params);
submitHpcTaskRemoteReq.setParams(params);
// 设置软件id
@@ -69,11 +71,12 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
String masterFileRegularStr = Objects.isNull(params.get("inputFormat"))?"":params.get("inputFormat").toString();
String inputFilesRegularStr = Objects.isNull(params.get("slaveFormat"))?"":params.get("slaveFormat").toString();
CoreLogger.info("hpc executeMode:{}",params.get("executeMode"));
log.info("hpc executeMode:{}",params.get("executeMode"));
String executeMode = params.get("executeMode").toString();
if(StringUtils.isBlank(executeMode)||
(!Objects.equals(executeMode,FlowableConfig.EXECUTE_MODE_AUTO)&&
!Objects.equals(executeMode,FlowableConfig.EXECUTE_MODE_MANUAL))){
MdcUtil.removeTraceId();
throw new RuntimeException("hpc executeMode illegal");
}
// 自动才判断正则
@@ -81,10 +84,11 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
StringUtils.isBlank(masterFileRegularStr)){
log.info("hpc process excute,主求解文件规则是空,masterFileRegularStr:{},inputFilesRegularStr:{}",
params.get("inputFormat"),params.get("slaveFormat"));
MdcUtil.removeTraceId();
throw new RuntimeException("Hpc任务执行失败主求解文件规则不能是空");
}
CoreLogger.info("beforeNodeId:{},currentNodeId:{},masterFileRegularStr:{},inputFilesRegularStr:{}",beforeNodeId,currentNodeId,masterFileRegularStr,inputFilesRegularStr);
CoreLogger.info("Hpc执行 processDefinitionId:{},processInstanceId:{}",execution.getProcessDefinitionId(),execution.getProcessInstanceId());
log.info("beforeNodeId:{},currentNodeId:{},masterFileRegularStr:{},inputFilesRegularStr:{}",beforeNodeId,currentNodeId,masterFileRegularStr,inputFilesRegularStr);
log.info("Hpc执行 processDefinitionId:{},processInstanceId:{}",execution.getProcessDefinitionId(),execution.getProcessInstanceId());
// 初始化用户/租户信息
initUserInfo(execution,params);
// params 取只是测试使用
@@ -109,6 +113,7 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
// 推送失败消息
sendMsg(ThreadLocalContext.getTenantId(),ThreadLocalContext.getUserId(),submitHpcTaskRemoteReq.getJobName(),"失败");
log.error("HpcHandler submit failed:{}",JSONObject.toJSONString(params));
MdcUtil.removeTraceId();
throw new RuntimeException("HpcHandler submit failed,"+submitResp.getMessage());
}
@@ -125,7 +130,7 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
status,
hpcTaskId
);
MdcUtil.removeTraceId();
log.info("HPC 任务 {} 已提交", "hpcTaskId");
}
@@ -154,7 +159,7 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
ThreadLocalContext.setUserId(userId);
ThreadLocalContext.setUserName(userName);
ThreadLocalContext.setTenantId(tenantId);
CoreLogger.info("hpcHander initUserInfo userId:{},tenantId:{},userName:{}",userId,tenantId,userName);
log.info("hpcHander initUserInfo userId:{},tenantId:{},userName:{}",userId,tenantId,userName);
}
private void dealHpcFile(SubmitHpcTaskRemoteReq submitHpcTaskRemoteReq, String beforeNodeId, String currentNodeId,
@@ -175,11 +180,15 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
List<ProcessNodeParam> currentNodeParams = nodeParamMap.get(currentNodeId);
if(Objects.equals(executeMode,FlowableConfig.EXECUTE_MODE_AUTO)){
if(CollectionUtils.isEmpty(beforeNodeParams) || CollectionUtils.isEmpty(currentNodeParams)){
MdcUtil.removeTraceId();
log.warn("未获取到当前节点或者求解文件节点信息");
throw new RuntimeException("未获取到当前节点或者求解文件节点信息");
}
}
if(Objects.equals(executeMode,FlowableConfig.EXECUTE_MODE_MANUAL)){
if(CollectionUtils.isEmpty(currentNodeParams)){
MdcUtil.removeTraceId();
log.warn("未获取到当前节点信息");
throw new RuntimeException("未获取到当前节点信息");
}
}
@@ -193,14 +202,15 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
// 本地求解文件路径 taskLocalBaseDir
String simulationFilePath = simulationBaseDir + beforeNodeJectKey;
submitHpcTaskRemoteReq.setSimulationFileLocalPath(simulationFilePath);
CoreLogger.info("simulationFileLocalPath :{} ",simulationBaseDir + beforeNodeJectKey);
log.info("simulationFileLocalPath :{} ",simulationBaseDir + beforeNodeJectKey);
}
// 手动上传的
if (Objects.equals(executeMode,FlowableConfig.EXECUTE_MODE_MANUAL)) {
List<String> masterFilePaths = getFileListFromMap(params, "masterFileRegularStr");
List<String> inPutFilePaths = getFileListFromMap(params, "inputFilesRegularStr");
if(CollectionUtils.isEmpty(masterFilePaths)){
CoreLogger.warn("hpc executeMode manual,filepath illegal");
log.warn("hpc executeMode manual,filepath illegal");
MdcUtil.removeTraceId();
throw new RuntimeException("手动模式求解文件不能为空");
}
submitHpcTaskRemoteReq.setManualMasterFilepaths(masterFilePaths);
@@ -217,7 +227,7 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
submitHpcTaskRemoteReq.setStdoutSpdmMinoFilePath(currentNodeJectKey);
// hpc 回传本地文件路径
submitHpcTaskRemoteReq.setStdoutSpdmNasFilePath(simulationBaseDir + currentNodeJectKey);
CoreLogger.info("stdoutSpdmNasFilePath :{} ",simulationBaseDir + currentNodeJectKey);
log.info("stdoutSpdmNasFilePath :{} ",simulationBaseDir + currentNodeJectKey);
}
/**
@@ -260,7 +270,7 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
* 将参数Map转换为SubmitHpcTaskRemoteReq对象的工具方法 String command
*/
private SubmitHpcTaskRemoteReq convertParamsToReq(Map<String, Object> params) {
CoreLogger.error("convertParamsToReq start ");
log.info("convertParamsToReq start ");
SubmitHpcTaskRemoteReq req = new SubmitHpcTaskRemoteReq();
if (params == null) {
return req;
@@ -270,55 +280,23 @@ public class HpcHandler implements ExecutionHandler<Map<String, Object>,HPCExecu
// 处理int类型字段包含空值和非数字的异常处理
try {
req.setCoreNum(params.get("coreNum") != null ? Integer.parseInt(params.get("coreNum").toString()) : 0);
} catch (NumberFormatException e) {
CoreLogger.error("coreNum parse error:{},coreNum:{}",e.getMessage(),params.get("coreNum"));
} catch (Exception e) {
log.error("coreNum parse error:{},coreNum:{}",e.getMessage(),params.get("coreNum"));
req.setCoreNum(0);
}
req.setSoftware(params.get("software").toString());
req.setJobType(params.get("jobType").toString());
try {
req.setIndependence(params.get("independence") != null ? Integer.parseInt(params.get("independence").toString()) : 0);
} catch (NumberFormatException e) {
} catch (Exception e) {
log.warn("get independence error:{}",e.getMessage());
req.setIndependence(0);
}
req.setTaskId(params.get("taskId").toString());
req.setTaskName(params.get("taskName").toString());
req.setRunId(params.get("runId").toString());
req.setRunName(params.get("runName").toString());
// mock 时暂时自己传递,后面根据软件名称查询命令 todo 后面从表配置查询
// String command =(params.get("command")==null||StringUtils.isBlank(params.get("command").toString()))?
// "\\\\CARSAFE\\share\\solver\\RLithium\\reta.exe -i %s" : params.get("command").toString();
// 只是测试环境用于兜底mock
// if(StringUtils.isBlank(command)){
// command = mockCommand;
// }
// if(StringUtils.isBlank(command)){
// CoreLogger.error("command is empty!!!!!");
// throw new RuntimeException("command is empty");
// }
// req.setCommand(command);
req.setProjectname(params.get("projectname").toString());
// req.setFeatchFileType(params.get("featchFileType").toString());
// req.setBeforeNodeId(params.get("beforeNodeId").toString());
// 处理commandExpand字段JSON字符串转Map
// 动态命令
// String commandExpandJson = params.get("commandExpand").toString();
// if (StringUtils.isNotBlank(commandExpandJson)) {
// try {
// // 将JSON字符串转换为Map<String, SimulationCommandPlaceholderReq>
// Map<String, SimulationCommandPlaceholderReq> commandExpand = objectMapper.readValue(
// commandExpandJson,
// new TypeReference<Map<String, SimulationCommandPlaceholderReq>>() {}
// );
//// req.setCommandExpand(commandExpand);
// } catch (Exception e) {
// CoreLogger.error("convertParamsToReq error:{},params:{}",e.getMessage(), JSONObject.toJSONString(params));
// // 如设为null或空Map
//// req.setCommandExpand(new HashMap<>());
// }
// }
return req;
}

View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 彩色日志依赖的渲染类 -->
<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([%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr([%15.15t]){faint} %clr(%logger){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 普通日志格式(无颜色) -->
<property name="FILE_LOG_PATTERN" value="[%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%15.15t] %logger : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
<!-- 日志文件存储地址 -->
<property name="LOG_HOME" value="/home/app/flowable/logs" />
<!-- 1. 控制台输出默认输出DEBUG及以上级别 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 2. INFO级别日志输出到running.log仅包含INFO及以上不包含DEBUG -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/running.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/running.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>500MB</TotalSizeCap>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 过滤只接受INFO及以上级别INFO, WARN, ERROR排除DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 3. DEBUG级别日志输出到running_debug.log仅包含DEBUG级别 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/running_debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/running_debug.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>500MB</TotalSizeCap>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 过滤只接受DEBUG级别 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch> <!-- 匹配DEBUG级别则接受 -->
<onMismatch>DENY</onMismatch> <!-- 不匹配则拒绝 -->
</filter>
</appender>
<!-- 4. core.log 专用输出器(保留 callerInfo 格式) -->
<appender name="CORE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/core.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/core.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>500MB</TotalSizeCap>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 仅 core.log 显示真实调用位置(类名.方法名(行号) -->
<pattern>[%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%15.15t] %X{callerInfo} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 全局日志级别设置为DEBUG确保DEBUG日志能被捕获 -->
<root level="INFO">
<appender-ref ref="STDOUT" /> <!-- 控制台输出DEBUG及以上 -->
<appender-ref ref="INFO_FILE" /> <!-- INFO及以上输出到running.log -->
<appender-ref ref="DEBUG_FILE" /> <!-- 仅DEBUG输出到running_debug.log -->
</root>
<!-- 绑定 FeignClient → 输出到日志文件 -->
<logger name="FeignClient" level="INFO" additivity="false">
<appender-ref ref="INFO_FILE" />
<appender-ref ref="STDOUT" />
</logger>
<!-- 绑定 coreLogger → 输出到 core.log + 控制台 -->
<logger name="coreLogger" level="INFO" additivity="false">
<appender-ref ref="CORE_FILE" /> <!-- 核心日志写入 core.log -->
<appender-ref ref="STDOUT" /> <!-- 同时输出到控制台(显示 CoreLogger -->
</logger>
<!-- MyBatis SQL语句输出配置 -->
<logger name="org.apache.ibatis" level="DEBUG"/>
<logger name="org.apache.ibatis.session.AutoMappingUnknownColumnBehavior" level="ERROR"/>
<!-- MyBatis SQL语句详细输出 -->
<logger name="org.apache.ibatis.logging" level="DEBUG"/>
<logger name="org.apache.ibatis.logging.jdbc" level="DEBUG"/>
<logger name="org.apache.ibatis.logging.jdbc.BaseJdbcLogger" level="DEBUG"/>
<logger name="org.apache.ibatis.datasource" level="DEBUG"/>
<logger name="org.apache.ibatis.transaction" level="DEBUG"/>
<logger name="org.apache.ibatis.cache" level="DEBUG"/>
<logger name="org.mybatis" level="DEBUG"/>
<logger name="org.mybatis.spring" level="DEBUG"/>
<logger name="org.mybatis.spring.SqlSessionUtils" level="DEBUG"/>
<logger name="org.mybatis.spring.transaction" level="DEBUG"/>
<!-- MyBatis-Plus 相关日志配置 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<logger name="com.baomidou.mybatisplus.core" level="DEBUG"/>
<logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="DEBUG"/>
<logger name="com.baomidou.mybatisplus.core.MybatisMapperRegistry" level="DEBUG"/>
<logger name="com.baomidou.mybatisplus.core.override.MybatisMapperProxy" level="DEBUG"/>
<logger name="com.baomidou.mybatisplus.extension" level="DEBUG"/>
<logger name="com.baomidou.mybatisplus.extension.spring" level="DEBUG"/>
<logger name="com.baomidou.mybatisplus.extension.MybatisPlusProperties" level="DEBUG"/>
<logger name="java.sql" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="java.sql.ResultSet" level="DEBUG"/>
<logger name="com.sdm.flowable" level="INFO"/>
<logger name="com.sdm.flowable.dao" level="DEBUG"/>
<logger name="com.sdm.flowable.dao" level="DEBUG"/>
</configuration>