如何根据时间或大小将logback配置为rollover,文件总数的绝对最大值是多少?

euoag5mw  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(376)

抱歉,如果这被视为重复。这个问题很相似,但不一样。我感兴趣的是控制文件的总数量(我真的想控制用于所有日志的总大小)。
我想从日志返回以下内容:
对于当前文件,每12小时滚动一次,否则文件将达到100mb。
不管怎样,总空间不要超过600mb(我也可以这样说:不要有超过5个备份文件)。
第一点似乎很简单。我知道timebasedrollingpolicy,我知道我可以限制每个文件的大小,但这还不够。我需要一种方法来限制日志文件的总数,而不仅仅是时间段的总数。

332nm8kg

332nm8kg1#

这是一个很长的时间,有人要求的代码,所以我想我会张贴它作为一个答案。我没有测试过,但它应该作为一个合理的例子。

/**
 * Extends SizeBasedTriggeringPolicy to trigger based on size or time in minutes
 *
 * Example:
 *   <triggeringPolicy class="com.foo.bar.TimeSizeBasedTriggeringPolicy">
 *       <MaxFileSize>10MB</MaxFileSize>
 *       <RolloverInMinutes>35</RolloverInMinutes>
 *   </triggeringPolicy>
 *
 * This would rollover every 35min or 10MB, whichever comes first. Because isTriggeringEvent()
 * is only called when a log line comes in, these limits will not be obeyed perfectly.
 */
public class TimeSizeBasedTriggeringPolicy<E> extends SizeBasedTriggeringPolicy<E> {
     private long MILLIS_IN_A_MINUTE = 60 * 1000;

     private long rolloverPeriod;
     private long nextRolloverTime;

     @Override
     public void start() {
         nextRolloverTime = System.currentTimeMillis() + rolloverPeriod;
         super.start();
     }

     @Override
     public boolean isTriggeringEvent(File activeFile, final E event) {
         long currentTime = System.currentTimeMillis();
         boolean isRolloverTime = super.isTriggeringEvent(activeFile, event) ||
                 currentTime >= nextRolloverTime;

         // Reset the rollover period regardless of why we're rolling over.
         if (isRolloverTime) {
             nextRolloverTime = currentTime + rolloverPeriod;
         }

         return isRolloverTime;
     }

     public long getRolloverInMinutes() {
         return rolloverPeriod / MILLIS_IN_A_MINUTE;
     }

     public void setRolloverInMinutes(long rolloverPeriodInMinutes) {
         this.rolloverPeriod = rolloverPeriodInMinutes * MILLIS_IN_A_MINUTE;
     }
 }

相关问题