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

苏州城乡建设网站查询系统2023最近的新闻大事10条

苏州城乡建设网站查询系统,2023最近的新闻大事10条,网站后台密码存在哪,设计网站公司 生活湖南岚鸿日志输出主要依赖RollingFileAppender、TimeBasedRollingPolicy、SizeAndTimeBasedFNATP。 RollingFileAppender 主要用于生成日志文件#xff0c;格式化内容再输出到日志文件TimeBasedRollingPolicy 设置回滚策略#xff0c;如果发现日志输出的时间超过单位时间#xff0c…日志输出主要依赖RollingFileAppender、TimeBasedRollingPolicy、SizeAndTimeBasedFNATP。 RollingFileAppender 主要用于生成日志文件格式化内容再输出到日志文件TimeBasedRollingPolicy 设置回滚策略如果发现日志输出的时间超过单位时间则进行回滚在RollingFileAppender的日志文件添加FileNamePattern后缀同时清理掉MaxHistory时间之前的日志。例如如果fileNamePattern是%d{yyyy-MM-dd_HH-mm}.%i.gz最后的时间单位是分钟则在每一分钟之后进行回滚将原始日志文件后打成gz压缩包同时添加yyyy-MM-dd_HH-mm.i.gz作为后缀。如果maxHistory的值是30则会在回滚时删除30分钟之前的日志。SizeAndTimeBasedFNATP 基于文件大小进行回滚例如maxFileSize的值为1MB则当文件大小超过1MB时进行回滚。 // RollingFileAppender用于定义日志输出的格式和路径RollingFileAppenderObject rollingFileAppender (RollingFileAppenderObject) appender;rollingFileAppender.setContext(getContext());rollingFileAppender.setLayout(layout);if (getFileNamePattern() ! null) {// 基于时间的回滚策略TimeBasedRollingPolicyObject policy new TimeBasedRollingPolicyObject();policy.setFileNamePattern(rollingFileAppender.rawFileProperty().getFileNamePattern());policy.setContext(getContext());policy.setMaxHistory(getMaxHistory());policy.setParent(rollingFileAppender);if (getMaxFileSize() ! null) {//基于文件大小的回滚策略SizeAndTimeBasedFNATPObject triggeringPolicy new SizeAndTimeBasedFNATPObject();triggeringPolicy.setMaxFileSize(FileSize.valueOf(getMaxFileSize()));triggeringPolicy.setTimeBasedRollingPolicy(policy);triggeringPolicy.setContext(getContext());policy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);}policy.start();rollingFileAppender.setRollingPolicy(policy);rollingFileAppender.start();}在TimeBasedRollingPolicy#start()中主要是根据FileNamePattern的后缀名生成Compressor压缩对象用来压缩日志文件同时启动TimeBasedFileNamingAndTriggeringPolicyTimeBasedFileNamingAndTriggeringPolicy是用来根据时间找到日志并清理的对象。 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;}// 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();}TimeBasedFileNamingAndTriggeringPolicy对应的实现是SizeAndTimeBasedFNATP因此start()方法会被调用,主要就是设置日志文件的起始时间计算下次回滚的时间computeNextCheck()当时间超过时就会进行回滚同时创建ArchiveRemover用于删除日志文件。 // SizeAndTimeBasedFNATPpublic void start() {// we depend on certain fields having been initialized in super classsuper.start();archiveRemover createArchiveRemover();archiveRemover.setContext(context);String regex tbrp.fileNamePattern.toRegexForFixedDate(dateInCurrentPeriod);String stemRegex FileFilterUtil.afterLastSlash(regex);computeCurrentPeriodsHighestCounterValue(stemRegex);} // TimeBasedFileNamingAndTriggeringPolicyBasepublic void start() {DateTokenConverterObject dtc tbrp.fileNamePattern.getPrimaryDateTokenConverter();if (dtc null) {throw new IllegalStateException(FileNamePattern [ tbrp.fileNamePattern.getPattern() ] does not contain a valid DateToken);}if (dtc.getTimeZone() ! null) {rc new RollingCalendar(dtc.getDatePattern(), dtc.getTimeZone(), Locale.getDefault());} else {rc new RollingCalendar(dtc.getDatePattern());}addInfo(The date pattern is dtc.getDatePattern() from file name pattern tbrp.fileNamePattern.getPattern() .);rc.printPeriodicity(this);if (!rc.isCollisionFree()) {addError(The date format in FileNamePattern will result in collisions in the names of archived log files.);addError(CoreConstants.MORE_INFO_PREFIX COLLIDING_DATE_FORMAT_URL);withErrors();return;}setDateInCurrentPeriod(new Date(getCurrentTime()));if (tbrp.getParentsRawFileProperty() ! null) {File currentFile new File(tbrp.getParentsRawFileProperty());if (currentFile.exists() currentFile.canRead()) {setDateInCurrentPeriod(new Date(currentFile.lastModified()));}}addInfo(Setting initial period to dateInCurrentPeriod);computeNextCheck();} 到这里模块启动完毕开始正式的处理日志处理日志是从RollingFileAppender#doAppend()方法开始最终是到RollingFileAppender#subAppend()方法开始进行正式的处理着重分析这个方法即可。这个方法逻辑很简单先判断是否能够进行回滚然后rollover()回滚处理再调用父类OutputStreamAppender#subAppend()输出内容到日志文件我们主要关系回滚过程。 protected void subAppend(E event) {synchronized (triggeringPolicy) {if (triggeringPolicy.isTriggeringEvent(currentlyActiveFile, event)) {rollover();}}super.subAppend(event);}首先根据TimeBasedRollingPolicy#isTriggeringEvent()判断是否能够进行回滚会调用内置的TimeBasedFileNamingAndTriggeringPolicy对象进行判断在两种情况下会进行回滚一是如果时间到了二是文件超过我们设置的maxFileSize。 // TimeBasedRollingPolicypublic boolean isTriggeringEvent(File activeFile, final E event) {return timeBasedFileNamingAndTriggeringPolicy.isTriggeringEvent(activeFile, event);} // SizeAndTimeBasedFNATPpublic boolean isTriggeringEvent(File activeFile, final E event) {long time getCurrentTime();// first check for roll-over based on timeif (time nextCheck) {Date dateInElapsedPeriod dateInCurrentPeriod;elapsedPeriodsFileName tbrp.fileNamePatternWithoutCompSuffix.convertMultipleArguments(dateInElapsedPeriod, currentPeriodsCounter);currentPeriodsCounter 0;setDateInCurrentPeriod(time);computeNextCheck();return true;}......if (activeFile.length() maxFileSize.getSize()) {elapsedPeriodsFileName tbrp.fileNamePatternWithoutCompSuffix.convertMultipleArguments(dateInCurrentPeriod, currentPeriodsCounter);currentPeriodsCounter;return true;}return false;}回滚的处理是在RollingFileAppender#rollover()中。 public void rollover() {lock.lock();try {//关闭原始文件流this.closeOutputStream();//回滚attemptRollover();//新建日志文件attemptOpenFile();} finally {lock.unlock();}}首先获取回滚时生成的文件名然后进行回滚如果没有指定压缩策略的就重命名指定了就进行压缩。 public void rollover() throws RolloverFailure {String elapsedPeriodsFileName timeBasedFileNamingAndTriggeringPolicy.getElapsedPeriodsFileName();String elapsedPeriodStem FileFilterUtil.afterLastSlash(elapsedPeriodsFileName);if (compressionMode CompressionMode.NONE) {if (getParentsRawFileProperty() ! null) {renameUtil.rename(getParentsRawFileProperty(), elapsedPeriodsFileName);} // else { nothing to do if CompressionMode NONE and parentsRawFileProperty null }} else {if (getParentsRawFileProperty() null) {compressionFuture compressor.asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elapsedPeriodStem);} else {compressionFuture renameRawAndAsyncCompress(elapsedPeriodsFileName, elapsedPeriodStem);}}if (archiveRemover ! null) {Date now new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime());this.cleanUpFuture archiveRemover.cleanAsynchronously(now);}}如果需要进行定制的话可以考虑重写RollingFileAppender、TimeBasedRollingPolicy让日志按照我们的期望输出。
http://www.pierceye.com/news/692525/

