当前位置: 首页 > 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.zqtcl.cn/news/692525/

相关文章:

  • 免费开通的网站外国网站在中国做推广
  • 揭阳公司做网站泰国网站域名
  • 上海网站制作方法北京网站制作设计推广公司
  • 衡水哪有建网站的吗个人简历word模板
  • 网站建设前期开发企业网站开发丨薇
  • 流程图 网站做网站后台数据库建设
  • 免费做英语卷子的网站wordpress去谷歌插件
  • 做网站费用网站极简设计
  • 兰州市建设工程安全质量监督站网站优化公司治理
  • 高质量的合肥网站建设天津百度网站快速优化
  • 千元低价网站建设wordpress修改文章时间
  • 做网站需要几个程序wordpress淘客api
  • 建筑公司网站源码本地建站教程
  • 甘肃省建设厅官方网站信息网腾讯企点qq
  • 搜狗收录网站建个网络平台多少钱
  • 电子商务网站开发目的和意义郑州网站优化的微博_腾讯微博
  • asp.net网站建设项目实战 董义革wordpress伪静态规则访问失败
  • 网站添加锚点网站备案名称更换
  • 手机商城网站如何企业网站建设及运营现状分析
  • 网站建设注意的问题网站模板 知乎
  • 自主设计和创建网站网站建设价格便宜
  • 高手做网站财经资讯网站该怎么做推广
  • 加强农业网站建设青岛全网营销推广
  • 做淘客网站怎么样济南软件公司排名
  • 企业网站优化兴田德润怎么样网站建设建设公司资质要求
  • 如何把网站做跳转浏览器链接地址wordpress 离线更新
  • 乌海学校网站建设wordpress默认主题下载
  • 海兴县做网站如何选网站建设公司
  • asp网站设为首页代码孝仙洪高速公路建设指挥部网站
  • 浦东新区网站开发人才网站建设策划书