Log4j配置学习文档之二 处理日滚文件-模拟实现
2017-04-19 13:56
393 查看
模拟实现
定义监听器,监听器启动的时候初始化定时器监听器
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 stub try { 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(){ @Override public 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配置学习文档之二 处理日滚文件-实现原理
- java:log4j学习(3)-转帖:Log4J 最佳实践之全能配置文件
- 标准C处理类似INI配置文件的键值型文档
- python处理excel文档作为配置文件
- Struts2使用通配符加载配置文件和通配符方法的底层实现学习
- Spring学习笔记(18)----使用Spring配置文件实现事务管理
- java学习笔记7 - Spring mvc 统一异常处理和静态文件的配置
- LOG4J的配置..实现了输出到控制台、文件、回滚文件、发送日志邮件
- mybatis学习笔记--mapper配置文件中大于小于怎么处理
- Tomcat服务器配置文件server.xml的配置解析及Context的配置(网上文档的学习整理)
- log4j配置文件学习
- 标准C处理类似INI配置文件的键值型文档
- ITCAST视频-Spring学习笔记(使用Spring配置文件实现AOP)
- Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度
- Log4j 学习日记 - 手工加载配置文件
- log4j学习记录 log4j配置文件的配置
- Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度
- 学习log4j配置文件
- Tomcat学习之二:tomcat安装、配置及目录文件说明