This commit is contained in:
USER-20220102CG\noblelift
2023-02-06 23:29:20 +08:00
parent 79e16a8e1d
commit a494d456c3
12 changed files with 139 additions and 121 deletions

View File

@@ -188,7 +188,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme
logServer.deviceExecuteLog(this.device_code, "", "", "信号task" + last_task + "->" + task); logServer.deviceExecuteLog(this.device_code, "", "", "信号task" + last_task + "->" + task);
} }
if (move != 0 && task > 0) { if (move != 0 && task > 0 ) {
// logServer.deviceExecuteLog(device_code, "", "", "输送线任务开始反馈任务状态,指令号:" + task); // logServer.deviceExecuteLog(device_code, "", "", "输送线任务开始反馈任务状态,指令号:" + task);
//inst_message //inst_message
inst = instructionService.findByCodeFromCache(String.valueOf(task)); inst = instructionService.findByCodeFromCache(String.valueOf(task));
@@ -781,18 +781,21 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme
Instruction instruction = instructionService.findByCodeFromCache(String.valueOf(task)); Instruction instruction = instructionService.findByCodeFromCache(String.valueOf(task));
if(ObjectUtil.isEmpty(instruction)){ if(ObjectUtil.isEmpty(instruction)){
message = "申请捆扎电气设备任务号:" + task + "未找到对应指令"; message = "申请捆扎电气设备任务号:" + task + "未找到对应指令";
throw new RuntimeException("该电气任务号未找到对应指令!"); return ;
// throw new RuntimeException("该电气任务号未找到对应指令!");
} }
vehicle_code = instruction.getVehicle_code(); vehicle_code = instruction.getVehicle_code();
} else { } else {
logServer.deviceExecuteLog(device_code, "", "", "申请捆扎电气设备任务号:" + task + "异常"); logServer.deviceExecuteLog(device_code, "", "", "申请捆扎电气设备任务号:" + task + "异常");
message = "申请捆扎电气设备任务号:" + task + "异常"; message = "申请捆扎电气设备任务号:" + task + "异常";
throw new RuntimeException("任务号为空!"); return ;
// throw new RuntimeException("任务号为空!");
} }
if (StrUtil.isEmpty(vehicle_code)) { if (StrUtil.isEmpty(vehicle_code)) {
logServer.deviceExecuteLog(device_code, "", "", "申请捆扎电气设备任务号:" + task + "未找到载具号"); logServer.deviceExecuteLog(device_code, "", "", "申请捆扎电气设备任务号:" + task + "未找到载具号");
message = "申请捆扎电气设备任务号:" + task + "未找到载具号"; message = "申请捆扎电气设备任务号:" + task + "未找到载具号";
throw new RuntimeException("载具号为空!"); return ;
// throw new RuntimeException("载具号为空!");
} }
ApplyLabelingAndBindingRequest applyLabelingAndBindingRequest = ApplyLabelingAndBindingRequest applyLabelingAndBindingRequest =
new ApplyLabelingAndBindingRequest(); new ApplyLabelingAndBindingRequest();

View File

