日志文件爆满,springCloud微服务架构中的,日志爆满如何解决,使用脚本直接删除,会导致,
如果要删除的日志文件,还正在被进程占用,那么你即使使用脚本定时删除了,这个日志文件,那么这个日志文件实际上还是不会删除的,他的大小,依然占用磁盘,就是因为,有进程还在占用它,所以之前说的,日志文件爆满,使用脚本定时删除,是不可用的.
要想解决这个问题,最好直接在微服务的服务中,进行配置,比如:
这里我们使用logback来管理日志文件:比如有个微服务的名字叫:xxx-bigdata-platform-system
那么,这个时候,在这个项目的E:\bigData\RuoYi-Cloud-Plus-master\ruoyi-modules\xxx-bigdata-platform-system\src\main\resources\logback-spring.xml
这个配置文件中可以这样写:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--过滤trace日志到控制台-->
<filter class="com.plumelog.logback.util.FilterSyncLogger">
<level></level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/nohup_xxx-bigdata-platform-system.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>3</MaxHistory>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 环境配置 -->
<springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
<springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
<springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
<springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
<springProperty scope="context" name="plumelog.env" source="spring.profiles.active"/>
<!-- 输出plumelog -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<env>${plumelog.env}</env>
</appender>
<!-- 配置日志输出,只输出info,只保留控制台和plumelog输出-->
<!-- 正常开发环境本地,只输出到控制台,测试环境只输出到plumelog,生产环境输出到本地文件plumelog,因为有plumelog加持本地文件就保留3天即可-->
<!-- 这些都可以根据环境配置不同加载不同的ref-->
<root level="info">
<!--输出到控制台-->
<appender-ref ref="CONSOLE"/>
<!-- 输出到文件 -->
<appender-ref ref="file"/>
<!-- 输出plumelog -->
<appender-ref ref="plumelog"/>
</root>
</configuration>
这个文件可以复制过去直接使用.
可以看到上面配置的就是,只保留3天的日志,并且,每天生成一个日志文件
logs/nohup_xxx-bigdata-platform-system.log.%d{yyyy-MM-dd}.log
这里yyyy-MM-dd就相当于指定了,每天生成一个日志文件

可以看到就正常生产文件了已经.
然后,pom.xml中需要引入:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
引入以后,还有个地方需要,在配置文件中添加配置,这个一般是,在nacos中,对应微服务的
配置:
# 日志配置
logging:
level:
org.springframework: warn
org.apache.dubbo: warn
com.alibaba.nacos: warn
config: classpath:logback-spring.xml
20250415110630补充:
补充一下:
20250414173618 这种方式也是不可以的,最后发现:
上面的配置,只能是让比如system.jar的日志,生成到/logs文件夹中,并且,只保留3天的日志.
但是启动system.jar的时候,还是会生成一个.out文件
nohup java -jar system.jar > nohup_system.out 2>&1 &
如果这样的话,那么,就会把日志,标准输出,还有,错误信息输出到nohup_system.out文件中
如果:nohup java -jar system.jar 2>&1 & 或者直接
nohup java -jar system.jar & 这样的话
就会自动生成一个nohup.out文件,把内容写入到这个文件中去. 所以, 怎么弄都不行.
直接java -jar system.jar 2>&1 & 或者 java -jar system.jar & 就会把日志打印到,控制台中
如果控制台一关,那么进程就关闭了.也不行.所以只能按照下面这样了.
定时的写个脚本,定时执行:
cat /dev/null > nohup.out 类似这样
这样就会定时清空,这个文件,同时,如果有比如system.jar正在占用这个文件,也是不受影响的.
但是不能删除,如果你删除了这个文件,就会出现一种情况,就是你虽然删除了,但是,当前
有进程比如system.jar进程还在占用这个文件,那么,虽然你删除了,但是,这个文件还是会占用磁盘,
直到你关闭了system.jar这个进程,当然system.jar这个进程是不能随便关的. 因为是正式环境在用的.
在进程占用`nohup.out` 文件的情况下执行`cat /dev/null > nohup.out` 或者`echo "">nohup.out` ,文件内容会被清空,文件大小会随之变小。而若在进程占用时删除`nohup.out` 文件,操作系统会在进程关闭前为其保留该文件的空间,直到进程不再使用它,此时空间才会被释放。
#!/bin/bash
# 日志文件列表
LOG_FILES=("/data/module/jar/nohup_xxxxx-bigdata-platform-system.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-monitor.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-stream-mq.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-xxl-job-admin.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-sentinel-dashboard.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-seata-server.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-nacos.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-gateway.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-resource.out" "/data/module/jar/nohup_xxxxx-bigdata-platform-auth.out" "/data/module/jar/nohup_check_log_andclean.out")
# 检查间隔时间(秒)
INTERVAL=3600
#INTERVAL=3
# 日志文件大小阈值(字节)
#1GB
#SIZE_LIMIT=1073741824
#100MB
SIZE_LIMIT=104857600
#SIZE_LIMIT=1
while true; do
for LOG_FILE in "${LOG_FILES[@]}"; do
# 检查文件是否存在
if [ -f "$LOG_FILE" ]; then
# 获取日志文件大小
CURRENT_SIZE=$(stat -c%s "$LOG_FILE")
# 如果日志文件大小超过阈值,则清空文件
if [ "$CURRENT_SIZE" -gt "$SIZE_LIMIT" ]; then
cat /dev/null > "$LOG_FILE"
echo "Log file $LOG_FILE has been cleared at$(date)"
fi
else
echo "Log file $LOG_FILE does not exist at$(date)"
fi
done
# 等待一段时间后再次检查
sleep "$INTERVAL"
done
执行的时候直接 nohup sh check_clean.sh &
这样就可以了.
上面的脚本已经很好用了,可以看到直接把,脚本自己产生的日志也进行了检查.
759

被折叠的 条评论
为什么被折叠?



