From e48e8dca42935fe3f6294b3ab3691bc64e852dc7 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 2 Sep 2026 15:14:24 +0800 Subject: [PATCH] fix(deploy): eliminate duplicate container log writes --- README.md | 14 +++++ .../src/main/resources/application.yml | 11 ---- auth/src/main/resources/application.yml | 11 ---- config/nacos/cn/baiyue-common.yml | 3 -- config/nacos/local/baiyue-common.yml | 3 -- deploy/docker-compose.overseas.yml | 12 ++--- deploy/docker-compose.yml | 20 ++----- deploy/docker/Dockerfile | 2 +- file/src/main/resources/application.yml | 11 ---- finance/src/main/resources/application.yml | 4 -- firstleg/src/main/resources/application.yml | 11 ---- gateway/src/main/resources/application.yml | 11 ---- iam/src/main/resources/application.yml | 11 ---- .../src/main/resources/application.yml | 11 ---- order/src/main/resources/application.yml | 10 ---- print/src/main/resources/application.yml | 11 ---- scripts/README.md | 1 + scripts/container-logging-contract.test.mjs | 54 +++++++++++++++++++ warehouse/src/main/resources/application.yml | 11 ---- 19 files changed, 78 insertions(+), 144 deletions(-) create mode 100644 scripts/container-logging-contract.test.mjs diff --git a/README.md b/README.md index 0f2913388..de846c17a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,20 @@ GitLab 在独立 Node 镜像中自动执行拓扑合同,随后才允许服务 国内 Nacos 配置位于 `config/nacos/cn`。数据库、Redis、Nacos 和 RocketMQ 的生产密码必须通过环境变量或配置中心密文注入,禁止提交明文密码。 +## 容器日志 + +所有服务只向标准输出和标准错误写日志,不在容器内生成应用日志文件,也不把应用日志目录挂载到宿主机。国内、海外 Compose 统一使用 Docker `local` 日志驱动;仍可通过 `docker logs` 排查。文件服务的 `/data/files` 是业务文件目录,不属于日志目录,必须继续持久化。 + +单容器默认保留 `50m × 3`,可在各环境部署变量中覆盖: + +| 环境 | `DOCKER_LOG_MAX_SIZE` | `DOCKER_LOG_MAX_FILE` | 长期留存 | +|---|---:|---:|---| +| 开发 | `20m` | `2` | 不要求 | +| 测试 | `50m` | `3` | 不要求 | +| 生产 | `100m` | `5` | 必须由集中日志系统负责,Docker 本机日志只作短期缓冲 | + +调整日志策略后必须重新创建容器;只重启既有容器不会改变其日志驱动。历史 `/data/logs/baiyue-firstleg` 文件和旧容器日志不自动删除,确认无需保留后再单独清理。 + ## 网关跨域配置 本地默认允许商户端和后台端从 `localhost/127.0.0.1` 的 `5173/5174` 端口访问网关。部署到测试或生产环境时,必须通过 `CORS_ALLOWED_ORIGINS` 配置两个前端的明确地址,多个地址用英文逗号分隔,例如: diff --git a/audit-service/src/main/resources/application.yml b/audit-service/src/main/resources/application.yml index dfca83c9d..7246521f9 100644 --- a/audit-service/src/main/resources/application.yml +++ b/audit-service/src/main/resources/application.yml @@ -40,14 +40,3 @@ baiyue: rocketmq: name-server: ${ROCKETMQ_NAME_SERVER:127.0.0.1:9876} management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/auth/src/main/resources/application.yml b/auth/src/main/resources/application.yml index 33fe66410..fd346398e 100644 --- a/auth/src/main/resources/application.yml +++ b/auth/src/main/resources/application.yml @@ -52,14 +52,3 @@ baiyue.clients: url: ${IAM_SERVICE_URL:} management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/config/nacos/cn/baiyue-common.yml b/config/nacos/cn/baiyue-common.yml index 534b74de1..f7318ae43 100644 --- a/config/nacos/cn/baiyue-common.yml +++ b/config/nacos/cn/baiyue-common.yml @@ -50,9 +50,6 @@ spring: client.config.default: connect-timeout: 3000 read-timeout: 5000 -logging: - file: - path: ${LOG_PATH:/app/logs} server: shutdown: graceful max-http-request-header-size: ${SERVER_MAX_HTTP_REQUEST_HEADER_SIZE:32KB} diff --git a/config/nacos/local/baiyue-common.yml b/config/nacos/local/baiyue-common.yml index cf5ab9245..9af5a8d4a 100644 --- a/config/nacos/local/baiyue-common.yml +++ b/config/nacos/local/baiyue-common.yml @@ -47,9 +47,6 @@ spring: client.config.default: connect-timeout: 3000 read-timeout: 5000 -logging: - file: - path: ${LOG_PATH:./logs} server: shutdown: graceful max-http-request-header-size: ${SERVER_MAX_HTTP_REQUEST_HEADER_SIZE:32KB} diff --git a/deploy/docker-compose.overseas.yml b/deploy/docker-compose.overseas.yml index 24729ca6a..85d7534ba 100644 --- a/deploy/docker-compose.overseas.yml +++ b/deploy/docker-compose.overseas.yml @@ -24,13 +24,13 @@ x-overseas-common: &overseas-common DEPLOYMENT_CELL: ${OVERSEAS_DEPLOYMENT_CELL:-test-overseas} DATA_RESIDENCY: OVERSEAS SPRING_SQL_INIT_MODE: never - LOG_PATH: /app/logs TZ: Asia/Shanghai logging: - driver: json-file + # 应用只写 stdout/stderr;local 驱动负责单份本机日志与轮转。 + driver: local options: - max-size: 100m - max-file: "5" + max-size: ${DOCKER_LOG_MAX_SIZE:-50m} + max-file: "${DOCKER_LOG_MAX_FILE:-3}" services: gateway-overseas: @@ -38,7 +38,6 @@ services: image: ${IMAGE_REPOSITORY}/gateway-overseas:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-gateway-overseas ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${GATEWAY_OVERSEAS_PORT:-9300}:9300"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/gateway-overseas:/app/logs"] environment: <<: *overseas-environment SERVER_PORT: 9300 @@ -55,7 +54,6 @@ services: image: ${IMAGE_REPOSITORY}/lastleg-service:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-lastleg ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${LASTLEG_PORT:-9303}:9303"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/lastleg-service:/app/logs"] environment: <<: *overseas-environment SERVER_PORT: 9303 @@ -73,7 +71,6 @@ services: image: ${IMAGE_REPOSITORY}/warehouse-overseas-service:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-warehouse-overseas ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${WAREHOUSE_OVERSEAS_PORT:-9305}:9305"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/warehouse-overseas-service:/app/logs"] environment: <<: *overseas-environment SERVER_PORT: 9305 @@ -87,7 +84,6 @@ services: image: ${IMAGE_REPOSITORY}/event-bridge-service:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-event-bridge-overseas ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${EVENT_BRIDGE_OVERSEAS_PORT:-9313}:9312"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/event-bridge-service-overseas:/app/logs"] environment: <<: *overseas-environment SERVER_PORT: 9312 diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 8e61b9ec7..0caf03dec 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -26,13 +26,13 @@ x-common: &common REGION_CODE: ${REGION_CODE:-CN} DEPLOYMENT_CELL: ${DEPLOYMENT_CELL:-test-cn} DATA_RESIDENCY: ${DATA_RESIDENCY:-CN} - LOG_PATH: /app/logs TZ: Asia/Shanghai logging: - driver: json-file + # 应用只写 stdout/stderr;local 驱动负责单份本机日志与轮转。 + driver: local options: - max-size: 100m - max-file: "5" + max-size: ${DOCKER_LOG_MAX_SIZE:-50m} + max-file: "${DOCKER_LOG_MAX_FILE:-3}" services: gateway: @@ -40,7 +40,6 @@ services: image: ${IMAGE_REPOSITORY}/gateway:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-gateway ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${GATEWAY_PORT:-9000}:9000"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/gateway:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9000 @@ -53,7 +52,6 @@ services: image: ${IMAGE_REPOSITORY}/auth:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-auth ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${AUTH_PORT:-9100}:9100"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/auth:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9100 @@ -72,7 +70,6 @@ services: image: ${IMAGE_REPOSITORY}/iam:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-iam ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${IAM_PORT:-9201}:9201"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/iam:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9201 @@ -86,7 +83,6 @@ services: image: ${IMAGE_REPOSITORY}/firstleg:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-business ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${FIRSTLEG_PORT:-9202}:9202"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/firstleg:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9202 @@ -112,7 +108,6 @@ services: image: ${IMAGE_REPOSITORY}/finance:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-finance ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${FINANCE_PORT:-9203}:9203"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/finance:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9203 @@ -125,7 +120,6 @@ services: image: ${IMAGE_REPOSITORY}/order:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-order ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${ORDER_PORT:-9204}:9204"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/order:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9204 @@ -138,7 +132,6 @@ services: image: ${IMAGE_REPOSITORY}/warehouse:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-warehouse ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${WAREHOUSE_PORT:-9205}:9205"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/warehouse:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9205 @@ -153,7 +146,6 @@ services: ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${FILE_PORT:-9206}:9206"] volumes: - "${FILE_UPLOADS_HOST_DIR:-/data/firstleg/uploads}:/data/files" - - "${LOG_ROOT:-/data/logs/baiyue-firstleg}/file:/app/logs" environment: <<: *common-environment SERVER_PORT: 9206 @@ -175,7 +167,6 @@ services: image: ${IMAGE_REPOSITORY}/print:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-print ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${PRINT_PORT:-9207}:9207"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/print:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9207 @@ -186,7 +177,6 @@ services: image: ${IMAGE_REPOSITORY}/integration-service:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-integration ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${INTEGRATION_PORT:-9210}:9210"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/integration-service:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9210 @@ -236,7 +226,6 @@ services: image: ${IMAGE_REPOSITORY}/event-bridge-service:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-event-bridge ports: ["${PUBLISHED_BIND_ADDRESS:-0.0.0.0}:${EVENT_BRIDGE_PORT:-9312}:9312"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/event-bridge-service:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9312 @@ -256,7 +245,6 @@ services: image: ${IMAGE_REPOSITORY}/audit-service:${IMAGE_TAG} container_name: firstleg-${DEPLOY_ENV:-test}-audit expose: ["9700"] - volumes: ["${LOG_ROOT:-/data/logs/baiyue-firstleg}/audit-service:/app/logs"] environment: <<: *common-environment SERVER_PORT: 9700 diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile index 4e7c1d79a..ad239b1bf 100644 --- a/deploy/docker/Dockerfile +++ b/deploy/docker/Dockerfile @@ -15,7 +15,7 @@ RUN addgroup -S app \ WORKDIR /app # 预建镜像内运行时数据和日志目录并归属 app 用户;宿主机 bind mount 的属主需在部署前单独设置为 UID 10001。 -RUN mkdir -p /data/files /app/logs && chown -R app:app /data /app/logs +RUN mkdir -p /data/files && chown -R app:app /data # 依赖层稳定、业务代码层高频变化;Registry 只需传输实际变化的 Layer。 COPY --from=extractor --chown=app:app /workspace/dependencies/ ./ diff --git a/file/src/main/resources/application.yml b/file/src/main/resources/application.yml index d142be68e..2d9fa2132 100644 --- a/file/src/main/resources/application.yml +++ b/file/src/main/resources/application.yml @@ -201,14 +201,3 @@ baiyue: max-attempts: 3 batch-size: 500 management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/finance/src/main/resources/application.yml b/finance/src/main/resources/application.yml index 9ccb4b825..0614b2707 100644 --- a/finance/src/main/resources/application.yml +++ b/finance/src/main/resources/application.yml @@ -26,7 +26,3 @@ spring: namespace: ${NACOS_NAMESPACE:public} management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" diff --git a/firstleg/src/main/resources/application.yml b/firstleg/src/main/resources/application.yml index e31ea3e38..46cbdd8f3 100644 --- a/firstleg/src/main/resources/application.yml +++ b/firstleg/src/main/resources/application.yml @@ -61,14 +61,3 @@ firstleg: reservation-ttl: ${PALLET_RESERVATION_TTL:30m} warehouse-resource-tenant-id: ${WAREHOUSE_RESOURCE_TENANT_ID:0} management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index 15ba9c169..141cf31ef 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -230,14 +230,3 @@ springdoc: url: /event-bridge-service/v3/api-docs - name: finance url: /finance-service/v3/api-docs - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/iam/src/main/resources/application.yml b/iam/src/main/resources/application.yml index 5faf2522f..a23c9fe33 100644 --- a/iam/src/main/resources/application.yml +++ b/iam/src/main/resources/application.yml @@ -39,14 +39,3 @@ baiyue: jwt-secret: ${JWT_SECRET:change-me-to-at-least-32-bytes-long-before-start} internal-service-token: ${INTERNAL_SERVICE_TOKEN:change-me-to-an-internal-token-at-least-32-bytes-long} management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/integration-service/src/main/resources/application.yml b/integration-service/src/main/resources/application.yml index cca1f3168..f6d42fe07 100644 --- a/integration-service/src/main/resources/application.yml +++ b/integration-service/src/main/resources/application.yml @@ -104,14 +104,3 @@ management: health: probes: enabled: true - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/order/src/main/resources/application.yml b/order/src/main/resources/application.yml index 5674c27d8..a0883c3c1 100644 --- a/order/src/main/resources/application.yml +++ b/order/src/main/resources/application.yml @@ -37,13 +37,3 @@ baiyue: url: ${FILE_SERVICE_URL:} order: inbound-code-mode: ${ORDER_INBOUND_CODE_MODE:AUTO} -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/print/src/main/resources/application.yml b/print/src/main/resources/application.yml index 5761abcbf..e01f7b2b9 100644 --- a/print/src/main/resources/application.yml +++ b/print/src/main/resources/application.yml @@ -36,14 +36,3 @@ print: supported-height-mm: 100 font-resource: fonts/NotoSansSC-Bold.ttf management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}" diff --git a/scripts/README.md b/scripts/README.md index 2c5a2dd2f..407d39846 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -131,6 +131,7 @@ node scripts/create-pending-review-orders.mjs | Mapper 注册静态合同 | `node scripts/mapper-scan-contract.mjs`、`node --test scripts/mapper-scan-contract.test.mjs`;自动核对全部持久化模块的 `@Mapper`、服务根包注解过滤扫描和唯一扫描入口,不启动 Spring、不连接数据库;`backend-full-regression.ps1` 在 Maven 前强制执行 | | Java 质量聚合摘要 | `node --test scripts/java-quality-summary.test.mjs`、`node scripts/java-quality-summary.mjs --output target/java-quality-summary.json`;聚合 Maven/服务拓扑、OpenAPI 覆盖、JaCoCo 和 SpotBugs 报告,默认只报告存量缺口,CI 用显式 `--require-jacoco --require-spotbugs` 检查报告完整性且当前允许失败 | | 单服务部署失败回滚合同 | `scripts/deploy-built-service-rollback.test.mjs`;模拟成功、健康失败和启动失败,确认仅恢复同服务先前健康镜像且部署任务仍失败 | +| 容器日志单写合同 | `scripts/container-logging-contract.test.mjs`;离线确认应用只写标准输出、Compose 使用有界 `local` 驱动且不挂载应用日志目录 | Admin/Client HTTP 脚本的离线合同只验证脚本结构、参数和模块边界,不访问测试环境: diff --git a/scripts/container-logging-contract.test.mjs b/scripts/container-logging-contract.test.mjs new file mode 100644 index 000000000..440849fa7 --- /dev/null +++ b/scripts/container-logging-contract.test.mjs @@ -0,0 +1,54 @@ +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { test } from 'node:test'; + +const applicationConfigs = [ + 'auth/src/main/resources/application.yml', + 'audit-service/src/main/resources/application.yml', + 'event-bridge-service/src/main/resources/application.yml', + 'file/src/main/resources/application.yml', + 'finance/src/main/resources/application.yml', + 'firstleg/src/main/resources/application.yml', + 'gateway/src/main/resources/application.yml', + 'gateway-overseas/src/main/resources/application.yml', + 'iam/src/main/resources/application.yml', + 'integration-service/src/main/resources/application.yml', + 'lastleg-service/src/main/resources/application.yml', + 'order/src/main/resources/application.yml', + 'print/src/main/resources/application.yml', + 'warehouse/src/main/resources/application.yml', + 'warehouse-overseas-service/src/main/resources/application.yml', + 'config/nacos/cn/baiyue-common.yml', + 'config/nacos/local/baiyue-common.yml', + 'config/nacos/overseas/baiyue-common.yml', +]; + +const composeFiles = [ + 'deploy/docker-compose.yml', + 'deploy/docker-compose.overseas.yml', +]; + +test('deployable applications log only to stdout and stderr', () => { + for (const path of applicationConfigs) { + const source = readFileSync(path, 'utf8'); + assert.doesNotMatch(source, /LOG_PATH|LOGGING_FILE_NAME|LOGGING_ROLLING/, path); + } +}); + +test('Compose uses one bounded local log stream without application log mounts', () => { + for (const path of composeFiles) { + const source = readFileSync(path, 'utf8'); + assert.match(source, /driver:\s+local/, path); + assert.match(source, /DOCKER_LOG_MAX_SIZE/, path); + assert.match(source, /DOCKER_LOG_MAX_FILE/, path); + assert.doesNotMatch(source, /LOG_PATH|LOG_ROOT|\/app\/logs/, path); + } + + const domesticCompose = readFileSync(composeFiles[0], 'utf8'); + assert.match(domesticCompose, /FILE_UPLOADS_HOST_DIR[^\n]+:\/data\/files/); +}); + +test('runtime image does not prepare an application log directory', () => { + const dockerfile = readFileSync('deploy/docker/Dockerfile', 'utf8'); + assert.doesNotMatch(dockerfile, /\/app\/logs/); +}); diff --git a/warehouse/src/main/resources/application.yml b/warehouse/src/main/resources/application.yml index 0d0085386..55de853bf 100644 --- a/warehouse/src/main/resources/application.yml +++ b/warehouse/src/main/resources/application.yml @@ -27,14 +27,3 @@ baiyue: jwt-secret: ${JWT_SECRET:change-me-to-at-least-32-bytes-long-before-start} internal-service-token: ${INTERNAL_SERVICE_TOKEN:change-me-to-an-internal-token-at-least-32-bytes-long} management.endpoints.web.exposure.include: health,info,prometheus - -logging: - file: - name: "${LOGGING_FILE_NAME:${LOG_PATH:./logs}/${spring.application.name}.log}" - logback: - rollingpolicy: - file-name-pattern: "${LOGGING_ROLLING_FILE_NAME_PATTERN:${LOG_PATH:./logs}/${spring.application.name}.%d{yyyy-MM-dd}.%i.log.gz}" - max-file-size: "${LOGGING_ROLLING_MAX_FILE_SIZE:100MB}" - max-history: "${LOGGING_ROLLING_MAX_HISTORY:7}" - total-size-cap: "${LOGGING_ROLLING_TOTAL_SIZE_CAP:5GB}" - clean-history-on-start: "${LOGGING_ROLLING_CLEAN_HISTORY_ON_START:false}"