Browse Source

日志配置文件

yuhongqi 3 weeks ago
parent
commit
c1392ab564

+ 7 - 8
fs-admin/src/main/resources/application.yml

@@ -15,6 +15,11 @@ fs:
   addressEnabled: false
   # 验证码类型 math 数组计算 char 字符验证
   captchaType: char
+  # 日志切割(Spring Boot 2.1 请用此项,logging.logback.rollingpolicy 需 2.4+)
+  log:
+    max-file-size: 300MB
+    max-history: 60
+    total-size-cap: 20GB
 
 
 # 开发环境配置
@@ -32,17 +37,11 @@ server:
     min-spare-threads: 30
 
 # 日志配置(文件与控制台均为 UTF-8)
+# 说明:项目 Spring Boot 2.1.x,logging.logback.rollingpolicy.* 需 2.4+ 才生效,切割参数请用 fs.log.*
 logging:
+  config: classpath:logback-spring.xml
   file:
     path: logs
-  logback:
-    rollingpolicy:
-      # 单文件大小上限(200MB~500MB,按需调整)
-      max-file-size: 300MB
-      # 归档保留天数
-      max-history: 60
-      # 所有归档日志总大小上限
-      total-size-cap: 20GB
   level:
     com.fs: warn
     org.springframework: warn

+ 22 - 16
fs-admin/src/main/resources/logback-spring.xml

@@ -1,20 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds">
 
-    <!-- 日志目录,可通过 logging.file.path 或环境变量 LOG_PATH 覆盖 -->
+    <!-- 日志目录:logging.file.path 或 fs.log.path -->
     <springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="logs"/>
-    <!-- 单文件大小上限,建议 200MB~500MB -->
-    <springProperty scope="context" name="MAX_FILE_SIZE" source="logging.logback.rollingpolicy.max-file-size" defaultValue="300MB"/>
-    <!-- 保留天数 -->
-    <springProperty scope="context" name="MAX_HISTORY" source="logging.logback.rollingpolicy.max-history" defaultValue="60"/>
-    <!-- 所有归档日志总大小上限 -->
-    <springProperty scope="context" name="TOTAL_SIZE_CAP" source="logging.logback.rollingpolicy.total-size-cap" defaultValue="20GB"/>
+    <!-- 单文件大小上限(Spring Boot 2.1 请用 fs.log.*,logging.logback.rollingpolicy 需 2.4+) -->
+    <springProperty scope="context" name="MAX_FILE_SIZE" source="fs.log.max-file-size" defaultValue="300MB"/>
+    <springProperty scope="context" name="MAX_HISTORY" source="fs.log.max-history" defaultValue="60"/>
+    <springProperty scope="context" name="TOTAL_SIZE_CAP" source="fs.log.total-size-cap" defaultValue="20GB"/>
 
     <property name="APP_NAME" value="fs-admin"/>
     <property name="LOG_CHARSET" value="UTF-8"/>
     <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
 
-    <!-- 控制台(UTF-8,配合 -Dfile.encoding=UTF-8 与 LANG=zh_CN.UTF-8) -->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <pattern>${LOG_PATTERN}</pattern>
@@ -24,29 +21,34 @@
     </appender>
 
     <!--
-        按「日期 + 大小」滚动,归档为 UTF-8 文本再 gzip:
-        - 每天凌晨跨日自动切割(fileNamePattern 含 yyyy-MM-dd)
-        - 单文件超过 MAX_FILE_SIZE 时在同一天内继续切割(.%i)
+        使用 TimeBasedRollingPolicy + SizeAndTimeBasedFNATP(Spring Boot 2.1 / logback 1.2 稳定组合)
+        - 每天跨日切割
+        - 单文件超过 maxFileSize 时同一天内按 %i 继续切割并 gzip 压缩
+        注意:fileNamePattern 必须同时包含 %d 与 %i
     -->
     <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${LOG_PATH}/${APP_NAME}.log</file>
