当前位置: 首页 > news >正文

把网站做app小程序开发兼职的小知识点

把网站做app,小程序开发兼职的小知识点,无锡网站排名哪里有,北京养老网站开发logback无法删除太久远的日志文件?logback删除日志文件源码分析 最近发现logback配置滚动日志,但是本地日志文件甚至还有2年前的日志文件,服务器是却是正常的! 网上搜索了一波没有发现,只找到说不能删除太久远的旧日志…

logback无法删除太久远的日志文件?logback删除日志文件源码分析

最近发现logback配置滚动日志,但是本地日志文件甚至还有2年前的日志文件,服务器是却是正常的!
网上搜索了一波没有发现,只找到说不能删除太久远的旧日志文件
在这里插入图片描述

我的配置

<!--    基于时间和空间的滚动日志,单个文件最大10MB,保留天数最大30天,所以日志保留最大空间是20GB    -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>/root/demo/logs/hornet_%d{yyyyMMdd}.%i.log</fileNamePattern><maxFileSize>10mb</maxFileSize><maxHistory>30</maxHistory><totalSizeCap>20GB</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 SizeAndTimeBasedRollingPolicy<E> extends TimeBasedRollingPolicy<E> {FileSize maxFileSize;@Overridepublic void start() {SizeAndTimeBasedFNATP<E> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<E>(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.SizeAndTimeBasedRollingPolicy@"+this.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 DefaultTimeBasedFileNamingAndTriggeringPolicy<E>();}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 天数,然后遍历清理 (-maxHistory+1)+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默认不会在项目启动时清理旧日志文件,如果需要启动执行则需配置

<cleanHistoryOnStart>true</cleanHistoryOnStart>
http://www.yayakq.cn/news/354089/

相关文章:

  • 楚雄建网站网站设计项目书
  • wordpress多城市子站网站建设相关的书籍
  • 做网站可以用思源字体吗网站建设开发维护
  • 郑州做网站公司中百度seo服务公司
  • 新手做站必看 手把手教你做网站建湖人才网最新招聘信息查询
  • 保定网站设计网站三乡网站开发
  • 校园超市网站开发背景宣传片制作合同范本
  • 杭州培训网站建设如何免费创建个人网站
  • 网站纯色背景图怎么做wordpress添加后台菜单
  • wordpress网站制作价格wordpress 添加关键词
  • 学校网站素材网站被收录后又被提出了
  • 培训网站开发哪个好东莞市seo网络推广品牌
  • 衡阳建设学校官方网站建设网站要什么资料
  • 可以在什么网站做二建题目深圳建设集团大厦
  • 学校资源网站建设有啥作用淄博网站制作定制升级
  • 金华网站建设外包电影网站怎么做seo
  • 用js做的网站页面上海中建建筑设计院有限公司
  • 永州市网站建设做网站的工作要求
  • 网站推广效果不好原因永久免费的软件
  • 班级网站素材下载淘宝和Wordpress
  • 漂亮网站河南省建设厅网站建设领域涉黑
  • wordpress环境配置网站关键词排名优化电话
  • 石碣做网站商业网站建设案例课程视屏下载
  • wordpress导购站主题wordpress如何编辑
  • 彭阳门户网站建设长沙企业建
  • 网络策划就业前景seo优化网站词
  • 响应式网站的意义网站建设构思
  • 吉林省城市建设学校网站企业文化范文
  • 番禺高端网站制作山东省建设项目备案证明网站
  • 散热器 东莞网站建设百度市场应用官方app