@@ -56,45 +56,40 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService {
//入库任务状态反馈 //入库任务状态反馈
@Override @Override
public Resp<InStoreReportResponse> inStoreReport(InStoreReportRequest requestParam) throws Exception { public Resp<InStoreReportResponse> inStoreReport(InStoreReportRequest requestParam) throws Exception {
try {
MDC.put(log_file_type, log_type);
log.info("入库任务状态反馈-----输入参数{}", JSON.toJSONString(requestParam));
String inst_code = requestParam.getOrderId();
String status = requestParam.getState();
String carNo = requestParam.getRobotId();
Instruction inst = instructionService.findByCodeFromCache(inst_code);
TaskDto task = taskService.findByCodeFromCache(inst.getTask_code());
// 1 已接收 2 开始执行 3执行完成 4 5 取消
if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){
task.setTask_status("1");
taskService.update(task);
inst.setInstruction_status("1");
inst.setExecute_device_code(carNo);
inst.setCarno(carNo);
instructionService.update(inst);
} else if(StrUtil.equals(status,"3")){
inst.setInstruction_status("2");
instructionService.finish(inst.getInstruction_id());
} else if(StrUtil.equals(status,"4")) {
// 5 取消指令 log.info("入库任务状态反馈-----输入参数{}", JSON.toJSONString(requestParam));
} else if(StrUtil.equals(status,"5")) { String inst_code = requestParam.getOrderId();
String status = requestParam.getState();
String carNo = requestParam.getRobotId();
Instruction inst = instructionService.findByCodeFromCache(inst_code);
TaskDto task = taskService.findByCodeFromCache(inst.getTask_code());
// 1 已接收 2 开始执行 3执行完成 4 5 取消
if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){
task.setTask_status("1");
taskService.update(task);
inst.setInstruction_status("1");
inst.setExecute_device_code(carNo);
inst.setCarno(carNo);
instructionService.update(inst);
} else if(StrUtil.equals(status,"3")){
inst.setInstruction_status("2");
instructionService.finish(inst.getInstruction_id());
} else if(StrUtil.equals(status,"4")) {
instructionService.cancel(inst.getInstruction_id()); // 5 取消指令
} } else if(StrUtil.equals(status,"5")) {
InStoreReportResponse inStoreReportResponse = new InStoreReportResponse();
inStoreReportResponse.setOrderId(inst_code); instructionService.cancel(inst.getInstruction_id());
JSONObject result = new JSONObject();
result.put("result", "true");
result.put("code", "0");
result.put("comment", "");
result.put("data", inStoreReportResponse );
log.info("入库任务状态反馈-----输出参数{}", result);
return RespUtil.getResp(result.toString(), new InStoreReportResponse());
} finally {
MDC.remove(log_file_type);
} }
InStoreReportResponse inStoreReportResponse = new InStoreReportResponse();
inStoreReportResponse.setOrderId(inst_code);
JSONObject result = new JSONObject();
result.put("result", "true");
result.put("code", "0");
result.put("comment", "");
result.put("data", inStoreReportResponse );
log.info("入库任务状态反馈-----输出参数{}", result);
return RespUtil.getResp(result.toString(), new InStoreReportResponse());
} }

View File