+        <append>true</append>
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <pattern>${LOG_PATTERN}</pattern>
             <charset>${LOG_CHARSET}</charset>
             <immediateFlush>true</immediateFlush>
         </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_PATH}/archive/${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
-            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
             <maxHistory>${MAX_HISTORY}</maxHistory>
             <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
             <cleanHistoryOnStart>false</cleanHistoryOnStart>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
         </rollingPolicy>
     </appender>
 
-    <!-- ERROR 单独归档(UTF-8) -->
     <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${LOG_PATH}/${APP_NAME}-error.log</file>
+        <append>true</append>
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <pattern>${LOG_PATTERN}</pattern>
             <charset>${LOG_CHARSET}</charset>
@@ -57,11 +59,15 @@
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${LOG_PATH}/archive/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
-            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
             <maxHistory>${MAX_HISTORY}</maxHistory>
             <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
+            <cleanHistoryOnStart>false</cleanHistoryOnStart>
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
         </rollingPolicy>
     </appender>
 

+ 48 - 42
fs-user-app/src/main/java/com/fs/app/controller/LiveCouponController.java

@@ -24,7 +24,7 @@ import java.util.Map;
 @RequestMapping("/app/live/coupon")
 public class LiveCouponController extends AppBaseController {
 
-    private static final String DEFAULT_EXCEL_RELATIVE_PATH = "myfile/悦享生活-聚水潭发货,商城待发货.xlsx";
+    private static final String DEFAULT_EXCEL_RELATIVE_PATH = "myfile/悦选订单,未回传商城1.xlsx";
 
     @Autowired
     private ILiveCouponService liveCouponService;
@@ -65,47 +65,47 @@ public class LiveCouponController extends AppBaseController {
         return liveCouponService.curCoupon(coupon);
     }
 
-//    /**
-//     * 读取 Excel「平台订单号」,用指定聚水潭店铺查询并发货回传。
-//     * 商城走 StoreTask.deliveryOp 同款逻辑,直播走 LiveTask.deliveryOp 同款逻辑。
-//     *
-//     * 用法1(默认读项目 myfile 下 Excel):
-//     * GET /app/live/coupon/syncJstDeliveryFromExcel?shopCode=20486972
-//     *
-//     * 用法2(指定文件路径):
-//     * GET /app/live/coupon/syncJstDeliveryFromExcel?filePath=C:/mycode/ffhx-new/myfile/悦享生活-聚水潭发货,商城待发货.xlsx
-//     *
-//     * 用法3(上传 Excel):
-//     * POST /app/live/coupon/syncJstDeliveryFromExcel  form-data: file=xxx.xlsx, shopCode=20486972
-//     */
-//    @GetMapping("/syncJstDeliveryFromExcel")
-//    public R syncJstDeliveryFromExcel(
-//            @RequestParam(value = "filePath", required = false) String filePath,
-//            @RequestParam(value = "resultFilePath", required = false) String resultFilePath,
-//            @RequestParam(value = "shopCode", defaultValue = "20486972") String shopCode) throws Exception {
-//        String resolvedPath = resolveExcelPath(filePath);
-//        Map<String, Object> result = jstExcelDeliveryBatchService.syncFromExcelPath(resolvedPath, shopCode,
-//                resultFilePath);
-//        return R.ok(result);
-//    }
-//
-//    @PostMapping("/syncJstDeliveryFromExcel")
-//    public R syncJstDeliveryFromExcelUpload(
-//            @RequestParam(value = "file", required = false) MultipartFile file,
-//            @RequestParam(value = "filePath", required = false) String filePath,
-//            @RequestParam(value = "resultFilePath", required = false) String resultFilePath,
-//            @RequestParam(value = "shopCode", defaultValue = "20486972") String shopCode) throws Exception {
-//        Map<String, Object> result;
-//        if (file != null && !file.isEmpty()) {
-//            result = jstExcelDeliveryBatchService.syncFromExcel(file.getInputStream(), shopCode,
-//                    file.getOriginalFilename(), resultFilePath);
-//        } else {
-//            result = jstExcelDeliveryBatchService.syncFromExcelPath(resolveExcelPath(filePath), shopCode,
-//                    resultFilePath);
-//        }
-//        return R.ok(result);
-//    }
-//
+    /**
+     * 读取 Excel「平台订单号」,用指定聚水潭店铺查询并发货回传。
+     * 商城走 StoreTask.deliveryOp 同款逻辑,直播走 LiveTask.deliveryOp 同款逻辑。
+     *
+     * 用法1(默认读项目 myfile 下 Excel):
+     * GET /app/live/coupon/syncJstDeliveryFromExcel?shopCode=20486972
+     *
+     * 用法2(指定文件路径):
+     * GET /app/live/coupon/syncJstDeliveryFromExcel?filePath=C:/mycode/ffhx-new/myfile/悦享生活-聚水潭发货,商城待发货.xlsx
+     *
+     * 用法3(上传 Excel):
+     * POST /app/live/coupon/syncJstDeliveryFromExcel  form-data: file=xxx.xlsx, shopCode=20486972
+     */
+    @GetMapping("/syncJstDeliveryFromExcel")
+    public R syncJstDeliveryFromExcel(
+            @RequestParam(value = "filePath", required = false) String filePath,
+            @RequestParam(value = "resultFilePath", required = false) String resultFilePath,
+            @RequestParam(value = "shopCode", defaultValue = "20486972") String shopCode) throws Exception {
+        String resolvedPath = resolveExcelPath(filePath);
+        Map<String, Object> result = jstExcelDeliveryBatchService.syncFromExcelPath(resolvedPath, shopCode,
+                resultFilePath);
+        return R.ok(result);
+    }
+
+    @PostMapping("/syncJstDeliveryFromExcel")
+    public R syncJstDeliveryFromExcelUpload(
+            @RequestParam(value = "file", required = false) MultipartFile file,
+            @RequestParam(value = "filePath", required = false) String filePath,
+            @RequestParam(value = "resultFilePath", required = false) String resultFilePath,
+            @RequestParam(value = "shopCode", defaultValue = "20486972") String shopCode) throws Exception {
+        Map<String, Object> result;
+        if (file != null && !file.isEmpty()) {
+            result = jstExcelDeliveryBatchService.syncFromExcel(file.getInputStream(), shopCode,
+                    file.getOriginalFilename(), resultFilePath);
+        } else {
+            result = jstExcelDeliveryBatchService.syncFromExcelPath(resolveExcelPath(filePath), shopCode,
+                    resultFilePath);
+        }
+        return R.ok(result);
+    }
+
     /**
      * 诊断指定订单为何未聚水潭发货回传(默认只查原因不写库,逻辑对齐 StoreTask.deliveryOp / LiveTask.deliveryOp)。
      *
@@ -136,4 +136,10 @@ public class LiveCouponController extends AppBaseController {
 //        return workspacePath.toString();
 //    }
 
+    private String resolveExcelPath(String filePath) {
+        if (filePath != null && !filePath.trim().isEmpty()) {
+            return filePath.trim();
+        }
+        return DEFAULT_EXCEL_RELATIVE_PATH;
+    }
 }