#模拟实现

定义监听器,监听器启动的时候初始化定时器

监听器

package com.tcsoft.license.util;import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** 系统启动时的监听类 初始化系统数据* * @author jhoneder* */
public class InitListener implements ServletContextListener {public void contextDestroyed(ServletContextEvent arg0) {// TODO Auto-generated method stub// context销毁时,销毁初始化数据}public void contextInitialized(ServletContextEvent event) {// TODO Auto-generated method stubtry {System.out.println("初始化监听...");goTimer();System.out.println("初始化完毕");} catch (Exception e) {System.out.println("失败:" + e.getMessage());}}private void goTimer() {Timer timmerTask = new Timer();Calendar calEnviron = Calendar.getInstance();// 每天的02:00.am开始执行calEnviron.set(Calendar.HOUR_OF_DAY, 2);calEnviron.set(Calendar.MINUTE, 00);calEnviron.set(Calendar.SECOND, 00);// date为制定时间Date dateSetter = new Date();dateSetter = calEnviron.getTime();// nowDate为当前时间Date nowDateSetter = new Date();// 所得时间差为,距现在待触发时间的间隔long intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();if (intervalEnviron < 0) {calEnviron.add(Calendar.DAY_OF_MONTH, 1);dateSetter = calEnviron.getTime();intervalEnviron = dateSetter.getTime() - nowDateSetter.getTime();}// 每24小时执行一次timmerTask.schedule(new UseTimer(timmerTask), intervalEnviron, 1 * 1000 * 60 * 60 * 24);}
}

定时器

package com.tcsoft.license.util;import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;import com.tcsoft.license.service.ApplicationService;/*** 被调用执行类* * @author Administrator* */
public class UseTimer extends TimerTask {Timer timer = new Timer();String filename;//默认按天String datePattern = "'.'yyyy-MM-dd";SimpleDateFormat sdf;//最大保留日志数量int maxBackupIndex = 7;public UseTimer(){}public UseTimer(Timer timer) {this.timer = timer;}public Timer getTimer() {return timer;}public void setTimer(Timer timer) {this.timer = timer;}/** 被调用具体的方法*/public void run() {System.out.println("扫描日志文件...");init();//删除多余的log4j指定的日志文件deleteOvermuchFile();//删除其他后缀也为datePattern的日志文件deleteLikeDatePatternLogFile();}//删除其他后缀也为datePattern的日志文件public void deleteLikeDatePatternLogFile(){//需要删除的[.日期]结尾的日志文件名String[] fileNamesToDelete = {"localhost_access_log","catalina.out"};for(String fn : fileNamesToDelete){//重新赋值为新的日志文件名this.filename = this.filename.substring(0,this.filename.lastIndexOf("/")+1)+fn;deleteOvermuchFile();}}/*** 删除多余的log4j指定的日志文件*/public void deleteOvermuchFile(){//获取名称为指定filename并且[.日期]结尾的日志文件List<File> logFiles = getLogFiles();//升序排序sortFiles(logFiles);//删除多余的日志文件delete(logFiles);}//读取log4j配置 初始化一些成员变量private void init(){Properties log4jProp = new Properties();try {log4jProp.load(this.getClass().getResourceAsStream("/log4j.properties"));this.filename = log4jProp.getProperty("log4j.appender.logfile.File");String datePatternStr = log4jProp.getProperty("log4j.appender.logfile.DatePattern");if(datePatternStr!=null && !"".equals(datePatternStr)){datePattern = datePatternStr;}sdf = new SimpleDateFormat(datePattern);String mbiStr = log4jProp.getProperty("log4j.appender.logfile.MaxBackupIndex");if(mbiStr!=null && !"".equals(mbiStr)){maxBackupIndex = Integer.parseInt(mbiStr);}String catalinaHome = System.getProperty("catalina.home");if(System.getProperty("os.name").toUpperCase().indexOf("WINDOWS")!=-1){catalinaHome = catalinaHome.replaceAll("\\\\", "/");}filename = filename.replaceAll("\\$\\{catalina.home\\}", catalinaHome);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (NumberFormatException e){System.out.println("maxBackupIndex数字异常!");maxBackupIndex = 7;}}private void delete(List<File> logFiles){if (logFiles.size() > maxBackupIndex) {for (int i = 0;i < logFiles.size() - maxBackupIndex;i++) {logFiles.get(i).delete();System.out.println("删除日志" + logFiles.get(i));}}}private List<File> getLogFiles(){File logfile = new File(filename);//获取日志文件的父目录File logFolder = logfile.getParentFile();//获取logs下的符合要求的日志文件File[] logFiles = logFolder.listFiles(new FileFilter(){@Overridepublic boolean accept(File pathname) {try {//如果是空串 则这个日志文件就是配置里写的OpenLog.log日志文件if (getDateStr(pathname).isEmpty()) {return true;}//截取的后缀字符串能够正常解析 则这个文件就是指定的日志文件加上日期的日志sdf.parse(getDateStr(pathname));return true;} catch (ParseException e) {//出异常了证明不是return false;}}});return Arrays.asList(logFiles);}//按日志文件的后缀日期升序排序private void sortFiles(List<File> fileList) {Collections.sort(fileList, new Comparator<File>() {public int compare(File o1, File o2) {try {if (getDateStr(o1).isEmpty()) {return 1;}Date date1 = sdf.parse(getDateStr(o1));if (getDateStr(o2).isEmpty()) {return -1;}Date date2 = sdf.parse(getDateStr(o2));if (date1.getTime() > date2.getTime()) {return 1;} else if (date1.getTime() < date2.getTime()) {return -1;}} catch (ParseException e) {e.printStackTrace();}return 0;}});}//获取日志文件后缀的时间串private String getDateStr(File file) {if (file == null) {return "null";}return file.getName().replaceAll(new File(filename).getName(), "");}}

##测试实现

按上面的配置设置好之后(系统log4j加上MaxBackupIndex,localhost_access_log文件去掉后缀,catalina.out改成日滚文件)

先看下原来tomcat下日志文件是什么样的

系统配置的OpenLog.log

localhost_access_log

catalina.out


当定时器到了设定时间之后就会执行处理这三种文件的程序,删除多余的文件,删除之后的文件情况

系统配置的OpenLog.log

localhost_access_log

catalina.out

可以看到,这三种文件都只剩下我们在系统log4j里配置的MaxBackupIndex=7份,其余的时间比较早的文件已经被删除了,也就是只剩下时间比较近的日志文件!测试成功!

Log4j配置学习文档之二 处理日滚文件-模拟实现相关推荐