@@ -691,6 +691,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
json.put("code", resp.code); json.put("code", resp.code);
json.put("data", data); json.put("data", data);
errArr.add(json); errArr.add(json);
continue;
} }
} else { } else {
@@ -703,6 +704,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
json.put("ext_task_id", ext_task_id); json.put("ext_task_id", ext_task_id);
json.put("message", e.getMessage()); json.put("message", e.getMessage());
errArr.add(json); errArr.add(json);
continue;
} }
} }
if (ObjectUtil.isEmpty(errArr)) { if (ObjectUtil.isEmpty(errArr)) {

View File

@@ -37,7 +37,7 @@ public class LokiLogAspect {
* @return * @return
*/ */
@Around("operatorLog()") @Around("operatorLog()")
public synchronized Object around(ProceedingJoinPoint pjp) throws Throwable { public Object around(ProceedingJoinPoint pjp) throws Throwable {
// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// HttpServletRequest request = attributes.getRequest(); // HttpServletRequest request = attributes.getRequest();
// HttpServletResponse response = attributes.getResponse(); // HttpServletResponse response = attributes.getResponse();

View File

@@ -2,6 +2,7 @@
package org.nl.acs.task.rest; package org.nl.acs.task.rest;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@@ -46,6 +47,7 @@ public class TaskController {
@GetMapping("/reload") @GetMapping("/reload")
@Log("数据同步") @Log("数据同步")
@ApiOperation("数据同步") @ApiOperation("数据同步")
@SaIgnore
//@PreAuthorize("@el.check('task:list')") //@PreAuthorize("@el.check('task:list')")
public ResponseEntity<Object> reload() { public ResponseEntity<Object> reload() {
taskService.reload(); taskService.reload();
@@ -146,4 +148,13 @@ public class TaskController {
return new ResponseEntity<>(HttpStatus.CREATED); return new ResponseEntity<>(HttpStatus.CREATED);
} }
@SaIgnore
@Log("查询缓存所有任务")
@ApiOperation("查询缓存任务")
@PostMapping(value = "/findAllTaskFromCache")
public ResponseEntity<Object> findAllTaskFromCache() {
return new ResponseEntity<>(taskService.findAllTaskFromCache(), HttpStatus.OK);
}
} }

View File

@@ -313,4 +313,6 @@ public interface TaskService {
* @return * @return
*/ */
Integer querySameDeviceReadyTask(String start_device,String next_device,String status); Integer querySameDeviceReadyTask(String start_device,String next_device,String status);
} }

View File

@@ -666,12 +666,16 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial {
wo.update(json); wo.update(json);
Iterator<TaskDto> iterator = tasks.iterator(); Iterator<TaskDto> iterator = tasks.iterator();
while (iterator.hasNext()) { // while (iterator.hasNext()) {
TaskDto task = iterator.next(); // TaskDto task = iterator.next();
if (task.getTask_code().equals(dto.getTask_code())) { // if (task.getTask_code().equals(dto.getTask_code())) {
iterator.remove(); // iterator.remove();
} // }
} // }
removeByCodeFromCache(entity.getTask_code());
if (StrUtil.equals(dto.getTask_status(), "0") || StrUtil.equals(dto.getTask_status(), "1")) { if (StrUtil.equals(dto.getTask_status(), "0") || StrUtil.equals(dto.getTask_status(), "1")) {
tasks.add(dto); tasks.add(dto);
} }
@@ -913,15 +917,17 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial {
JSONObject json = (JSONObject) JSONObject.toJSON(entity); JSONObject json = (JSONObject) JSONObject.toJSON(entity);
wo.update(json); wo.update(json);
synchronized (TaskServiceImpl.class){ // synchronized (TaskServiceImpl.class){
Iterator<TaskDto> it = tasks.iterator(); // Iterator<TaskDto> it = tasks.iterator();
// 清理缓存 // // 清理缓存
while (it.hasNext()) { // while (it.hasNext()) {
TaskDto taskDto = it.next(); // TaskDto taskDto = it.next();
if (taskDto.getTask_id().equals(id)) { // if (taskDto.getTask_id().equals(id)) {
tasks.remove(taskDto); // tasks.remove(taskDto);
} // }
}} // }}
removeByCodeFromCache(entity.getTask_code());
// 判断是否为WMS下发的任务如果是反馈任务状态给WMS // 判断是否为WMS下发的任务如果是反馈任务状态给WMS
String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue();
@@ -1263,14 +1269,11 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial {
@Override @Override
public boolean removeByCodeFromCache(String code) { public boolean removeByCodeFromCache(String code) {
Iterator<TaskDto> iterator = tasks.iterator(); CopyOnWriteArrayList<TaskDto> taskDtos = (CopyOnWriteArrayList<TaskDto>) this.tasks;
while (iterator.hasNext()) { taskDtos.removeIf((task) -> {
TaskDto task = iterator.next(); task.getTask_code().equals(code);
if (task.getTask_code().equals(code)) { return true;
iterator.remove(); });
return true;
}
}
return false; return false;
} }
@@ -1496,14 +1499,8 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial {
@Override @Override
public void updateByCodeFromCache(TaskDto dto) { public void updateByCodeFromCache(TaskDto dto) {
Iterator<TaskDto> iterator = tasks.iterator(); removeByCodeFromCache(dto.getTask_code());
while (iterator.hasNext()) { tasks.add(dto);
TaskDto task = iterator.next();
if (task.getTask_code().equals(dto.getTask_code())) {
iterator.remove();
}
}
tasks.add(dto);
} }
@Override @Override
@@ -1563,6 +1560,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial {
return num; return num;
} }
@Override @Override
public Integer querySameTaskByType(String taskType) { public Integer querySameTaskByType(String taskType) {
int num = 0; int num = 0;

View File

@@ -9,8 +9,8 @@ public enum InterfaceLogType {
DEFAULT("默认"), DEFAULT("默认"),
LMS_TO_ACS("LMS请求ACS"), LMS_TO_ACS("LMS请求ACS"),
ACS_TO_LMS("ACS请求LMS"), ACS_TO_LMS("ACS请求LMS"),
ACS_TO_LK("ACS请求LMS"), ACS_TO_LK("ACS请求立库"),
LK_TO_ACS("ACS请求LMS"); LK_TO_ACS("立库请求ACS");
private String desc; private String desc;

View File

@@ -18,19 +18,15 @@ package org.nl.modules.logging.aspect;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.nl.common.utils.IdUtil; import org.nl.common.utils.IdUtil;
import org.nl.modules.common.utils.RequestHolder; import org.nl.modules.common.utils.RequestHolder;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.common.utils.StringUtils; import org.nl.modules.common.utils.StringUtils;
import org.nl.modules.common.utils.ThrowableUtil; import org.nl.modules.common.utils.ThrowableUtil;
import org.nl.modules.logging.domain.Log; import org.nl.modules.logging.domain.Log;
@@ -56,8 +52,6 @@ public class LogAspect {
private final LogService logService; private final LogService logService;
ThreadLocal<Long> currentTime = new ThreadLocal<>();
public LogAspect(LogService logService) { public LogAspect(LogService logService) {
this.logService = logService; this.logService = logService;
} }
@@ -88,19 +82,18 @@ public class LogAspect {
//是否输出到日志文件 //是否输出到日志文件
if (logInfo.isPrintToLogFile()) { if (logInfo.isPrintToLogFile()) {
log.info("track_id:{},请求方法:{},请求方法参数:{}",trackId,methodName,params); log.info("track_id:{},请求方法:{},请求方法参数:{}", trackId, methodName, params);
} }
HttpServletRequest request = RequestHolder.getHttpServletRequest(); HttpServletRequest request = RequestHolder.getHttpServletRequest();
String requestIp = StringUtils.getIp(request); String requestIp = StringUtils.getIp(request);
Object result; Object result;
currentTime.set(System.currentTimeMillis()); long startTime = System.currentTimeMillis();
try { try {
result = joinPoint.proceed(); result = joinPoint.proceed();
//是否把日志存到日志表 //是否把日志存到日志表
if (logInfo.isAddLogTable()) { if (logInfo.isAddLogTable()) {
Log log = new Log("INFO", System.currentTimeMillis() - currentTime.get()); Log log = new Log("INFO", System.currentTimeMillis() - startTime);
currentTime.remove(); logService.save("", StringUtils.getBrowser(request), requestIp, joinPoint, log);
logService.save(getUsername(), StringUtils.getBrowser(request), requestIp, joinPoint, log);
} }
if (logInfo.isInterfaceLog()) { if (logInfo.isInterfaceLog()) {
try { try {
@@ -113,25 +106,24 @@ public class LogAspect {
json.put("method", methodName); json.put("method", methodName);
json.put("params", getParameter(method, joinPoint.getArgs())); json.put("params", getParameter(method, joinPoint.getArgs()));
json.put("request_ip", StringUtils.getIp(request)); json.put("request_ip", StringUtils.getIp(request));
// json.put("time", System.currentTimeMillis() - currentTime.get()); json.put("time", System.currentTimeMillis() - startTime);
json.put("username", getUsername()); json.put("username", "");
json.put("address", StringUtils.getCityInfo(requestIp)); json.put("address", StringUtils.getCityInfo(requestIp));
json.put("browser", StringUtils.getBrowser(request)); json.put("browser", StringUtils.getBrowser(request));
json.put("exception_detail", IdUtil.getStringId()); json.put("exception_detail", IdUtil.getStringId());
json.put("create_time", DateUtil.now()); json.put("create_time", DateUtil.now());
json.put("return_result", result.toString()); json.put("return_result", JSONObject.parse(result.toString()));
interfaceLog.insert(json); interfaceLog.insert(json);
} catch (Exception e) { } catch (Exception e) {
} }
} }
}catch (Exception ex){ } catch (Exception ex) {
log.error("track_id:{},error:{}",trackId,ex.getMessage()); log.error("track_id:{},error:{}", trackId, ex.getMessage());
Log log = new Log("ERROR", System.currentTimeMillis() - currentTime.get()); Log log = new Log("ERROR", System.currentTimeMillis() - startTime);
currentTime.remove();
log.setExceptionDetail(ThrowableUtil.getStackTrace(ex).getBytes()); log.setExceptionDetail(ThrowableUtil.getStackTrace(ex).getBytes());
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint) joinPoint, log); logService.save("", StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint) joinPoint, log);
throw ex; throw ex;
} }
return result; return result;
} }
@@ -166,26 +158,11 @@ public class LogAspect {
return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList); return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList);
} }
/** // public String getUsername() {
* 配置异常通知 // try {
* // return SecurityUtils.getCurrentUsername();
* @param joinPoint join point for advice // } catch (Exception e) {
* @param e exception // return "";
*/ // }
@AfterThrowing(pointcut = "logPointcut()", throwing = "e") // }
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
Log log = new Log("ERROR",System.currentTimeMillis() - currentTime.get());
currentTime.remove();
log.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes());
HttpServletRequest request = RequestHolder.getHttpServletRequest();
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint)joinPoint, log);
}
public String getUsername() {
try {
return SecurityUtils.getCurrentUsername();
}catch (Exception e){
return "";
}
}
} }

