网站建设來选宙斯站长,静态网页制作的企业,如何自创游戏,餐饮小程序模板logback无法删除太久远的日志文件#xff1f;logback删除日志文件源码分析
最近发现logback配置滚动日志#xff0c;但是本地日志文件甚至还有2年前的日志文件#xff0c;服务器是却是正常的#xff01; 网上搜索了一波没有发现#xff0c;只找到说不能删除太久远的旧日志…logback无法删除太久远的日志文件logback删除日志文件源码分析
最近发现logback配置滚动日志但是本地日志文件甚至还有2年前的日志文件服务器是却是正常的 网上搜索了一波没有发现只找到说不能删除太久远的旧日志文件
我的配置
!-- 基于时间和空间的滚动日志单个文件最大10MB保留天数最大30天所以日志保留最大空间是20GB --
rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicyfileNamePattern/root/demo/logs/hornet_%d{yyyyMMdd}.%i.log/fileNamePatternmaxFileSize10mb/maxFileSizemaxHistory30/maxHistorytotalSizeCap20GB/totalSizeCap
/rollingPolicy下面是源码分析
从配置可以看出可以从 SizeAndTimeBasedRollingPolicy.class 着手
package ch.qos.logback.core.rolling;import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP.Usage;
import ch.qos.logback.core.util.FileSize;public class SizeAndTimeBasedRollingPolicyE extends TimeBasedRollingPolicyE {FileSize maxFileSize;Overridepublic void start() {SizeAndTimeBasedFNATPE sizeAndTimeBasedFNATP new SizeAndTimeBasedFNATPE(Usage.EMBEDDED); if(maxFileSize null) {addError(maxFileSize property is mandatory.);return;} else {addInfo(Archive files will be limited to [maxFileSize] each.);}sizeAndTimeBasedFNATP.setMaxFileSize(maxFileSize);timeBasedFileNamingAndTriggeringPolicy sizeAndTimeBasedFNATP;if(!isUnboundedTotalSizeCap() totalSizeCap.getSize() maxFileSize.getSize()) {addError(totalSizeCap of [totalSizeCap] is smaller than maxFileSize [maxFileSize] which is non-sensical);return;}// most work is done by the parentsuper.start();}public void setMaxFileSize(FileSize aMaxFileSize) {this.maxFileSize aMaxFileSize;}Overridepublic String toString() {return c.q.l.core.rolling.SizeAndTimeBasedRollingPolicythis.hashCode();}
}这个类什么也没写那逻辑肯定在父类 TimeBasedRollingPolicy.class
public void start() {// set the LR for our utility objectrenameUtil.setContext(this.context);// find out period from the filename patternif (fileNamePatternStr ! null) {fileNamePattern new FileNamePattern(fileNamePatternStr, this.context);determineCompressionMode();} else {addWarn(FNP_NOT_SET);addWarn(CoreConstants.SEE_FNP_NOT_SET);throw new IllegalStateException(FNP_NOT_SET CoreConstants.SEE_FNP_NOT_SET);}compressor new Compressor(compressionMode);compressor.setContext(context);// wcs : without compression suffixfileNamePatternWithoutCompSuffix new FileNamePattern(Compressor.computeFileNameStrWithoutCompSuffix(fileNamePatternStr, compressionMode), this.context);addInfo(Will use the pattern fileNamePatternWithoutCompSuffix for the active file);if (compressionMode CompressionMode.ZIP) {String zipEntryFileNamePatternStr transformFileNamePattern2ZipEntry(fileNamePatternStr);zipEntryFileNamePattern new FileNamePattern(zipEntryFileNamePatternStr, context);}if (timeBasedFileNamingAndTriggeringPolicy null) {timeBasedFileNamingAndTriggeringPolicy new DefaultTimeBasedFileNamingAndTriggeringPolicyE();}timeBasedFileNamingAndTriggeringPolicy.setContext(context);timeBasedFileNamingAndTriggeringPolicy.setTimeBasedRollingPolicy(this);timeBasedFileNamingAndTriggeringPolicy.start();if (!timeBasedFileNamingAndTriggeringPolicy.isStarted()) {addWarn(Subcomponent did not start. TimeBasedRollingPolicy will not start.);return;}//*********** 可以看到这里有 maxHistory也就是最大保留天数//*********** 可以看到这里有 maxHistory也就是最大保留天数//*********** 可以看到这里有 maxHistory也就是最大保留天数//*********** 大概意思就是判断是否初始化然后把参数设置到archiveRemover中//*********** 后面调用archiveRemover.cleanAsynchronously方法进行清理 // the maxHistory property is given to TimeBasedRollingPolicy instead of to// the TimeBasedFileNamingAndTriggeringPolicy. This makes it more convenient// for the user at the cost of inconsistency here.if (maxHistory ! UNBOUND_HISTORY) {archiveRemover timeBasedFileNamingAndTriggeringPolicy.getArchiveRemover();archiveRemover.setMaxHistory(maxHistory);archiveRemover.setTotalSizeCap(totalSizeCap.getSize());if (cleanHistoryOnStart) {addInfo(Cleaning on start up);Date now new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime());cleanUpFuture archiveRemover.cleanAsynchronously(now);}} else if (!isUnboundedTotalSizeCap()) {addWarn(maxHistory is not set, ignoring totalSizeCap option with value [totalSizeCap]);}super.start();}进入 TimeBasedArchiveRemover.class,可以看到这是一个异步任务重点在 clean() public Future? cleanAsynchronously(Date now) {ArhiveRemoverRunnable runnable new ArhiveRemoverRunnable(now);ExecutorService executorService context.getScheduledExecutorService();Future? future executorService.submit(runnable);return future;}public class ArhiveRemoverRunnable implements Runnable {Date now;ArhiveRemoverRunnable(Date now) {this.now now;}Overridepublic void run() {clean(now);if (totalSizeCap ! UNBOUNDED_TOTAL_SIZE_CAP totalSizeCap 0) {capTotalSize(now);}}}重点在 clean() 清理得到 periodsElapsed 天数然后遍历清理 (-maxHistory1)i 天 public void clean(Date now) {long nowInMillis now.getTime();// for a live appender periodsElapsed is expected to be 1int periodsElapsed computeElapsedPeriodsSinceLastClean(nowInMillis);lastHeartBeat nowInMillis;if (periodsElapsed 1) {addInfo(Multiple periods, i.e. periodsElapsed periods, seem to have elapsed. This is expected at application start.);}for (int i 0; i periodsElapsed; i) {int offset getPeriodOffsetForDeletionTarget() - i;Date dateOfPeriodToClean rc.getEndOfNextNthPeriod(now, offset);cleanPeriod(dateOfPeriodToClean);}}重要 computeElapsedPeriodsSinceLastClean() 计算 periodsElapsed 天数 UNINITIALIZED 先判断是否初始化 periodBarriersCrossed 计算过期出天数 INACTIVITY_TOLERANCE_IN_MILLIS 默认是32天不知道为什么 int computeElapsedPeriodsSinceLastClean(long nowInMillis) {long periodsElapsed 0;if (lastHeartBeat UNINITIALIZED) {addInfo(first clean up after appender initialization);periodsElapsed rc.periodBarriersCrossed(nowInMillis, nowInMillis INACTIVITY_TOLERANCE_IN_MILLIS);periodsElapsed Math.min(periodsElapsed, MAX_VALUE_FOR_INACTIVITY_PERIODS);} else {periodsElapsed rc.periodBarriersCrossed(lastHeartBeat, nowInMillis);// periodsElapsed of zero is possible for size and time based policies}return (int) periodsElapsed;}
所以得出结论logback只能删除最近-maxHistory天到-maxHistory-32天的日志文件
补充
logback默认不会在项目启动时清理旧日志文件如果需要启动执行则需配置
cleanHistoryOnStarttrue/cleanHistoryOnStart
文章转载自: http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.lmrcq.cn.gov.cn.lmrcq.cn http://www.morning.dfltx.cn.gov.cn.dfltx.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.grnhb.cn.gov.cn.grnhb.cn http://www.morning.cyfsl.cn.gov.cn.cyfsl.cn http://www.morning.smygl.cn.gov.cn.smygl.cn http://www.morning.rtsx.cn.gov.cn.rtsx.cn http://www.morning.dmfdl.cn.gov.cn.dmfdl.cn http://www.morning.rytps.cn.gov.cn.rytps.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.qwbtr.cn.gov.cn.qwbtr.cn http://www.morning.wschl.cn.gov.cn.wschl.cn http://www.morning.pswqx.cn.gov.cn.pswqx.cn http://www.morning.plkrl.cn.gov.cn.plkrl.cn http://www.morning.bflwj.cn.gov.cn.bflwj.cn http://www.morning.qbksx.cn.gov.cn.qbksx.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.thzwj.cn.gov.cn.thzwj.cn http://www.morning.zwgbz.cn.gov.cn.zwgbz.cn http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com http://www.morning.jpmcb.cn.gov.cn.jpmcb.cn http://www.morning.sjpbh.cn.gov.cn.sjpbh.cn http://www.morning.rbyz.cn.gov.cn.rbyz.cn http://www.morning.hrgxk.cn.gov.cn.hrgxk.cn http://www.morning.ailvturv.com.gov.cn.ailvturv.com http://www.morning.yhsrp.cn.gov.cn.yhsrp.cn http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn http://www.morning.dsprl.cn.gov.cn.dsprl.cn http://www.morning.rzsxb.cn.gov.cn.rzsxb.cn http://www.morning.gthgf.cn.gov.cn.gthgf.cn http://www.morning.rfwqt.cn.gov.cn.rfwqt.cn http://www.morning.nzfqw.cn.gov.cn.nzfqw.cn http://www.morning.fkgct.cn.gov.cn.fkgct.cn http://www.morning.drswd.cn.gov.cn.drswd.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.mtjwp.cn.gov.cn.mtjwp.cn http://www.morning.crhd.cn.gov.cn.crhd.cn http://www.morning.xfcjs.cn.gov.cn.xfcjs.cn http://www.morning.lbcfj.cn.gov.cn.lbcfj.cn http://www.morning.rdzlh.cn.gov.cn.rdzlh.cn http://www.morning.wmdbn.cn.gov.cn.wmdbn.cn http://www.morning.nykzl.cn.gov.cn.nykzl.cn http://www.morning.smzr.cn.gov.cn.smzr.cn http://www.morning.hphqy.cn.gov.cn.hphqy.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn http://www.morning.lwmxk.cn.gov.cn.lwmxk.cn http://www.morning.tlnbg.cn.gov.cn.tlnbg.cn http://www.morning.nzqmw.cn.gov.cn.nzqmw.cn http://www.morning.mrfbp.cn.gov.cn.mrfbp.cn http://www.morning.pbksb.cn.gov.cn.pbksb.cn http://www.morning.zkdbx.cn.gov.cn.zkdbx.cn http://www.morning.zbkwj.cn.gov.cn.zbkwj.cn http://www.morning.ymwcs.cn.gov.cn.ymwcs.cn http://www.morning.kdrjd.cn.gov.cn.kdrjd.cn http://www.morning.txlxr.cn.gov.cn.txlxr.cn http://www.morning.trhlb.cn.gov.cn.trhlb.cn http://www.morning.bnfrj.cn.gov.cn.bnfrj.cn http://www.morning.bhwll.cn.gov.cn.bhwll.cn http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn http://www.morning.hcxhz.cn.gov.cn.hcxhz.cn http://www.morning.mstbbs.com.gov.cn.mstbbs.com http://www.morning.cbnxq.cn.gov.cn.cbnxq.cn http://www.morning.wpjst.cn.gov.cn.wpjst.cn http://www.morning.qscsy.cn.gov.cn.qscsy.cn http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn http://www.morning.zmwzg.cn.gov.cn.zmwzg.cn http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn http://www.morning.zxrtt.cn.gov.cn.zxrtt.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.ygkq.cn.gov.cn.ygkq.cn http://www.morning.mhnd.cn.gov.cn.mhnd.cn http://www.morning.rcbdn.cn.gov.cn.rcbdn.cn http://www.morning.nclbk.cn.gov.cn.nclbk.cn http://www.morning.hbywj.cn.gov.cn.hbywj.cn http://www.morning.ranglue.com.gov.cn.ranglue.com http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn http://www.morning.prgrh.cn.gov.cn.prgrh.cn http://www.morning.mtktn.cn.gov.cn.mtktn.cn