fix(F): 日志轮转治理 - 统一 logback 配置 + journald 限额
问题根因: - iot-device.out 涨到 613MB:systemd StandardOutput=append: 无任何轮转 - DEBUG 刷屏(单日 11521 条):logging.level.com.iot=DEBUG 使 MyBatis 每条 SQL 打印两遍 - 涂鸦 open-mq-sdk jar 自带 logback.xml 抢占日志配置(iot-data/rule/alarm 未声明 logging.config), 把日志写到 ./logs 相对目录且无总量上限 改动: - 新增 backend/iot-common/src/main/resources/logback-spring.xml(4 服务共用唯一真相源): RollingFileAppender 按日 + 50MB 双触发切分,保留 7 天,主日志总量上限 2GB, 错误日志单独一份(保留 30 天 / 512MB),并对涂鸦/MQTT/AMQP 等第三方 SDK 降噪 - 父 pom 增加 maven-resources-plugin,把该配置复制进各服务 BOOT-INF/classes - 4 个服务 application.yml 统一声明 logging.config,并把 com.iot 级别收敛为 INFO - 新增 backend/deploy/systemd/:4 个 unit 改为 StandardOutput=journal + 注入 LOG_DIR, 附 journald 限额(SystemMaxUse=1G / SystemMaxFileSize=50M / MaxRetentionSec=7day) - deploy-all.bat 增加日志治理步骤(同步 unit + journald + 清理历史 .out) 生产验证:日志落到 /opt/iotsaas/logs/app/*.log,DEBUG 计数 0,历史 .out 已清理, journal 776M 降到 552M,4 服务 active,9081/9083 文档返回 200
This commit is contained in:
parent
6e3f3ea661
commit
b2d758be33
21
backend/deploy/systemd/iot-alarm.service
Normal file
21
backend/deploy/systemd/iot-alarm.service
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=IoT Alarm Service (9084)
|
||||||
|
After=docker.service network.target
|
||||||
|
Requires=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=tonzou
|
||||||
|
WorkingDirectory=/opt/iotsaas/backend/jars
|
||||||
|
# 日志根目录:logback-spring.xml 中 ${LOG_DIR:-logs/app} 读取该环境变量
|
||||||
|
Environment="LOG_DIR=/opt/iotsaas/logs/app"
|
||||||
|
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/iotsaas/backend/jars/iot-alarm-1.0.0.jar
|
||||||
|
SuccessExitStatus=143
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
# 控制台输出交由 systemd journal(自带轮转与体积上限),不再写无轮转的 *.out
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
21
backend/deploy/systemd/iot-data.service
Normal file
21
backend/deploy/systemd/iot-data.service
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=IoT Data Collection Service (9082)
|
||||||
|
After=docker.service network.target
|
||||||
|
Requires=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=tonzou
|
||||||
|
WorkingDirectory=/opt/iotsaas/backend/jars
|
||||||
|
# 日志根目录:logback-spring.xml 中 ${LOG_DIR:-logs/app} 读取该环境变量
|
||||||
|
Environment="LOG_DIR=/opt/iotsaas/logs/app"
|
||||||
|
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/iotsaas/backend/jars/iot-data-1.0.0.jar
|
||||||
|
SuccessExitStatus=143
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
# 控制台输出交由 systemd journal(自带轮转与体积上限),不再写无轮转的 *.out
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
23
backend/deploy/systemd/iot-device.service
Normal file
23
backend/deploy/systemd/iot-device.service
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=IoT Device Service (9081)
|
||||||
|
After=docker.service network.target
|
||||||
|
Requires=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=tonzou
|
||||||
|
WorkingDirectory=/opt/iotsaas/backend/jars
|
||||||
|
# 日志根目录:logback-spring.xml 中 ${LOG_DIR:-logs/app} 读取该环境变量,
|
||||||
|
# 滚动日志落到 /opt/iotsaas/logs/app/iot-device.log(按日+50MB 切分,保留 7 天)
|
||||||
|
Environment="LOG_DIR=/opt/iotsaas/logs/app"
|
||||||
|
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/iotsaas/backend/jars/iot-device-1.0.0-exec.jar
|
||||||
|
SuccessExitStatus=143
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
# 控制台输出交由 systemd journal(自带轮转与体积上限),
|
||||||
|
# 不再写 append:*.out 这类无轮转文件(曾膨胀到 613MB)
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
21
backend/deploy/systemd/iot-rule.service
Normal file
21
backend/deploy/systemd/iot-rule.service
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=IoT Rule Engine Service (9083)
|
||||||
|
After=docker.service network.target
|
||||||
|
Requires=docker.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=tonzou
|
||||||
|
WorkingDirectory=/opt/iotsaas/backend/jars
|
||||||
|
# 日志根目录:logback-spring.xml 中 ${LOG_DIR:-logs/app} 读取该环境变量
|
||||||
|
Environment="LOG_DIR=/opt/iotsaas/logs/app"
|
||||||
|
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/iotsaas/backend/jars/iot-rule-1.0.0.jar
|
||||||
|
SuccessExitStatus=143
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
# 控制台输出交由 systemd journal(自带轮转与体积上限),不再写无轮转的 *.out
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
8
backend/deploy/systemd/journald-iotsaas.conf
Normal file
8
backend/deploy/systemd/journald-iotsaas.conf
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[Journal]
|
||||||
|
# iotsaas 日志治理:限制 journal 体积,避免 /var/log/journal 无限增长
|
||||||
|
# (Ubuntu 默认 SystemMaxUse = 磁盘的 10%,本机 1.8T 盘即 180G,过大)
|
||||||
|
Storage=persistent
|
||||||
|
SystemMaxUse=1G
|
||||||
|
SystemMaxFileSize=50M
|
||||||
|
SystemMaxFileSec=1day
|
||||||
|
MaxRetentionSec=7day
|
||||||
@ -95,7 +95,10 @@ mybatis-plus:
|
|||||||
|
|
||||||
# 日志配置
|
# 日志配置
|
||||||
logging:
|
logging:
|
||||||
|
# 显式指定日志配置:涂鸦 open-mq-sdk jar 内自带 logback.xml 会被抢占,
|
||||||
|
# 强制使用统一配置(文件本体在 iot-common,构建时复制到本模块),含滚动切分与保留策略
|
||||||
|
config: classpath:logback-spring.xml
|
||||||
level:
|
level:
|
||||||
root: INFO
|
root: INFO
|
||||||
com.iot: DEBUG
|
com.iot: INFO
|
||||||
com.iot.alarm: DEBUG
|
com.iot.alarm: INFO
|
||||||
|
|||||||
88
backend/iot-common/src/main/resources/logback-spring.xml
Normal file
88
backend/iot-common/src/main/resources/logback-spring.xml
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
iotsaas 统一日志配置(唯一真相源,iot-device / iot-data / iot-rule / iot-alarm 四个服务共用)。
|
||||||
|
|
||||||
|
存放位置:iot-common/src/main/resources/logback-spring.xml
|
||||||
|
生效方式:各服务 application.yml 中显式声明 logging.config: classpath:logback-spring.xml
|
||||||
|
(构建时由父 pom 的 maven-resources-plugin 复制到各服务 BOOT-INF/classes/)
|
||||||
|
|
||||||
|
为什么必须显式指定:
|
||||||
|
涂鸦 open-mq-sdk jar 内自带 logback.xml,会被 logback 标准查找逻辑命中并抢占日志配置
|
||||||
|
(root=DEBUG、日志写到 ./logs 相对目录、只按小时切分),曾导致 /opt/iotsaas/logs/iot-device.out
|
||||||
|
暴涨到 613MB。本配置通过 logging.config 显式指定,优先级最高,确保生效。
|
||||||
|
|
||||||
|
轮转策略:按日切分 + 单文件 50MB 上限,保留 7 天,主日志总量上限 2GB,错误日志 512MB。
|
||||||
|
日志目录:默认相对工作目录 logs/app(本地开发),生产由 systemd 注入环境变量
|
||||||
|
LOG_DIR=/opt/iotsaas/logs/app。
|
||||||
|
-->
|
||||||
|
<configuration>
|
||||||
|
<!-- 服务名:取自各服务 application.yml 的 spring.application.name -->
|
||||||
|
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="iot-app"/>
|
||||||
|
<!-- 日志根目录 -->
|
||||||
|
<property name="LOG_DIR" value="${LOG_DIR:-logs/app}"/>
|
||||||
|
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
|
||||||
|
<property name="LOG_FILE" value="${LOG_DIR}/${APP_NAME}.log"/>
|
||||||
|
<property name="LOG_FILE_PATTERN" value="${LOG_DIR}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz"/>
|
||||||
|
<property name="ERR_FILE" value="${LOG_DIR}/${APP_NAME}-error.log"/>
|
||||||
|
<property name="ERR_FILE_PATTERN" value="${LOG_DIR}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log.gz"/>
|
||||||
|
|
||||||
|
<!-- 控制台:交给 systemd journal(journalctl -u iot-device -f 可查) -->
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
<charset>UTF-8</charset>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 主日志文件:按日 + 50MB 双触发切分,保留 7 天,总量上限 2GB -->
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_FILE}</file>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${LOG_FILE_PATTERN}</fileNamePattern>
|
||||||
|
<maxFileSize>50MB</maxFileSize>
|
||||||
|
<maxHistory>7</maxHistory>
|
||||||
|
<totalSizeCap>2GB</totalSizeCap>
|
||||||
|
<cleanHistoryOnStart>true</cleanHistoryOnStart>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
<charset>UTF-8</charset>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 错误日志单独一份,便于快速定位故障;保留 30 天 -->
|
||||||
|
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${ERR_FILE}</file>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<level>ERROR</level>
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${ERR_FILE_PATTERN}</fileNamePattern>
|
||||||
|
<maxFileSize>20MB</maxFileSize>
|
||||||
|
<maxHistory>30</maxHistory>
|
||||||
|
<totalSizeCap>512MB</totalSizeCap>
|
||||||
|
<cleanHistoryOnStart>true</cleanHistoryOnStart>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
<charset>UTF-8</charset>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 第三方 SDK 降噪:涂鸦 / MQTT / 消息中间件只保留 WARN 以上 -->
|
||||||
|
<logger name="com.tuya" level="WARN"/>
|
||||||
|
<logger name="openmq" level="WARN"/>
|
||||||
|
<logger name="org.eclipse.paho" level="WARN"/>
|
||||||
|
<logger name="org.springframework.amqp" level="WARN"/>
|
||||||
|
<logger name="com.aliyun" level="WARN"/>
|
||||||
|
<!-- 业务包:INFO(MyBatis mapper SQL 日志随此级别收敛,避免刷屏) -->
|
||||||
|
<logger name="com.iot" level="INFO"/>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="CONSOLE"/>
|
||||||
|
<appender-ref ref="FILE"/>
|
||||||
|
<appender-ref ref="ERROR_FILE"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
@ -84,7 +84,10 @@ mybatis-plus:
|
|||||||
|
|
||||||
# 日志配置
|
# 日志配置
|
||||||
logging:
|
logging:
|
||||||
|
# 显式指定日志配置:涂鸦 open-mq-sdk jar 内自带 logback.xml 会被抢占,
|
||||||
|
# 强制使用统一配置(文件本体在 iot-common,构建时复制到本模块),含滚动切分与保留策略
|
||||||
|
config: classpath:logback-spring.xml
|
||||||
level:
|
level:
|
||||||
root: INFO
|
root: INFO
|
||||||
com.iot: DEBUG
|
com.iot: INFO
|
||||||
com.iot.data: DEBUG
|
com.iot.data: INFO
|
||||||
|
|||||||
@ -111,14 +111,14 @@ xxl:
|
|||||||
logging:
|
logging:
|
||||||
# 显式指定日志配置:涂鸦 open-mq-sdk jar 内自带 logback.xml 会被标准 logback
|
# 显式指定日志配置:涂鸦 open-mq-sdk jar 内自带 logback.xml 会被标准 logback
|
||||||
# 自动初始化命中并抢占日志输出(控制台无日志、日志写入 ./logs/ 相对目录),
|
# 自动初始化命中并抢占日志输出(控制台无日志、日志写入 ./logs/ 相对目录),
|
||||||
# 这里强制使用本应用的 logback-spring.xml 覆盖之
|
# 这里强制使用本应用的 logback-spring.xml 覆盖之(文件本体在 iot-common,构建时复制到本模块)
|
||||||
config: classpath:logback-spring.xml
|
config: classpath:logback-spring.xml
|
||||||
level:
|
level:
|
||||||
root: INFO
|
root: INFO
|
||||||
com.iot: DEBUG
|
# 生产环境保持 INFO:MyBatis mapper 的 SQL 日志在 DEBUG 级别,
|
||||||
com.iot.device: DEBUG
|
# 打开后每条 SQL 打印两次,单日可产生上万条日志并撑大日志文件
|
||||||
pattern:
|
com.iot: INFO
|
||||||
console: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n'
|
com.iot.device: INFO
|
||||||
|
|
||||||
# Swagger配置
|
# Swagger配置
|
||||||
knife4j:
|
knife4j:
|
||||||
|
|||||||
@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!--
|
|
||||||
恢复 Spring Boot 标准日志配置。
|
|
||||||
背景:涂鸦 open-mq-sdk jar 内自带 logback.xml,被 logback 标准查找逻辑命中后
|
|
||||||
会抢占日志输出(控制台无日志、日志被写到 ./logs/ 相对目录)。
|
|
||||||
Spring Boot 的查找顺序为 logback-test.xml → logback-spring.xml → logback.xml,
|
|
||||||
本文件(logback-spring.xml)优先级高于 jar 内的 logback.xml,从而覆盖之。
|
|
||||||
-->
|
|
||||||
<configuration>
|
|
||||||
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
|
|
||||||
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
|
|
||||||
<root level="INFO">
|
|
||||||
<appender-ref ref="CONSOLE"/>
|
|
||||||
</root>
|
|
||||||
</configuration>
|
|
||||||
@ -97,8 +97,11 @@ mybatis-plus:
|
|||||||
|
|
||||||
# 日志配置
|
# 日志配置
|
||||||
logging:
|
logging:
|
||||||
|
# 显式指定日志配置:涂鸦 open-mq-sdk jar 内自带 logback.xml 会被抢占,
|
||||||
|
# 强制使用统一配置(文件本体在 iot-common,构建时复制到本模块),含滚动切分与保留策略
|
||||||
|
config: classpath:logback-spring.xml
|
||||||
level:
|
level:
|
||||||
root: INFO
|
root: INFO
|
||||||
com.iot: DEBUG
|
com.iot: INFO
|
||||||
com.iot.rule: DEBUG
|
com.iot.rule: INFO
|
||||||
org.drools: INFO
|
org.drools: INFO
|
||||||
|
|||||||
@ -199,6 +199,37 @@
|
|||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<!--
|
||||||
|
统一日志配置:把 iot-common 的 logback-spring.xml 复制到各服务的 BOOT-INF/classes。
|
||||||
|
目的:让 4 个服务都带上同一份日志配置,从而稳定覆盖涂鸦 open-mq-sdk jar 内自带的
|
||||||
|
logback.xml(该配置 root=DEBUG 且只写 ./logs 相对目录,曾导致日志文件无限膨胀)。
|
||||||
|
-->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-logback-config</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
|
||||||
|
<overwrite>true</overwrite>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>${project.basedir}/../iot-common/src/main/resources</directory>
|
||||||
|
<includes>
|
||||||
|
<include>logback-spring.xml</include>
|
||||||
|
</includes>
|
||||||
|
<filtering>false</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -25,7 +25,7 @@ set JAR_ALARM=iot-alarm-1.0.0.jar
|
|||||||
:: ============ 1) 后端构建(含共享模块 iot-common) ============
|
:: ============ 1) 后端构建(含共享模块 iot-common) ============
|
||||||
cd /d %BACKEND_DIR%
|
cd /d %BACKEND_DIR%
|
||||||
echo ============================================
|
echo ============================================
|
||||||
echo [1/7] Maven 重新构建 4 个服务(含共享模块 iot-common)
|
echo [1/8] Maven 重新构建 4 个服务(含共享模块 iot-common)
|
||||||
echo ============================================
|
echo ============================================
|
||||||
call mvn clean package -pl iot-device,iot-data,iot-rule,iot-alarm -am -DskipTests
|
call mvn clean package -pl iot-device,iot-data,iot-rule,iot-alarm -am -DskipTests
|
||||||
if %ERRORLEVEL% NEQ 0 ( echo [错误] 后端构建失败,已中止。 & pause & exit /b 1 )
|
if %ERRORLEVEL% NEQ 0 ( echo [错误] 后端构建失败,已中止。 & pause & exit /b 1 )
|
||||||
@ -33,7 +33,7 @@ echo [OK] 后端构建成功。
|
|||||||
|
|
||||||
:: ============ 2) 上传 4 个 jar ============
|
:: ============ 2) 上传 4 个 jar ============
|
||||||
echo ============================================
|
echo ============================================
|
||||||
echo [2/7] 上传 4 个 jar 到服务器 %SRV_JARS%
|
echo [2/8] 上传 4 个 jar 到服务器 %SRV_JARS%
|
||||||
echo ============================================
|
echo ============================================
|
||||||
tar cf - -C %BACKEND_DIR%\iot-device\target %JAR_DEV% -C %BACKEND_DIR%\iot-data\target %JAR_DATA% -C %BACKEND_DIR%\iot-rule\target %JAR_RULE% -C %BACKEND_DIR%\iot-alarm\target %JAR_ALARM% | %PLINK% %PLINK_OPTS% tar xf - -C %SRV_JARS%
|
tar cf - -C %BACKEND_DIR%\iot-device\target %JAR_DEV% -C %BACKEND_DIR%\iot-data\target %JAR_DATA% -C %BACKEND_DIR%\iot-rule\target %JAR_RULE% -C %BACKEND_DIR%\iot-alarm\target %JAR_ALARM% | %PLINK% %PLINK_OPTS% tar xf - -C %SRV_JARS%
|
||||||
if %ERRORLEVEL% NEQ 0 ( echo [错误] jar 上传失败。 & pause & exit /b 1 )
|
if %ERRORLEVEL% NEQ 0 ( echo [错误] jar 上传失败。 & pause & exit /b 1 )
|
||||||
@ -41,7 +41,7 @@ echo [OK] jar 上传完成。
|
|||||||
|
|
||||||
:: ============ 2.5) 数据库迁移(Flyway 在本环境未启用,按 DB 内 tracking 表应用未执行的 V 迁移) ============
|
:: ============ 2.5) 数据库迁移(Flyway 在本环境未启用,按 DB 内 tracking 表应用未执行的 V 迁移) ============
|
||||||
echo ============================================
|
echo ============================================
|
||||||
echo [3/7] 应用未执行的 SQL 迁移(%BACKEND_DIR%\sql\V*.sql,按 db_migrations_applied 去重)
|
echo [3/8] 应用未执行的 SQL 迁移(%BACKEND_DIR%\sql\V*.sql,按 db_migrations_applied 去重)
|
||||||
echo ============================================
|
echo ============================================
|
||||||
set MIG_DIR=%BACKEND_DIR%\sql
|
set MIG_DIR=%BACKEND_DIR%\sql
|
||||||
set CHK_FILE=%TEMP%\_mig_chk.txt
|
set CHK_FILE=%TEMP%\_mig_chk.txt
|
||||||
@ -58,9 +58,23 @@ REM 应用未记录的 V 迁移(新增迁移文件会自动在此补跑,无
|
|||||||
for /f "delims=" %%F in ('dir /b /on "%MIG_DIR%\V*.sql"') do call :mig_apply "%%F"
|
for /f "delims=" %%F in ('dir /b /on "%MIG_DIR%\V*.sql"') do call :mig_apply "%%F"
|
||||||
echo [OK] 迁移步骤完成。
|
echo [OK] 迁移步骤完成。
|
||||||
|
|
||||||
|
::: ============ 3.5) 日志治理:同步 systemd 单元 + journald 限额,清理无轮转的历史 .out ============
|
||||||
|
echo ============================================
|
||||||
|
echo [4/8] 同步 systemd 单元与 journald 限额(日志轮转治理),并清理历史无轮转 .out/.err
|
||||||
|
echo ============================================
|
||||||
|
%PLINK% %PLINK_OPTS% "rm -rf /tmp/iotsaas-units && mkdir -p /tmp/iotsaas-units"
|
||||||
|
tar cf - -C %BACKEND_DIR%\deploy\systemd . | %PLINK% %PLINK_OPTS% tar xf - -C /tmp/iotsaas-units
|
||||||
|
if %ERRORLEVEL% NEQ 0 ( echo [错误] systemd 单元上传失败。 & pause & exit /b 1 )
|
||||||
|
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' cp /tmp/iotsaas-units/iot-device.service /tmp/iotsaas-units/iot-data.service /tmp/iotsaas-units/iot-rule.service /tmp/iotsaas-units/iot-alarm.service /etc/systemd/system/ && echo 'Tonzou@888' | sudo -S -p '' mkdir -p /etc/systemd/journald.conf.d && echo 'Tonzou@888' | sudo -S -p '' cp /tmp/iotsaas-units/journald-iotsaas.conf /etc/systemd/journald.conf.d/iotsaas.conf"
|
||||||
|
if %ERRORLEVEL% NEQ 0 ( echo [错误] systemd 单元安装失败。 & pause & exit /b 1 )
|
||||||
|
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' systemctl daemon-reload && echo 'Tonzou@888' | sudo -S -p '' systemctl restart systemd-journald"
|
||||||
|
REM 清理历史无轮转的 .out/.err(内容已由 journal 与滚动日志文件接管),并准备滚动日志目录
|
||||||
|
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' rm -f /opt/iotsaas/logs/*.out /opt/iotsaas/logs/*.err && echo 'Tonzou@888' | sudo -S -p '' rm -rf /opt/iotsaas/backend/jars/logs && echo 'Tonzou@888' | sudo -S -p '' mkdir -p /opt/iotsaas/logs/app && echo 'Tonzou@888' | sudo -S -p '' chown -R tonzou:tonzou /opt/iotsaas/logs"
|
||||||
|
echo [OK] systemd 单元与 journald 限额已同步,历史 .out 已清理。
|
||||||
|
|
||||||
:: ============ 3) 重启 4 个后端服务 ============
|
:: ============ 3) 重启 4 个后端服务 ============
|
||||||
echo ============================================
|
echo ============================================
|
||||||
echo [4/7] 重启 4 个后端服务(systemd)
|
echo [5/8] 重启 4 个后端服务(systemd)
|
||||||
echo ============================================
|
echo ============================================
|
||||||
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' systemctl restart iot-device iot-data iot-rule iot-alarm" 2>nul
|
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' systemctl restart iot-device iot-data iot-rule iot-alarm" 2>nul
|
||||||
if %ERRORLEVEL% NEQ 0 ( echo [错误] 服务重启失败。 & pause & exit /b 1 )
|
if %ERRORLEVEL% NEQ 0 ( echo [错误] 服务重启失败。 & pause & exit /b 1 )
|
||||||
@ -69,7 +83,7 @@ echo [OK] 重启命令已下发。
|
|||||||
:: ============ 4) 构建前端后台(admin) ============
|
:: ============ 4) 构建前端后台(admin) ============
|
||||||
cd /d %ADMIN_DIR%
|
cd /d %ADMIN_DIR%
|
||||||
echo ============================================
|
echo ============================================
|
||||||
echo [5/7] 构建前端后台(admin)— 跳过 vue-tsc 类型检查,直接 vite build
|
echo [6/8] 构建前端后台(admin)— 跳过 vue-tsc 类型检查,直接 vite build
|
||||||
echo ============================================
|
echo ============================================
|
||||||
where node >nul 2>nul || ( echo [错误] 未找到 node,请将其加入 PATH。 & pause & exit /b 1 )
|
where node >nul 2>nul || ( echo [错误] 未找到 node,请将其加入 PATH。 & pause & exit /b 1 )
|
||||||
call npx vite build
|
call npx vite build
|
||||||
@ -78,7 +92,7 @@ echo [OK] 前端构建成功(dist 已生成)。
|
|||||||
|
|
||||||
:: ============ 5) 上传前端 dist(先清空旧文件再解包,避免残留旧 hash 资源) ============
|
:: ============ 5) 上传前端 dist(先清空旧文件再解包,避免残留旧 hash 资源) ============
|
||||||
echo ============================================
|
echo ============================================
|
||||||
echo [6/7] 上传前端 dist 到服务器 %SRV_DIST%
|
echo [7/8] 上传前端 dist 到服务器 %SRV_DIST%
|
||||||
echo ============================================
|
echo ============================================
|
||||||
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' rm -rf %SRV_DIST% && mkdir -p %SRV_DIST%"
|
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' rm -rf %SRV_DIST% && mkdir -p %SRV_DIST%"
|
||||||
if %ERRORLEVEL% NEQ 0 ( echo [错误] 清空远端 dist 失败。 & pause & exit /b 1 )
|
if %ERRORLEVEL% NEQ 0 ( echo [错误] 清空远端 dist 失败。 & pause & exit /b 1 )
|
||||||
@ -88,7 +102,7 @@ echo [OK] dist 上传完成。
|
|||||||
|
|
||||||
:: ============ 6) 确认状态 ============
|
:: ============ 6) 确认状态 ============
|
||||||
echo ============================================
|
echo ============================================
|
||||||
echo [7/7] 等待启动并确认服务状态
|
echo [8/8] 等待启动并确认服务状态
|
||||||
echo ============================================
|
echo ============================================
|
||||||
timeout /t 20 /nobreak >nul
|
timeout /t 20 /nobreak >nul
|
||||||
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' systemctl is-active iot-device iot-data iot-rule iot-alarm" 2>nul
|
%PLINK% %PLINK_OPTS% "echo 'Tonzou@888' | sudo -S -p '' systemctl is-active iot-device iot-data iot-rule iot-alarm" 2>nul
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user