View File

@@ -1,18 +1,23 @@
server: server:
port: 8010 port: 8010
tomcat:
accept-count: 1000
max-connections: 10000
max-threads: 800
min-spare-threads: 100
#配置数据源 #配置数据源
spring: spring:
datasource: datasource:
druid: druid:
db-type: com.alibaba.druid.pool.DruidDataSource db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# url: jdbc:log4jdbc:mysql://${DB_HOST:10.1.3.91}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:10.1.3.91}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:lzhl_one_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:lzhl_one_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lzhl_one_wcs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lzhl_one_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root} username: ${DB_USER:root}
# password: ${DB_PWD:P@ssw0rd} # password: ${DB_PWD:P@ssw0rd}
# password: ${DB_PWD:Root.123456} # password: ${DB_PWD:Root.123456}
password: ${DB_PWD:password} password: ${DB_PWD:123456}
# 初始连接数 # 初始连接数
initial-size: 5 initial-size: 5

View File

@@ -1,5 +1,10 @@
server: server:
port: 8011 port: 8011
tomcat:
accept-count: 1000
max-connections: 10000
max-threads: 800
min-spare-threads: 100
#配置数据源 #配置数据源
spring: spring:
datasource: datasource:

View File

@@ -92,6 +92,26 @@ https://juejin.cn/post/6844903775631572999
</format> </format>
</appender> </appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>error</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/ERROR/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
<!--单个日志最大容量 至少10MB才能看得出来-->
<maxFileSize>200MB</maxFileSize>
<!--所有日志最多占多大容量-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!--开发环境:打印控制台--> <!--开发环境:打印控制台-->
<springProfile name="dev"> <springProfile name="dev">
@@ -150,7 +170,7 @@ https://juejin.cn/post/6844903775631572999
<!--生产环境:打印控制台和输出到文件--> <!--生产环境:打印控制台和输出到文件-->
<springProfile name="prod"> <springProfile name="prod">
<root level="info"> <root level="info">
<appender-ref ref="ERROR"/>
<appender-ref ref="asyncFileAppender"/> <appender-ref ref="asyncFileAppender"/>
</root> </root>
<!--logmanage --> <!--logmanage -->