相关文章:

  • 购物网站页面布局个人站长做导航网站
  • wordpress 增强编辑器网站暂时关闭 seo
  • 重庆网站设计开发培训广西省住房和城乡建设厅官网
  • 购物网站模板免费下载网站排名快速提升工具
  • 中山制作网站的公司滨江区网站开发公司
  • 申请建设工作网站的函酒店网站建设方案策划方案
  • 宠物店网站模板你是网站设计有限公司的项目经理
  • 潍坊网站开发公司2018做网站还赚钱吗
  • 做化妆品网站怎样wordpress映射到外网访问
  • 关于加强门户网站建设爱客crm客户管理系统
  • 网站备案的是域名还是空间电子商务网站建设携程
  • 建设企业网站管理系统目的开发一个网站的费用
  • 网站开发和浏览器兼容问题软文广告案例分析
  • 更新网站的方法自贡网站建设哪家好
  • 沈阳网络建网站个人电子商务网站建设的总体目标
  • asp 大型网站开发优化公司治理结构
  • 做外贸 建网站要注意什么ssr网站怎么做
  • 杭州做兼职网站建设老五wordpress
  • 网站建设工资怎么样网站曝光率
  • 亚泰国际建设股份有限公司网站app推广方案模板
  • pathon能做网站开发吗直播网站模板
  • 东莞网站设计网址html怎么添加图片为背景
  • 怎样自己做企业网站网上投诉平台
  • 平价网站建设宝安营销型网站制作
  • 中英网站怎么做seo团队管理系统
  • 做签到的网站上海网站se0优化公司
  • 网站开发技术说明文档网站审核员做点啥
  • 网站设计与网页设计的区别建设部资质查询网站
  • 教育网站制作哪家服务好网站建设运转
  • 山西省轻工建设有限责网站网件路由器无线桥接