日志文件爆满_配置使用logback_只保留3天日志文件_每天定时生成一个日志文件_并编写脚本每小时检测日志文件大于100MB就清空---SpringCloud工作笔记206

    日志文件爆满,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 &

这样就可以了.

上面的脚本已经很好用了,可以看到直接把,脚本自己产生的日志也进行了检查.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

添柴程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值