opt:日志优化、打包优化

This commit is contained in:
2025-10-10 17:27:56 +08:00
parent 1c4a248780
commit 33b020f1a6
17 changed files with 132 additions and 70 deletions

View File

@@ -0,0 +1 @@
mvn install:install-file -Dfile=./nlsso-server/libs/language-all.jar -DgroupId=nl.sdkall -DartifactId=language-all -Dversion=0.0.1 -Dpackaging=jar

View File

@@ -284,8 +284,7 @@
<groupId>nl.sdkall</groupId>
<artifactId>language-all</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/language-all.jar</systemPath>
<!-- 移除 system 范围,使用默认的 compile 范围 -->
</dependency>
<!-- quartz -->
<dependency>

View File

@@ -15,17 +15,23 @@ import java.util.Map;
public class AsyncLuceneAppender extends AspectLogbackAsyncAppender {
@Override
protected void append(ILoggingEvent event) {
// 设置traceId
String traceId = LuceneAppender.traceIdTL.get();
if (StringUtils.isNotEmpty(traceId)){
MDC.put("traceId",traceId);
MDC.put("traceId", traceId);
Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
if (mdcPropertyMap.getClass().getName().contains("SynchronizedMap")){
mdcPropertyMap.put("traceId",traceId);
mdcPropertyMap.put("traceId", traceId);
}
}
// 必须调用父类的append方法否则日志不会被实际写入
super.append(event);
// 清理MDC
if (StringUtils.isNotEmpty(traceId)) {
MDC.clear();
}
}

View File

@@ -39,18 +39,41 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
public void start() {
super.start();
try {
// 读取配置文件
Properties properties = YmlConfigFileUtil.readConfig("config/application.yml");
// 读取配置文件 - 尝试多种可能的路径
Properties properties = null;
try {
// 首先尝试读取config目录下的配置
properties = YmlConfigFileUtil.readConfig("config/application.yml");
} catch (Exception e) {
// 如果失败尝试读取classpath根目录下的配置
System.out.println("尝试读取config/application.yml失败尝试读取application.yml");
properties = YmlConfigFileUtil.readConfig("application.yml");
}
// 获取配置值
String luceneDir = properties.getProperty("lucene.index.path");
System.out.println("---index地址----"+luceneDir);
index = FSDirectory.open(Paths.get(luceneDir));
System.out.println("---index地址----" + luceneDir);
// 验证路径是否存在,如果不存在则创建
if (StringUtils.isEmpty(luceneDir)) {
luceneDir = "D:/lms/lucene/index";
System.out.println("Lucene索引路径配置为空使用默认路径: " + luceneDir);
}
java.nio.file.Path path = Paths.get(luceneDir);
if (!java.nio.file.Files.exists(path)) {
java.nio.file.Files.createDirectories(path);
System.out.println("Lucene索引路径不存在已创建: " + luceneDir);
}
index = FSDirectory.open(path);
// 初始化 Lucene 索引
Analyzer analyzer = new IKAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
indexWriter = new IndexWriter(index, config);
} catch (Exception e) {
System.err.println("初始化Lucene日志失败: " + e.getMessage());
e.printStackTrace();
}
}
@@ -58,27 +81,49 @@ public class LuceneAppender extends AppenderBase<ILoggingEvent> {
@Override
protected void append(ILoggingEvent event) {
// 检查indexWriter是否初始化成功
if (indexWriter == null) {
System.err.println("Lucene索引写入器未初始化无法写入日志");
return;
}
Document doc = new Document();
for (Property property : this.properties.getProperties()) {
LucenePropertyAndEncoder encoder = new LucenePropertyAndEncoder(property, this.context);
String encode = encoder.encode(event);
doc.add(new StringField(property.getName(), encode, Field.Store.YES));
}
Map<String, String> map = event.getMDCPropertyMap();
if (!map.isEmpty() && StringUtils.isNotEmpty(map.get("traceId"))){
doc.add(new StringField("traceId",map.get("traceId"), Field.Store.YES));
}else {
doc.add(new StringField("traceId"," ", Field.Store.YES));
}
doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, event.getFormattedMessage(), Field.Store.YES));
doc.add(new StringField(LogMessageConstant.FIELD_TIMESTAMP, String.valueOf(event.getTimeStamp()),Field.Store.YES));
doc.add(new NumericDocValuesField(LogMessageConstant.SORT_NAME, event.getTimeStamp()));
try {
if (this.properties != null && this.properties.getProperties() != null) {
for (Property property : this.properties.getProperties()) {
LucenePropertyAndEncoder encoder = new LucenePropertyAndEncoder(property, this.context);
String encode = encoder.encode(event);
doc.add(new StringField(property.getName(), encode, Field.Store.YES));
}
}
Map<String, String> map = event.getMDCPropertyMap();
if (map != null && !map.isEmpty() && StringUtils.isNotEmpty(map.get("traceId"))){
doc.add(new StringField("traceId", map.get("traceId"), Field.Store.YES));
} else {
doc.add(new StringField("traceId", " ", Field.Store.YES));
}
// 添加日志消息和时间戳
doc.add(new TextField(LogMessageConstant.FIELD_MESSAGE, event.getFormattedMessage(), Field.Store.YES));
doc.add(new StringField(LogMessageConstant.FIELD_TIMESTAMP, String.valueOf(event.getTimeStamp()), Field.Store.YES));
doc.add(new NumericDocValuesField(LogMessageConstant.SORT_NAME, event.getTimeStamp()));
// 写入并提交文档
indexWriter.addDocument(doc);
indexWriter.commit();
} catch (Exception e) {
System.err.println("写入Lucene日志失败: " + e.getMessage());
e.printStackTrace();
// 尝试回滚事务
try {
if (indexWriter != null) {
indexWriter.rollback();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

View File

@@ -20,7 +20,7 @@ import java.util.Map;
public enum BaseDataEnum {
// 是否
IS_YES_NOT(MapOf.of(LangBehavior.language("common.yes"), "1", LangBehavior.language("common.no"), "0")),
IS_YES_NOT(MapOf.of("", "1", "", "0")),
;
private Map<String, String> code;

View File

@@ -2,6 +2,7 @@ package org.nl.wms.ext_manage.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -46,7 +47,7 @@ public class ErpToWmsController {
@PostMapping("/usematerinfo")
@Log("下发用料信息")
@SaIgnore
public ResponseEntity<Object> usematerinfo(@RequestBody JSONObject whereJson) {
public ResponseEntity<Object> usematerinfo(@RequestBody JSONArray whereJson) {
return new ResponseEntity<>(erpToWmsService.usematerinfo(whereJson),HttpStatus.OK);
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.ext_manage.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.ext_manage.dto.ErpGroupplateDto;
import org.nl.wms.ext_manage.dto.ErpMaterInfoDto;
@@ -56,7 +57,7 @@ public interface ErpToWmsService {
* }
* @return ErpResponse
*/
ErpResponse usematerinfo(JSONObject whereJson);
ErpResponse usematerinfo(JSONArray whereJson);
/**
* 获取物料信息

View File

@@ -2,6 +2,7 @@ package org.nl.wms.ext_manage.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
@@ -260,7 +261,7 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
}
@Override
public ErpResponse usematerinfo(JSONObject whereJson) {
public ErpResponse usematerinfo(JSONArray whereJson) {
/**
* data : [
* {
@@ -282,7 +283,7 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
throw new BadRequestException("仓库不存在");
}
// 组织明细
List<JSONObject> dataList = whereJson.getJSONArray("data").toJavaList(JSONObject.class);
List<JSONObject> dataList = whereJson.toJavaList(JSONObject.class);
// 查询所有物料
List<MdMeMaterialbase> materDaoList = iMdMeMaterialbaseService.list(
new QueryWrapper<MdMeMaterialbase>().lambda()
@@ -294,7 +295,7 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
// 查询所有计量单位
List<MdPbMeasureunit> unitDaoList = iMdPbMeasureunitService.list(
new QueryWrapper<MdPbMeasureunit>().lambda()
.in(MdPbMeasureunit::getUnit_code, dataList.stream()
.in(MdPbMeasureunit::getUnit_name, dataList.stream()
.map(row -> row.getString("unit_code"))
.collect(Collectors.toList()))
);
@@ -305,6 +306,9 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
MdMeMaterialbase materDao = materDaoList.stream()
.filter(row -> row.getMaterial_code().equals(json.getString("mater_code")))
.findFirst().orElse(null);
if(null == materDao){
throw new BadRequestException("物料编码不存在");
}
jsonDtl.setId(IdUtil.getStringId());
jsonDtl.setCode(json.getString("order_code"));
jsonDtl.setStatus(IOSEnum.BILL_STATUS.code("生成"));
@@ -317,7 +321,7 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
jsonDtl.setQty(BigDecimal.valueOf(json.getDoubleValue("qty")));
jsonDtl.setPlan_qty(BigDecimal.valueOf(json.getDoubleValue("qty")));
MdPbMeasureunit unitDao = unitDaoList.stream()
.filter(row -> row.getUnit_code().equals(json.getString("unit_code")))
.filter(row -> row.getUnit_name().equals(json.getString("unit_code")))
.findFirst().orElse(null);
jsonDtl.setUnit_id(unitDao.getMeasure_unit_id());
jsonDtl.setUnit_name(unitDao.getUnit_name());

View File

@@ -18,40 +18,40 @@ public enum StatusEnum {
/**
* 流程相关
*/
MODEL_STATUS(ForkMap.of(LangBehavior.language("status.published"), "10", null, LangBehavior.language("status.unpublished"), "30", null)),
FLOW_STATUS(ForkMap.of(LangBehavior.language("status.start"), "10", null, LangBehavior.language("status.node_completed"), "20", null, LangBehavior.language("status.pause"), "30", null, LangBehavior.language("status.completed"), "80", null, LangBehavior.language("status.abnormal_completed"), "82", null)),
MODEL_STATUS(ForkMap.of("发布", "10", null, "未发布", "30", null)),
FLOW_STATUS(ForkMap.of("启动", "10", null, "节点完成", "20", null, "暂停", "30", null, "完成", "80", null, "异常完成", "82", null)),
/**
* 单据状态
*/
FORM_STATUS(ForkMap.of(LangBehavior.language("status.generated"), "10", null, LangBehavior.language("status.allocated"), "13", null, LangBehavior.language("status.issued"), "15", null, LangBehavior.language("status.executing"), "20", null, LangBehavior.language("status.pause"), "30", null, LangBehavior.language("status.completed"), "80", null, LangBehavior.language("status.force_completed"), "82", null, LangBehavior.language("status.cancelled"), "90", null)),
FORM_STATUS(ForkMap.of("生成", "10", null, "已分配", "13", null, "下发", "15", null, "执行中", "20", null, "暂停", "30", null, "完成", "80", null, "强制完成", "82", null, "取消", "90", null)),
/**
* 出入库单据类型退货出库
*/
IOBILL_TYPE_IN(ForkMap.of(LangBehavior.language("status.production_in"), "0001", "StInTask", LangBehavior.language("status.manual_in"), "0009", "StInTask")),
IOBILL_TYPE_IN(ForkMap.of("生产入库", "0001", "StInTask", "手工入库", "0009", "StInTask")),
IOBILL_TYPE_OUT(ForkMap.of(LangBehavior.language("status.material_out"), "1001", "StOutTask", LangBehavior.language("status.manual_out"), "1009", "StOutTask")),
IOBILL_TYPE_OUT(ForkMap.of("用料出库", "1001", "StOutTask", "手工出库", "1009", "StOutTask")),
IOBILL_TYPE_MOVE(ForkMap.of(LangBehavior.language("status.move_storage"), "50", "moveStorageTask", LangBehavior.language("status.abnormal_move"), "51", "moveStorageTask")),
EXT_TASK_TYPE(ForkMap.of(LangBehavior.language("status.inventory"), "60", "moveStorageTask")),
OTHER_TASK_TYPE(ForkMap.of(LangBehavior.language("status.transfer"), "70", "tranforTask")),
profit_loss(ForkMap.of(LangBehavior.language("status.inventory_loss"), "0", null, LangBehavior.language("status.inventory_profit"), "1", null, LangBehavior.language("status.physical_inventory"), "2", null)),
IOBILL_TYPE_MOVE(ForkMap.of("移库", "50", "moveStorageTask", "异常位移库", "51", "moveStorageTask")),
EXT_TASK_TYPE(ForkMap.of("盘点", "60", "moveStorageTask")),
OTHER_TASK_TYPE(ForkMap.of("转运", "70", "tranforTask")),
profit_loss(ForkMap.of("盘亏", "0", null, "盘盈", "1", null, "实盘", "2", null)),
/**
* ERP回传单据类型
*/
ERP_TYPE(ForkMap.of("PRD_MO", "10", LangBehavior.language("status.production_order"), "PUR_ReceiveBill", "11", LangBehavior.language("status.receipt_notice"),
"SAL_SaleOrder", "12", LangBehavior.language("status.sales_order"), "PRD_INSTOCK", "13", LangBehavior.language("status.production_inbound"), "STK_InStock", "14", LangBehavior.language("status.purchase_inbound"),
"SAL_RETURNSTOCK", "15", LangBehavior.language("status.sales_return_inbound"), "PUR_MRB", "18", LangBehavior.language("status.purchase_return_outbound"),
"SUB_PickMtrl", "19", LangBehavior.language("status.subcontract_material_list"), "PRD_PPBOM", "20", LangBehavior.language("status.production_material_list"), "PRD_PickMtrl", "21", LangBehavior.language("status.production_picking"),
"SP_PickMtrl", "22", LangBehavior.language("status.simple_production_picking"), "STK_TransferDirect", "23", LangBehavior.language("status.transfer_outbound"), "STK_MisDelivery", "26", LangBehavior.language("status.other_outbound"), "PRD_ReturnMtrl", "27", LangBehavior.language("status.production_return"), "PRD_FeedMtrl", "28", LangBehavior.language("status.production_supplement"), "SUB_RETURNMTRL", "29", LangBehavior.language("status.subcontract_return"))),
ERP_TYPE(ForkMap.of("PRD_MO", "10", "生产订单", "PUR_ReceiveBill", "11", "收料通知单",
"SAL_SaleOrder", "12", "销售订单", "PRD_INSTOCK", "13", "生产入库单", "STK_InStock", "14", "采购入库单",
"SAL_RETURNSTOCK", "15", "销售退货入库单", "PUR_MRB", "18", "采购退料出库单",
"SUB_PickMtrl", "19", "委外用料清单", "PRD_PPBOM", "20", "生产用料清单", "PRD_PickMtrl", "21", "生产领料单",
"SP_PickMtrl", "22", "简单生产领料单", "STK_TransferDirect", "23", "调拨出库单", "STK_MisDelivery", "26", "其他出库单", "PRD_ReturnMtrl", "27", "生产退料单", "PRD_FeedMtrl", "28", "生产补料单", "SUB_RETURNMTRL", "29", "委外退料单")),
/**
* 任务优先级
*/
PRIORITY_TYPE(ForkMap.of(
LangBehavior.language("status.lowest"), "1", null, LangBehavior.language("status.normal"), "5", null, LangBehavior.language("status.higher"), "6", null, LangBehavior.language("status.urgent"), "7", null, LangBehavior.language("status.move_storage"), "8", null
"最低", "1", null, "普通", "5", null, "较高", "6", null, "加急", "7", null, "移库", "8", null
)),
/**
@@ -60,42 +60,42 @@ public enum StatusEnum {
TASK_TYPE(ForkMap.pushAll(IOBILL_TYPE_IN.code, IOBILL_TYPE_OUT.code, IOBILL_TYPE_MOVE.code, EXT_TASK_TYPE.code, OTHER_TASK_TYPE.code)),
ACS_TYPE(ForkMap.of(
LangBehavior.language("status.warehouse"), "1", null, LangBehavior.language("status.agv_task"), "2", null, LangBehavior.language("status.ctu_task"), "3", null, LangBehavior.language("status.third_floor_ctu"), "4", null
"立库", "1", null, "AGV任务", "2", null, "CTU任务", "3", null,"三楼CTU", "4", null
)),
ACS_SYSTEM_TYPE(ForkMap.of(
"NDC", "1", null, LangBehavior.language("status.xian_gong"), "2", null, LangBehavior.language("status.hairou_ctu"), "5", null, LangBehavior.language("status.hikvision_ctu"), "6", null
"NDC", "1", null, "仙工", "2", null,"海柔CTU", "5", null, "海康CTU", "6", null
)),
/**
* 点位锁类型
*/
//LOCK(ForkMap.of(LangBehavior.language("status.no_lock"), "00", null, LangBehavior.language("status.inbound_lock"), "10", null, LangBehavior.language("status.inbound_inventory_lock"), "16", null, LangBehavior.language("status.outbound_lock"), "20", null, LangBehavior.language("status.inventory_outbound_lock"), "26", null, LangBehavior.language("status.move_storage_lock"), "50", null, LangBehavior.language("status.abnormal_lock"), "60", null, LangBehavior.language("status.empty_out_lock"), "70", null)),
//LOCK(ForkMap.of("无锁", "00", null, "入库锁", "10", null, "入库盘点锁", "16", null, "出库锁", "20", null, "盘点出库锁", "26", null, "移库锁", "50", null, "异常锁定", "60", null, "空出锁", "70", null)),
STRATEGY_TYPE(ForkMap.of(LangBehavior.language("status.inbound"), "1", null, LangBehavior.language("status.outbound"), "2", null, LangBehavior.language("status.in_out_bound"), "3", null)),
STRATEGY_TYPE(ForkMap.of("入库", "1", null, "出库", "2", null, "出入库", "3", null)),
PRODUCT_AREA(ForkMap.of(LangBehavior.language("status.first_floor_workshop"), "A1", null, LangBehavior.language("status.second_floor_workshop"), "A2", null, LangBehavior.language("status.third_floor_workshop"), "A3", null)),
PRODUCT_AREA(ForkMap.of("一层车间", "A1", null, "二层车间", "A2", null, "三层车间", "A3", null)),
REGION_INFO(ForkMap.of(LangBehavior.language("status.main_storage_picking_platform"), "PICK01", null, LangBehavior.language("status.first_floor_io_conveyor"), "IOConveyor", null, LangBehavior.language("status.second_floor_io_conveyor"), "IOConveyor2", null, LangBehavior.language("status.picking_scale_area"), "WEIGH01", null,
LangBehavior.language("status.second_floor_ctu_shelf_docking"), "CTU_POSITION", null, LangBehavior.language("status.second_floor_agv_production_line_docking"), "AGV_POSITION", null, LangBehavior.language("status.second_floor_empty_shelf_buffer"), "SHELF_POSITION", null)),
REGION_INFO(ForkMap.of("主存区拣选平台", "PICK01", null, "一楼出入库输送线", "IOConveyor", null, "二楼出入库输送线", "IOConveyor2", null, "拣选台秤重区", "WEIGH01", null,
"二楼CTU货架对接位", "CTU_POSITION", null, "二楼AGV产线对接位", "AGV_POSITION", null,"二楼空货架缓存区", "SHELF_POSITION", null)),
STOCK_INFO(ForkMap.of(LangBehavior.language("status.pallet_warehouse"), "FStockPallet", null, LangBehavior.language("status.container_warehouse"), "FStockId", null, LangBehavior.language("status.virtual_warehouse"), "FicStockId", null, LangBehavior.language("status.second_floor_ctu_buffer"), "CStockId", null,
LangBehavior.language("status.second_floor_shelf_buffer"), "HStockId", null)),
STOCK_INFO(ForkMap.of("托盘库", "FStockPallet", null, "料箱库", "FStockId", null, "虚拟库", "FicStockId", null, "二楼ctu缓存库", "CStockId", null,
"二楼货架缓存库", "HStockId", null)),
SORT_TYPE(ForkMap.of(
LangBehavior.language("status.ascending"), "1", null, LangBehavior.language("status.descending"), "2", null
"升序", "1", null, "降序", "2", null
)),
POINT_TYPE(ForkMap.of(
"空货架", "0", null, "满货架", "1", null
)),
BIND_TYPE(ForkMap.of(
LangBehavior.language("status.unbind"), "0", null, LangBehavior.language("status.bind"), "1", null, LangBehavior.language("status.no_operation"), "3", null
"解绑", "0", null, "绑定", "1", null, "不操作", "3", null
)),
VEHICLE_TYPE(ForkMap.of(
LangBehavior.language("status.empty_tray"), "KT001", null, LangBehavior.language("status.empty_container"), "KL001", null
"空托盘", "KT001", null, "空料箱", "KL001", null
));
/**

View File

@@ -5,40 +5,39 @@ package org.nl.wms.sch_manage.enums;
* @Description: 任务枚举
* @Date: 2025/05/19
*/
import org.nl.language.LangBehavior;
public enum TaskStatus {
/**
* 申请
*/
CREATE("0", LangBehavior.language("task.created"), LangBehavior.language("task.created").concat("_desc")),
CREATE("0", "生成", "生成"),
/**
* 申请
*/
APPLY("1", LangBehavior.language("task.applied"), LangBehavior.language("task.applied").concat("_desc")),
APPLY("1", "申请", "申请"),
/**
* 创建完成
*/
CREATED("2", LangBehavior.language("task.create_completed"), LangBehavior.language("task.create_completed").concat("_desc")),
CREATED("2", "创建完成", "创建完成"),
/**
* 下发
*/
ISSUED("3", LangBehavior.language("task.issued"), LangBehavior.language("task.issued").concat("_desc")),
ISSUED("3", "下发", "下发"),
/**
* 执行中
*/
EXECUTING("4", LangBehavior.language("task.executing"), LangBehavior.language("task.executing").concat("_desc")),
EXECUTING("4", "执行中", "执行中"),
/**
* 完成
*/
FINISHED("5", LangBehavior.language("task.completed"), LangBehavior.language("task.completed").concat("_desc")),
FINISHED("5", "完成", "完成"),
/**
* 已取消
*/
CANCELED("6", LangBehavior.language("task.cancelled"), LangBehavior.language("task.cancelled").concat("_desc")),
CANCELED("6", "已取消", "已取消"),
/**
* 未完成
*/
UNFINISHED("7", LangBehavior.language("task.unfinished"), LangBehavior.language("task.unfinished").concat("_desc"));
UNFINISHED("7", "未完成", "未完成");
TaskStatus(String code, String name, String desc) {

View File

@@ -70,7 +70,7 @@ file:
avatarMaxSize: 5
logging:
file:
path: D:\log\beian\lms
path: D:\log\yuenanfujia\lms
config: classpath:logback-spring.xml
# sa-token白名单配置
security:
@@ -125,4 +125,5 @@ i18n:
supported-languages:
- zh
- en
- vi
fallback-to-classpath: true

View File

@@ -5,7 +5,10 @@
<property name="log.charset" value="utf-8"/>
<property name="log.pattern"
value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
<property name="LOG_HOME" value="${logPath}"/>
<!-- 使用Spring Boot标准的日志路径变量 -->
<property name="LOG_HOME" value="${logging.file.path}"/>
<!-- 为确保路径存在,提供默认路径作为备选 -->
<property name="LOG_HOME" value="${LOG_HOME:-D:/log/nladmin}"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
@@ -105,9 +108,11 @@
</root>
</springProfile>s
<springProfile name="prod">
<!-- 根日志配置所有级别的日志都会输出到控制台、Lucene和文件 -->
<root level="info">
<appender-ref ref="asyncLuceneAppender"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="asyncFileAppender"/>
</root>
<logger name="jdbc" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>