  1. Log4j配置学习文档之二 处理日滚文件-实现原理

    #实现原理 ##处理系统自己log4j定义的日滚日志文件 在系统中使用log4j中的RollingFileAppender和DailyRollingFileAppender可以实现日志文件的滚动,这里 ...

  2. Log4j配置学习文档之三 参考

    log4j配置详解(非常详细) 切分 Tomcat 的 catalina.out 文件,解决日志文件过大的问题 tomcat下catalina.out日志文件分割 Log4j的扩展-支持设置最大日志数 ...

  3. Log4j配置学习文档之一 log4j配置

    #Log4j配置 Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出L ...

  4. 数据建模步骤文档_二维溃坝洪水模拟(五)二维模型建模

    1 前言 本文主要说明案例中水库下游区域HEC-RAS二维建模的过程.文章首先给出建模的基本原则与建模的注意事项,确定了大致的研究区域.其次,整个下游洪水演进区域由单一二维模型模拟,下游存在一条较大的 ...

  5. nginx学习文档之二 配置负载均衡-linux配置负载均衡

    #linux配置负载均衡 linux下配置tomcat负载均衡和windows下是一样的 安装完nginx后直接修改conf下的nginx.conf文件即可 配置文件如下: #user nobody; ...

  6. nginx学习文档之二 配置负载均衡-windows配置负载均衡

    #windows配置负载均衡 nginx+tomcat负载均衡的意思大概如下图: 所有请求先经过nginx服务器,然后由nginx服务器进行转发,将请求根据配置需要分发给指定的tomcat服务器 ## ...

  7. nginx学习文档之二 配置负载均衡-负载均衡发现的问题

    #负载均衡发现的问题 用了nginx负载均衡后,在两台tomcat正常运行的情况下,访问http://localhost 速度非常迅速,通过测试程序也可以看出是得到的负载均衡的效果,但是我们试验性的把 ...

  8. Git学习文档之二 应用总结-svn迁移到git

    ##svn迁移到git 在 Subversion,每个提交者在都在主机上有一个用户名,记录在提交信息中.如果想让这条信息更好的映射到 Git 作者数据里,则需要 从 Subversion 用户名到 G ...

  9. Docker学习文档之二 搭建环境-Linux环境

    linux中docker部署javaweb 和上面widows中的一样,可以使用Dockerfile,然后build成镜像,再在运行时将linux的部署项目的文件夹通过 -v 挂载到镜像容器中. 也可 ...

最新文章

  1. 文本处理相关资料整理
  2. 十四、Redis三种特殊类型之一Geospatial
  3. 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
  4. 用RAM存储器构造能够依次读取各存储单元内容的电路
  5. opencv学习笔记21:直方图和掩膜 原理及其应用
  6. Android之提示android.content.res.Resources$NotFoundException: Resource ID #0x7f08010a
  7. 面试官面试前端_如何面试面试官
  8. fiddler手机端抓包配置
  9. matlab 价格统计,matlab中的金融数据统计
  10. (万里开源)greatdb mysql 8.0以上版本创建用户并授权远程连接
  11. 基于nodejs,tinypng的压缩图片工具
  12. c语言实验作业,C语言实验报告experience_c语言实验报告结果分析
  13. 基于51单片机制作的基础四轮蓝牙小车(含代码)
  14. APP切换到后台时的运行规则以及如何实现后台运行
  15. 人人5功盖世时候,我在支持国产
  16. MFC 高速绘图坐标轴内添加纵向基准线的方法
  17. 多态性(一)——静态多态性
  18. Nginx HTTP 健康检查
  19. 什么是“SCSI”硬盘
  20. Python教程:异或运算符(^)、与运算符()、或运算符(|)、反运算符(~)、右移运算符(>>)、无符号右移运算符(>>>)

热门文章

  1. 14. GD32F103C8T6入门教程-Systick定时器
  2. 【电路】LM293D电机驱动芯片
  3. ip层和4层的接口实现分析
  4. 机器人带陀螺仪走钢丝_一言不合就走钢丝,机器人化身“七变美男子”,萌翻你!...
  5. 统计分组的原则是要体现什么_跨境选品有哪些方法,要遵循什么原则?
  6. 【JUC】第五章 JUC 阻塞队列、线程池
  7. “双击Pycharm无响应”解决方案
  8. CentOS7 iptables安装及操作
  9. 关于DELL服务器如果采购散件,进行服务器升级的相关说明
  10. UVA - 10779 Collectors Problem